[ { "hash": "e5d34e23002117c36d4a0e7d3d0da34c22911860", "msg": "cookedm doing test commit", "author": { "name": "cookedm", "email": "cookedm@localhost" }, "committer": { "name": "cookedm", "email": "cookedm@localhost" }, "author_date": "2005-10-11T23:01:16+00:00", "author_timezone": 0, "committer_date": "2005-10-11T23:01:16+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "c4bd04df6dbe6dd5fb1ae81b836fe1ce8bec72ff" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 2, "insertions": 2, "lines": 4, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "TEST_COMMIT", "new_path": "TEST_COMMIT", "filename": "TEST_COMMIT", "extension": "TEST_COMMIT", "change_type": "MODIFY", "diff": "@@ -2,8 +2,8 @@ oliphant: yes\n rkern: yes\n pearu: yes\n fperez: yes\n-chanley: yes \n-cookedm: no\n+chanley: yes\n+cookedm: yes\n swalton: yes\n eric: no\n charris: no\n", "added_lines": 2, "deleted_lines": 2, "source_code": "oliphant: yes\nrkern: yes\npearu: yes\nfperez: yes\nchanley: yes\ncookedm: yes\nswalton: yes\neric: no\ncharris: no\nfonnesbeck: no\nafayolle: no\ndubois: no\n", "source_code_before": "oliphant: yes\nrkern: yes\npearu: yes\nfperez: yes\nchanley: yes \ncookedm: no\nswalton: yes\neric: no\ncharris: no\nfonnesbeck: no\nafayolle: no\ndubois: no\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ "chanley: yes", "cookedm: yes" ], "deleted": [ "chanley: yes", "cookedm: no" ] } } ] }, { "hash": "e8e5a126e12edccbc3e3fa8e614e4c0d2711606b", "msg": "Fixed getting things from scipy.linalg", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T02:34:31+00:00", "author_timezone": 0, "committer_date": "2005-10-12T02:34:31+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e5d34e23002117c36d4a0e7d3d0da34c22911860" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 4, "insertions": 5, "lines": 9, "files": 3, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/base/matrix.py", "new_path": "scipy/base/matrix.py", "filename": "matrix.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -189,7 +189,8 @@ def getH(self):\n return self.transpose()\n \n def getI(self):\n- from scipy.linalg import inv\n+\timport scipy\n+ inv = scipy.linalg.inv\n return matrix(inv(self))\n \n A = property(getA, None, doc=\"base array\")\n", "added_lines": 2, "deleted_lines": 1, "source_code": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=(not arr.flags['NOTSWAPPED']))\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1, self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first inde\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __pow__(self, other):\n if len(shape)!=2 or shape[0]!=shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose(self.conjugate())\n else:\n return self.transpose()\n\n def getI(self):\n\timport scipy\n inv = scipy.linalg.inv\n return matrix(inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "source_code_before": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=(not arr.flags['NOTSWAPPED']))\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1, self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first inde\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __pow__(self, other):\n if len(shape)!=2 or shape[0]!=shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose(self.conjugate())\n else:\n return self.transpose()\n\n def getI(self):\n from scipy.linalg import inv\n return matrix(inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "methods": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 247, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 31, "complexity": 11, "token_count": 200, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 163, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 165, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 168, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 171, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 179, "end_line": 180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 182, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 36, "parameters": [ "self" ], "start_line": 185, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 4, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 191, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 202, "end_line": 224, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 227, "end_line": 261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "methods_before": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 247, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 31, "complexity": 11, "token_count": 200, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 163, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 165, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 168, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 171, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 179, "end_line": 180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 182, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 36, "parameters": [ "self" ], "start_line": 185, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 191, "end_line": 193, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 201, "end_line": 223, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 226, "end_line": 260, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 4, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 191, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 } ], "nloc": 206, "complexity": 72, "token_count": 1444, "diff_parsed": { "added": [ "\timport scipy", " inv = scipy.linalg.inv" ], "deleted": [ " from scipy.linalg import inv" ] } }, { "old_path": "scipy/base/polynomial.py", "new_path": "scipy/base/polynomial.py", "filename": "polynomial.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -15,7 +15,7 @@\n \n def get_linalg_funcs():\n global eigvals, lstsq\n- import scipy.linalg\n+ import scipy\n eigvals = scipy.linalg.eigvals\n lstsq = scipy.linalg.lstsq\n return\n", "added_lines": 1, "deleted_lines": 1, "source_code": "## Automatically adapted for scipy Sep 19, 2005 by convertcode.py\n\nimport numeric\n_nx = numeric\nfrom numeric import *\nfrom scimath import *\n\n\nfrom type_check import isscalar\nfrom twodim_base import diag, vander\nfrom shape_base import hstack, atleast_1d\nfrom function_base import trim_zeros, sort_complex\neigvals = None\nlstsq = None\n\ndef get_linalg_funcs():\n global eigvals, lstsq\n import scipy\n eigvals = scipy.linalg.eigvals\n lstsq = scipy.linalg.lstsq\n return\n\ndef _eigvals(arg):\n try:\n return eigvals(arg)\n except TypeError:\n get_linalg_funcs()\n return eigvals(arg)\n\ndef _lstsq(*args):\n try:\n return lstsq(*args)\n except TypeError:\n get_linalg_funcs()\n return lstsq(*args)\n \n\n__all__ = ['poly','roots','polyint','polyder','polyadd','polysub','polymul',\n 'polydiv','polyval','poly1d','poly1d','polyfit']\n \n\ndef poly(seq_of_zeros):\n \"\"\" Return a sequence representing a polynomial given a sequence of roots.\n\n If the input is a matrix, return the characteristic polynomial.\n \n Example:\n \n >>> b = roots([1,3,1,5,6])\n >>> poly(b)\n array([1., 3., 1., 5., 6.])\n \"\"\"\n seq_of_zeros = atleast_1d(seq_of_zeros) \n sh = shape(seq_of_zeros)\n if len(sh) == 2 and sh[0] == sh[1]:\n seq_of_zeros=_eigvals(seq_of_zeros)\n elif len(sh) ==1:\n pass\n else:\n raise ValueError, \"input must be 1d or square 2d array.\"\n\n if len(seq_of_zeros) == 0:\n return 1.0\n\n a = [1]\n for k in range(len(seq_of_zeros)):\n a = convolve(a,[1, -seq_of_zeros[k]], mode=2)\n \n if a.dtypechar in ['F','D']:\n # if complex roots are all complex conjugates, the roots are real.\n roots = asarray(seq_of_zeros,'D')\n pos_roots = sort_complex(compress(roots.imag > 0,roots))\n neg_roots = conjugate(sort_complex(compress(roots.imag < 0,roots)))\n if (len(pos_roots) == len(neg_roots) and\n alltrue(neg_roots == pos_roots)):\n a = a.real.copy()\n\n return a\n\ndef roots(p):\n \"\"\" Return the roots of the polynomial coefficients in p.\n\n The values in the rank-1 array p are coefficients of a polynomial.\n If the length of p is n+1 then the polynomial is\n p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n]\n \"\"\"\n # If input is scalar, this makes it an array\n p = atleast_1d(p)\n if len(p.shape) != 1:\n raise ValueError,\"Input must be a rank-1 array.\"\n \n # find non-zero array entries\n non_zero = nonzero(ravel(p))\n\n # find the number of trailing zeros -- this is the number of roots at 0.\n trailing_zeros = len(p) - non_zero[-1] - 1\n\n # strip leading and trailing zeros\n p = p[int(non_zero[0]):int(non_zero[-1])+1]\n \n # casting: if incoming array isn't floating point, make it floating point.\n if p.dtypechar not in ['f','d','F','D']:\n p = p.astype('d')\n\n N = len(p)\n if N > 1:\n # build companion matrix and find its eigenvalues (the roots)\n A = diag(ones((N-2,),p.dtypechar),-1)\n A[0,:] = -p[1:] / p[0]\n roots = _eigvals(A)\n else:\n return array([])\n\n # tack any zeros onto the back of the array \n roots = hstack((roots,zeros(trailing_zeros,roots.dtypechar)))\n return roots\n\ndef polyint(p,m=1,k=None):\n \"\"\"Return the mth analytical integral of the polynomial p.\n\n If k is None, then zero-valued constants of integration are used.\n otherwise, k should be a list of length m (or a scalar if m=1) to\n represent the constants of integration to use for each integration\n (starting with k[0])\n \"\"\"\n m = int(m)\n if m < 0:\n raise ValueError, \"Order of integral must be positive (see polyder)\"\n if k is None:\n k = _nx.zeros(m)\n k = atleast_1d(k)\n if len(k) == 1 and m > 1:\n k = k[0]*_nx.ones(m)\n if len(k) < m:\n raise ValueError, \\\n \"k must be a scalar or a rank-1 array of length 1 or >m.\"\n if m == 0:\n return p\n else:\n truepoly = isinstance(p,poly1d)\n p = asarray(p)\n y = _nx.zeros(len(p)+1,'d')\n y[:-1] = p*1.0/_nx.arange(len(p),0,-1)\n y[-1] = k[0] \n val = polyint(y,m-1,k=k[1:])\n if truepoly:\n val = poly1d(val)\n return val\n \ndef polyder(p,m=1):\n \"\"\"Return the mth derivative of the polynomial p.\n \"\"\"\n m = int(m)\n truepoly = isinstance(p,poly1d)\n p = asarray(p)\n n = len(p)-1\n y = p[:-1] * _nx.arange(n,0,-1)\n if m < 0:\n raise ValueError, \"Order of derivative must be positive (see polyint)\"\n if m == 0:\n return p\n else:\n val = polyder(y,m-1)\n if truepoly:\n val = poly1d(val)\n return val\n\ndef polyfit(x,y,N):\n \"\"\"\n\n Do a best fit polynomial of order N of y to x. Return value is a\n vector of polynomial coefficients [pk ... p1 p0]. Eg, for N=2\n\n p2*x0^2 + p1*x0 + p0 = y1\n p2*x1^2 + p1*x1 + p0 = y1\n p2*x2^2 + p1*x2 + p0 = y2\n .....\n p2*xk^2 + p1*xk + p0 = yk\n\n\n Method: if X is a the Vandermonde Matrix computed from x (see\n http://mathworld.wolfram.com/VandermondeMatrix.html), then the\n polynomial least squares solution is given by the 'p' in\n\n X*p = y\n\n where X is a len(x) x N+1 matrix, p is a N+1 length vector, and y\n is a len(x) x 1 vector\n\n This equation can be solved as\n\n p = (XT*X)^-1 * XT * y\n\n where XT is the transpose of X and -1 denotes the inverse.\n\n For more info, see\n http://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html,\n but note that the k's and n's in the superscripts and subscripts\n on that page. The linear algebra is correct, however.\n\n See also polyval\n\n \"\"\"\n x = asarray(x)+0.\n y = asarray(y)+0.\n y = reshape(y, (len(y),1))\n X = vander(x, N+1)\n c,resids,rank,s = _lstsq(X,y)\n c.shape = (N+1,)\n return c\n\n\n\ndef polyval(p,x):\n \"\"\"Evaluate the polynomial p at x. If x is a polynomial then composition.\n\n Description:\n\n If p is of length N, this function returns the value:\n p[0]*(x**N-1) + p[1]*(x**N-2) + ... + p[N-2]*x + p[N-1]\n\n x can be a sequence and p(x) will be returned for all elements of x.\n or x can be another polynomial and the composite polynomial p(x) will be\n returned.\n\n Notice: This can produce inaccurate results for polynomials with significant\n variability. Use carefully.\n \"\"\"\n p = asarray(p)\n if isinstance(x,poly1d):\n y = 0\n else:\n x = asarray(x)\n y = _nx.zeros(x.shape,x.dtypechar)\n for i in range(len(p)):\n y = x * y + p[i]\n return y\n\ndef polyadd(a1,a2):\n \"\"\"Adds two polynomials represented as sequences\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n a1,a2 = map(atleast_1d,(a1,a2))\n diff = len(a2) - len(a1)\n if diff == 0:\n return a1 + a2\n elif diff > 0:\n zr = _nx.zeros(diff)\n val = _nx.concatenate((zr,a1)) + a2\n else:\n zr = _nx.zeros(abs(diff))\n val = a1 + _nx.concatenate((zr,a2))\n if truepoly:\n val = poly1d(val)\n return val\n\ndef polysub(a1,a2):\n \"\"\"Subtracts two polynomials represented as sequences\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n a1,a2 = map(atleast_1d,(a1,a2))\n diff = len(a2) - len(a1)\n if diff == 0:\n return a1 - a2\n elif diff > 0:\n zr = _nx.zeros(diff)\n val = _nx.concatenate((zr,a1)) - a2\n else:\n zr = _nx.zeros(abs(diff))\n val = a1 - _nx.concatenate((zr,a2))\n if truepoly:\n val = poly1d(val)\n return val\n\n\ndef polymul(a1,a2):\n \"\"\"Multiplies two polynomials represented as sequences.\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n val = _nx.convolve(a1,a2)\n if truepoly:\n val = poly1d(val)\n return val\n\n\ndef deconvolve(signal, divisor):\n \"\"\"Deconvolves divisor out of signal. Requires scipy.signal library\n \"\"\"\n try:\n import scipy.signal\n except:\n print \"You need scipy.signal to use this function.\"\n num = atleast_1d(signal)\n den = atleast_1d(divisor)\n N = len(num)\n D = len(den)\n if D > N:\n quot = [];\n rem = num;\n else:\n input = _nx.ones(N-D+1,_nx.Float)\n input[1:] = 0\n quot = scipy.signal.lfilter(num, den, input)\n rem = num - _nx.convolve(den,quot,mode=2)\n return quot, rem\n\ndef polydiv(a1,a2):\n \"\"\"Computes q and r polynomials so that a1(s) = q(s)*a2(s) + r(s)\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n q, r = deconvolve(a1,a2)\n while _nx.allclose(r[0], 0, rtol=1e-14) and (r.shape[-1] > 1):\n r = r[1:]\n if truepoly:\n q, r = map(poly1d,(q,r))\n return q, r\n\n\nimport re\n_poly_mat = re.compile(r\"[*][*]([0-9]*)\")\ndef _raise_power(astr, wrap=70):\n n = 0\n line1 = ''\n line2 = ''\n output = ' '\n while 1:\n mat = _poly_mat.search(astr,n)\n if mat is None:\n break\n span = mat.span()\n power = mat.groups()[0]\n partstr = astr[n:span[0]]\n n = span[1]\n toadd2 = partstr + ' '*(len(power)-1)\n toadd1 = ' '*(len(partstr)-1) + power\n if ((len(line2)+len(toadd2) > wrap) or \\\n (len(line1)+len(toadd1) > wrap)):\n output += line1 + \"\\n\" + line2 + \"\\n \"\n line1 = toadd1\n line2 = toadd2\n else: \n line2 += partstr + ' '*(len(power)-1)\n line1 += ' '*(len(partstr)-1) + power\n output += line1 + \"\\n\" + line2\n return output + astr[n:]\n \n \nclass poly1d:\n \"\"\"A one-dimensional polynomial class.\n\n p = poly1d([1,2,3]) constructs the polynomial x**2 + 2 x + 3\n\n p(0.5) evaluates the polynomial at the location\n p.r is a list of roots\n p.c is the coefficient array [1,2,3]\n p.order is the polynomial order (after leading zeros in p.c are removed)\n p[k] is the coefficient on the kth power of x (backwards from\n sequencing the coefficient array.\n\n polynomials can be added, substracted, multplied and divided (returns\n quotient and remainder).\n asarray(p) will also give the coefficient array, so polynomials can\n be used in all functions that accept arrays.\n \"\"\"\n def __init__(self, c_or_r, r=0):\n if isinstance(c_or_r,poly1d):\n for key in c_or_r.__dict__.keys():\n self.__dict__[key] = c_or_r.__dict__[key]\n return\n if r:\n c_or_r = poly(c_or_r)\n c_or_r = atleast_1d(c_or_r)\n if len(c_or_r.shape) > 1:\n raise ValueError, \"Polynomial must be 1d only.\"\n c_or_r = trim_zeros(c_or_r, trim='f')\n if len(c_or_r) == 0:\n c_or_r = _nx.array([0])\n self.__dict__['coeffs'] = c_or_r\n self.__dict__['order'] = len(c_or_r) - 1\n\n def __array__(self,t=None):\n if t:\n return asarray(self.coeffs,t)\n else:\n return asarray(self.coeffs)\n\n def __coerce__(self,other):\n return None\n \n def __repr__(self):\n vals = repr(self.coeffs)\n vals = vals[6:-1]\n return \"poly1d(%s)\" % vals\n\n def __len__(self):\n return self.order\n\n def __str__(self):\n N = self.order\n thestr = \"0\"\n for k in range(len(self.coeffs)):\n coefstr ='%.4g' % abs(self.coeffs[k])\n if coefstr[-4:] == '0000':\n coefstr = coefstr[:-5]\n power = (N-k)\n if power == 0:\n if coefstr != '0':\n newstr = '%s' % (coefstr,)\n else:\n if k == 0:\n newstr = '0'\n else:\n newstr = ''\n elif power == 1:\n if coefstr == '0':\n newstr = ''\n elif coefstr == 'b':\n newstr = 'x'\n else: \n newstr = '%s x' % (coefstr,)\n else:\n if coefstr == '0':\n newstr = ''\n elif coefstr == 'b':\n newstr = 'x**%d' % (power,)\n else: \n newstr = '%s x**%d' % (coefstr, power)\n\n if k > 0:\n if newstr != '':\n if self.coeffs[k] < 0:\n thestr = \"%s - %s\" % (thestr, newstr)\n else:\n thestr = \"%s + %s\" % (thestr, newstr)\n elif (k == 0) and (newstr != '') and (self.coeffs[k] < 0):\n thestr = \"-%s\" % (newstr,)\n else:\n thestr = newstr\n return _raise_power(thestr)\n \n\n def __call__(self, val):\n return polyval(self.coeffs, val)\n\n def __mul__(self, other):\n if isscalar(other):\n return poly1d(self.coeffs * other)\n else:\n other = poly1d(other)\n return poly1d(polymul(self.coeffs, other.coeffs))\n\n def __rmul__(self, other):\n if isscalar(other):\n return poly1d(other * self.coeffs)\n else:\n other = poly1d(other)\n return poly1d(polymul(self.coeffs, other.coeffs)) \n \n def __add__(self, other):\n other = poly1d(other)\n return poly1d(polyadd(self.coeffs, other.coeffs)) \n \n def __radd__(self, other):\n other = poly1d(other)\n return poly1d(polyadd(self.coeffs, other.coeffs))\n\n def __pow__(self, val):\n if not isscalar(val) or int(val) != val or val < 0:\n raise ValueError, \"Power to non-negative integers only.\"\n res = [1]\n for k in range(val):\n res = polymul(self.coeffs, res)\n return poly1d(res)\n\n def __sub__(self, other):\n other = poly1d(other)\n return poly1d(polysub(self.coeffs, other.coeffs))\n\n def __rsub__(self, other):\n other = poly1d(other)\n return poly1d(polysub(other.coeffs, self.coeffs))\n\n def __div__(self, other):\n if isscalar(other):\n return poly1d(self.coeffs/other)\n else:\n other = poly1d(other)\n return map(poly1d,polydiv(self.coeffs, other.coeffs))\n\n def __rdiv__(self, other):\n if isscalar(other):\n return poly1d(other/self.coeffs)\n else:\n other = poly1d(other)\n return map(poly1d,polydiv(other.coeffs, self.coeffs))\n\n def __setattr__(self, key, val):\n raise ValueError, \"Attributes cannot be changed this way.\"\n\n def __getattr__(self, key):\n if key in ['r','roots']:\n return roots(self.coeffs)\n elif key in ['c','coef','coefficients']:\n return self.coeffs\n elif key in ['o']:\n return self.order\n else:\n return self.__dict__[key]\n \n def __getitem__(self, val):\n ind = self.order - val\n if val > self.order:\n return 0\n if val < 0:\n return 0\n return self.coeffs[ind]\n\n def __setitem__(self, key, val):\n ind = self.order - key\n if key < 0:\n raise ValueError, \"Does not support negative powers.\"\n if key > self.order:\n zr = _nx.zeros(key-self.order,self.coeffs.dtypechar)\n self.__dict__['coeffs'] = _nx.concatenate((zr,self.coeffs))\n self.__dict__['order'] = key\n ind = 0\n self.__dict__['coeffs'][ind] = val\n return\n\n def integ(self, m=1, k=0):\n return poly1d(polyint(self.coeffs,m=m,k=k))\n\n def deriv(self, m=1):\n return poly1d(polyder(self.coeffs,m=m))\n", "source_code_before": "## Automatically adapted for scipy Sep 19, 2005 by convertcode.py\n\nimport numeric\n_nx = numeric\nfrom numeric import *\nfrom scimath import *\n\n\nfrom type_check import isscalar\nfrom twodim_base import diag, vander\nfrom shape_base import hstack, atleast_1d\nfrom function_base import trim_zeros, sort_complex\neigvals = None\nlstsq = None\n\ndef get_linalg_funcs():\n global eigvals, lstsq\n import scipy.linalg\n eigvals = scipy.linalg.eigvals\n lstsq = scipy.linalg.lstsq\n return\n\ndef _eigvals(arg):\n try:\n return eigvals(arg)\n except TypeError:\n get_linalg_funcs()\n return eigvals(arg)\n\ndef _lstsq(*args):\n try:\n return lstsq(*args)\n except TypeError:\n get_linalg_funcs()\n return lstsq(*args)\n \n\n__all__ = ['poly','roots','polyint','polyder','polyadd','polysub','polymul',\n 'polydiv','polyval','poly1d','poly1d','polyfit']\n \n\ndef poly(seq_of_zeros):\n \"\"\" Return a sequence representing a polynomial given a sequence of roots.\n\n If the input is a matrix, return the characteristic polynomial.\n \n Example:\n \n >>> b = roots([1,3,1,5,6])\n >>> poly(b)\n array([1., 3., 1., 5., 6.])\n \"\"\"\n seq_of_zeros = atleast_1d(seq_of_zeros) \n sh = shape(seq_of_zeros)\n if len(sh) == 2 and sh[0] == sh[1]:\n seq_of_zeros=_eigvals(seq_of_zeros)\n elif len(sh) ==1:\n pass\n else:\n raise ValueError, \"input must be 1d or square 2d array.\"\n\n if len(seq_of_zeros) == 0:\n return 1.0\n\n a = [1]\n for k in range(len(seq_of_zeros)):\n a = convolve(a,[1, -seq_of_zeros[k]], mode=2)\n \n if a.dtypechar in ['F','D']:\n # if complex roots are all complex conjugates, the roots are real.\n roots = asarray(seq_of_zeros,'D')\n pos_roots = sort_complex(compress(roots.imag > 0,roots))\n neg_roots = conjugate(sort_complex(compress(roots.imag < 0,roots)))\n if (len(pos_roots) == len(neg_roots) and\n alltrue(neg_roots == pos_roots)):\n a = a.real.copy()\n\n return a\n\ndef roots(p):\n \"\"\" Return the roots of the polynomial coefficients in p.\n\n The values in the rank-1 array p are coefficients of a polynomial.\n If the length of p is n+1 then the polynomial is\n p[0] * x**n + p[1] * x**(n-1) + ... + p[n-1]*x + p[n]\n \"\"\"\n # If input is scalar, this makes it an array\n p = atleast_1d(p)\n if len(p.shape) != 1:\n raise ValueError,\"Input must be a rank-1 array.\"\n \n # find non-zero array entries\n non_zero = nonzero(ravel(p))\n\n # find the number of trailing zeros -- this is the number of roots at 0.\n trailing_zeros = len(p) - non_zero[-1] - 1\n\n # strip leading and trailing zeros\n p = p[int(non_zero[0]):int(non_zero[-1])+1]\n \n # casting: if incoming array isn't floating point, make it floating point.\n if p.dtypechar not in ['f','d','F','D']:\n p = p.astype('d')\n\n N = len(p)\n if N > 1:\n # build companion matrix and find its eigenvalues (the roots)\n A = diag(ones((N-2,),p.dtypechar),-1)\n A[0,:] = -p[1:] / p[0]\n roots = _eigvals(A)\n else:\n return array([])\n\n # tack any zeros onto the back of the array \n roots = hstack((roots,zeros(trailing_zeros,roots.dtypechar)))\n return roots\n\ndef polyint(p,m=1,k=None):\n \"\"\"Return the mth analytical integral of the polynomial p.\n\n If k is None, then zero-valued constants of integration are used.\n otherwise, k should be a list of length m (or a scalar if m=1) to\n represent the constants of integration to use for each integration\n (starting with k[0])\n \"\"\"\n m = int(m)\n if m < 0:\n raise ValueError, \"Order of integral must be positive (see polyder)\"\n if k is None:\n k = _nx.zeros(m)\n k = atleast_1d(k)\n if len(k) == 1 and m > 1:\n k = k[0]*_nx.ones(m)\n if len(k) < m:\n raise ValueError, \\\n \"k must be a scalar or a rank-1 array of length 1 or >m.\"\n if m == 0:\n return p\n else:\n truepoly = isinstance(p,poly1d)\n p = asarray(p)\n y = _nx.zeros(len(p)+1,'d')\n y[:-1] = p*1.0/_nx.arange(len(p),0,-1)\n y[-1] = k[0] \n val = polyint(y,m-1,k=k[1:])\n if truepoly:\n val = poly1d(val)\n return val\n \ndef polyder(p,m=1):\n \"\"\"Return the mth derivative of the polynomial p.\n \"\"\"\n m = int(m)\n truepoly = isinstance(p,poly1d)\n p = asarray(p)\n n = len(p)-1\n y = p[:-1] * _nx.arange(n,0,-1)\n if m < 0:\n raise ValueError, \"Order of derivative must be positive (see polyint)\"\n if m == 0:\n return p\n else:\n val = polyder(y,m-1)\n if truepoly:\n val = poly1d(val)\n return val\n\ndef polyfit(x,y,N):\n \"\"\"\n\n Do a best fit polynomial of order N of y to x. Return value is a\n vector of polynomial coefficients [pk ... p1 p0]. Eg, for N=2\n\n p2*x0^2 + p1*x0 + p0 = y1\n p2*x1^2 + p1*x1 + p0 = y1\n p2*x2^2 + p1*x2 + p0 = y2\n .....\n p2*xk^2 + p1*xk + p0 = yk\n\n\n Method: if X is a the Vandermonde Matrix computed from x (see\n http://mathworld.wolfram.com/VandermondeMatrix.html), then the\n polynomial least squares solution is given by the 'p' in\n\n X*p = y\n\n where X is a len(x) x N+1 matrix, p is a N+1 length vector, and y\n is a len(x) x 1 vector\n\n This equation can be solved as\n\n p = (XT*X)^-1 * XT * y\n\n where XT is the transpose of X and -1 denotes the inverse.\n\n For more info, see\n http://mathworld.wolfram.com/LeastSquaresFittingPolynomial.html,\n but note that the k's and n's in the superscripts and subscripts\n on that page. The linear algebra is correct, however.\n\n See also polyval\n\n \"\"\"\n x = asarray(x)+0.\n y = asarray(y)+0.\n y = reshape(y, (len(y),1))\n X = vander(x, N+1)\n c,resids,rank,s = _lstsq(X,y)\n c.shape = (N+1,)\n return c\n\n\n\ndef polyval(p,x):\n \"\"\"Evaluate the polynomial p at x. If x is a polynomial then composition.\n\n Description:\n\n If p is of length N, this function returns the value:\n p[0]*(x**N-1) + p[1]*(x**N-2) + ... + p[N-2]*x + p[N-1]\n\n x can be a sequence and p(x) will be returned for all elements of x.\n or x can be another polynomial and the composite polynomial p(x) will be\n returned.\n\n Notice: This can produce inaccurate results for polynomials with significant\n variability. Use carefully.\n \"\"\"\n p = asarray(p)\n if isinstance(x,poly1d):\n y = 0\n else:\n x = asarray(x)\n y = _nx.zeros(x.shape,x.dtypechar)\n for i in range(len(p)):\n y = x * y + p[i]\n return y\n\ndef polyadd(a1,a2):\n \"\"\"Adds two polynomials represented as sequences\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n a1,a2 = map(atleast_1d,(a1,a2))\n diff = len(a2) - len(a1)\n if diff == 0:\n return a1 + a2\n elif diff > 0:\n zr = _nx.zeros(diff)\n val = _nx.concatenate((zr,a1)) + a2\n else:\n zr = _nx.zeros(abs(diff))\n val = a1 + _nx.concatenate((zr,a2))\n if truepoly:\n val = poly1d(val)\n return val\n\ndef polysub(a1,a2):\n \"\"\"Subtracts two polynomials represented as sequences\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n a1,a2 = map(atleast_1d,(a1,a2))\n diff = len(a2) - len(a1)\n if diff == 0:\n return a1 - a2\n elif diff > 0:\n zr = _nx.zeros(diff)\n val = _nx.concatenate((zr,a1)) - a2\n else:\n zr = _nx.zeros(abs(diff))\n val = a1 - _nx.concatenate((zr,a2))\n if truepoly:\n val = poly1d(val)\n return val\n\n\ndef polymul(a1,a2):\n \"\"\"Multiplies two polynomials represented as sequences.\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n val = _nx.convolve(a1,a2)\n if truepoly:\n val = poly1d(val)\n return val\n\n\ndef deconvolve(signal, divisor):\n \"\"\"Deconvolves divisor out of signal. Requires scipy.signal library\n \"\"\"\n try:\n import scipy.signal\n except:\n print \"You need scipy.signal to use this function.\"\n num = atleast_1d(signal)\n den = atleast_1d(divisor)\n N = len(num)\n D = len(den)\n if D > N:\n quot = [];\n rem = num;\n else:\n input = _nx.ones(N-D+1,_nx.Float)\n input[1:] = 0\n quot = scipy.signal.lfilter(num, den, input)\n rem = num - _nx.convolve(den,quot,mode=2)\n return quot, rem\n\ndef polydiv(a1,a2):\n \"\"\"Computes q and r polynomials so that a1(s) = q(s)*a2(s) + r(s)\n \"\"\"\n truepoly = (isinstance(a1,poly1d) or isinstance(a2,poly1d))\n q, r = deconvolve(a1,a2)\n while _nx.allclose(r[0], 0, rtol=1e-14) and (r.shape[-1] > 1):\n r = r[1:]\n if truepoly:\n q, r = map(poly1d,(q,r))\n return q, r\n\n\nimport re\n_poly_mat = re.compile(r\"[*][*]([0-9]*)\")\ndef _raise_power(astr, wrap=70):\n n = 0\n line1 = ''\n line2 = ''\n output = ' '\n while 1:\n mat = _poly_mat.search(astr,n)\n if mat is None:\n break\n span = mat.span()\n power = mat.groups()[0]\n partstr = astr[n:span[0]]\n n = span[1]\n toadd2 = partstr + ' '*(len(power)-1)\n toadd1 = ' '*(len(partstr)-1) + power\n if ((len(line2)+len(toadd2) > wrap) or \\\n (len(line1)+len(toadd1) > wrap)):\n output += line1 + \"\\n\" + line2 + \"\\n \"\n line1 = toadd1\n line2 = toadd2\n else: \n line2 += partstr + ' '*(len(power)-1)\n line1 += ' '*(len(partstr)-1) + power\n output += line1 + \"\\n\" + line2\n return output + astr[n:]\n \n \nclass poly1d:\n \"\"\"A one-dimensional polynomial class.\n\n p = poly1d([1,2,3]) constructs the polynomial x**2 + 2 x + 3\n\n p(0.5) evaluates the polynomial at the location\n p.r is a list of roots\n p.c is the coefficient array [1,2,3]\n p.order is the polynomial order (after leading zeros in p.c are removed)\n p[k] is the coefficient on the kth power of x (backwards from\n sequencing the coefficient array.\n\n polynomials can be added, substracted, multplied and divided (returns\n quotient and remainder).\n asarray(p) will also give the coefficient array, so polynomials can\n be used in all functions that accept arrays.\n \"\"\"\n def __init__(self, c_or_r, r=0):\n if isinstance(c_or_r,poly1d):\n for key in c_or_r.__dict__.keys():\n self.__dict__[key] = c_or_r.__dict__[key]\n return\n if r:\n c_or_r = poly(c_or_r)\n c_or_r = atleast_1d(c_or_r)\n if len(c_or_r.shape) > 1:\n raise ValueError, \"Polynomial must be 1d only.\"\n c_or_r = trim_zeros(c_or_r, trim='f')\n if len(c_or_r) == 0:\n c_or_r = _nx.array([0])\n self.__dict__['coeffs'] = c_or_r\n self.__dict__['order'] = len(c_or_r) - 1\n\n def __array__(self,t=None):\n if t:\n return asarray(self.coeffs,t)\n else:\n return asarray(self.coeffs)\n\n def __coerce__(self,other):\n return None\n \n def __repr__(self):\n vals = repr(self.coeffs)\n vals = vals[6:-1]\n return \"poly1d(%s)\" % vals\n\n def __len__(self):\n return self.order\n\n def __str__(self):\n N = self.order\n thestr = \"0\"\n for k in range(len(self.coeffs)):\n coefstr ='%.4g' % abs(self.coeffs[k])\n if coefstr[-4:] == '0000':\n coefstr = coefstr[:-5]\n power = (N-k)\n if power == 0:\n if coefstr != '0':\n newstr = '%s' % (coefstr,)\n else:\n if k == 0:\n newstr = '0'\n else:\n newstr = ''\n elif power == 1:\n if coefstr == '0':\n newstr = ''\n elif coefstr == 'b':\n newstr = 'x'\n else: \n newstr = '%s x' % (coefstr,)\n else:\n if coefstr == '0':\n newstr = ''\n elif coefstr == 'b':\n newstr = 'x**%d' % (power,)\n else: \n newstr = '%s x**%d' % (coefstr, power)\n\n if k > 0:\n if newstr != '':\n if self.coeffs[k] < 0:\n thestr = \"%s - %s\" % (thestr, newstr)\n else:\n thestr = \"%s + %s\" % (thestr, newstr)\n elif (k == 0) and (newstr != '') and (self.coeffs[k] < 0):\n thestr = \"-%s\" % (newstr,)\n else:\n thestr = newstr\n return _raise_power(thestr)\n \n\n def __call__(self, val):\n return polyval(self.coeffs, val)\n\n def __mul__(self, other):\n if isscalar(other):\n return poly1d(self.coeffs * other)\n else:\n other = poly1d(other)\n return poly1d(polymul(self.coeffs, other.coeffs))\n\n def __rmul__(self, other):\n if isscalar(other):\n return poly1d(other * self.coeffs)\n else:\n other = poly1d(other)\n return poly1d(polymul(self.coeffs, other.coeffs)) \n \n def __add__(self, other):\n other = poly1d(other)\n return poly1d(polyadd(self.coeffs, other.coeffs)) \n \n def __radd__(self, other):\n other = poly1d(other)\n return poly1d(polyadd(self.coeffs, other.coeffs))\n\n def __pow__(self, val):\n if not isscalar(val) or int(val) != val or val < 0:\n raise ValueError, \"Power to non-negative integers only.\"\n res = [1]\n for k in range(val):\n res = polymul(self.coeffs, res)\n return poly1d(res)\n\n def __sub__(self, other):\n other = poly1d(other)\n return poly1d(polysub(self.coeffs, other.coeffs))\n\n def __rsub__(self, other):\n other = poly1d(other)\n return poly1d(polysub(other.coeffs, self.coeffs))\n\n def __div__(self, other):\n if isscalar(other):\n return poly1d(self.coeffs/other)\n else:\n other = poly1d(other)\n return map(poly1d,polydiv(self.coeffs, other.coeffs))\n\n def __rdiv__(self, other):\n if isscalar(other):\n return poly1d(other/self.coeffs)\n else:\n other = poly1d(other)\n return map(poly1d,polydiv(other.coeffs, self.coeffs))\n\n def __setattr__(self, key, val):\n raise ValueError, \"Attributes cannot be changed this way.\"\n\n def __getattr__(self, key):\n if key in ['r','roots']:\n return roots(self.coeffs)\n elif key in ['c','coef','coefficients']:\n return self.coeffs\n elif key in ['o']:\n return self.order\n else:\n return self.__dict__[key]\n \n def __getitem__(self, val):\n ind = self.order - val\n if val > self.order:\n return 0\n if val < 0:\n return 0\n return self.coeffs[ind]\n\n def __setitem__(self, key, val):\n ind = self.order - key\n if key < 0:\n raise ValueError, \"Does not support negative powers.\"\n if key > self.order:\n zr = _nx.zeros(key-self.order,self.coeffs.dtypechar)\n self.__dict__['coeffs'] = _nx.concatenate((zr,self.coeffs))\n self.__dict__['order'] = key\n ind = 0\n self.__dict__['coeffs'][ind] = val\n return\n\n def integ(self, m=1, k=0):\n return poly1d(polyint(self.coeffs,m=m,k=k))\n\n def deriv(self, m=1):\n return poly1d(polyder(self.coeffs,m=m))\n", "methods": [ { "name": "get_linalg_funcs", "long_name": "get_linalg_funcs( )", "filename": "polynomial.py", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [], "start_line": 16, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "_eigvals", "long_name": "_eigvals( arg )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 23, "parameters": [ "arg" ], "start_line": 23, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "_lstsq", "long_name": "_lstsq( * args )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 26, "parameters": [ "args" ], "start_line": 30, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "poly", "long_name": "poly( seq_of_zeros )", "filename": "polynomial.py", "nloc": 22, "complexity": 9, "token_count": 188, "parameters": [ "seq_of_zeros" ], "start_line": 42, "end_line": 78, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "roots", "long_name": "roots( p )", "filename": "polynomial.py", "nloc": 18, "complexity": 4, "token_count": 179, "parameters": [ "p" ], "start_line": 80, "end_line": 116, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "polyint", "long_name": "polyint( p , m = 1 , k = None )", "filename": "polynomial.py", "nloc": 24, "complexity": 8, "token_count": 190, "parameters": [ "p", "m", "k" ], "start_line": 118, "end_line": 148, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "polyder", "long_name": "polyder( p , m = 1 )", "filename": "polynomial.py", "nloc": 15, "complexity": 4, "token_count": 97, "parameters": [ "p", "m" ], "start_line": 150, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "polyfit", "long_name": "polyfit( x , y , N )", "filename": "polynomial.py", "nloc": 8, "complexity": 1, "token_count": 79, "parameters": [ "x", "y", "N" ], "start_line": 168, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "polyval", "long_name": "polyval( p , x )", "filename": "polynomial.py", "nloc": 10, "complexity": 3, "token_count": 70, "parameters": [ "p", "x" ], "start_line": 214, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "polyadd", "long_name": "polyadd( a1 , a2 )", "filename": "polynomial.py", "nloc": 15, "complexity": 5, "token_count": 124, "parameters": [ "a1", "a2" ], "start_line": 239, "end_line": 255, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "polysub", "long_name": "polysub( a1 , a2 )", "filename": "polynomial.py", "nloc": 15, "complexity": 5, "token_count": 124, "parameters": [ "a1", "a2" ], "start_line": 257, "end_line": 273, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "polymul", "long_name": "polymul( a1 , a2 )", "filename": "polynomial.py", "nloc": 6, "complexity": 3, "token_count": 46, "parameters": [ "a1", "a2" ], "start_line": 276, "end_line": 283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "deconvolve", "long_name": "deconvolve( signal , divisor )", "filename": "polynomial.py", "nloc": 18, "complexity": 3, "token_count": 115, "parameters": [ "signal", "divisor" ], "start_line": 286, "end_line": 305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "polydiv", "long_name": "polydiv( a1 , a2 )", "filename": "polynomial.py", "nloc": 8, "complexity": 5, "token_count": 94, "parameters": [ "a1", "a2" ], "start_line": 307, "end_line": 316, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_raise_power", "long_name": "_raise_power( astr , wrap = 70 )", "filename": "polynomial.py", "nloc": 25, "complexity": 5, "token_count": 194, "parameters": [ "astr", "wrap" ], "start_line": 321, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , c_or_r , r = 0 )", "filename": "polynomial.py", "nloc": 15, "complexity": 6, "token_count": 122, "parameters": [ "self", "c_or_r", "r" ], "start_line": 365, "end_line": 379, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "__array__", "long_name": "__array__( self , t = None )", "filename": "polynomial.py", "nloc": 5, "complexity": 2, "token_count": 30, "parameters": [ "self", "t" ], "start_line": 381, "end_line": 385, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__coerce__", "long_name": "__coerce__( self , other )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 387, "end_line": 388, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "polynomial.py", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 390, "end_line": 393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 395, "end_line": 396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "polynomial.py", "nloc": 41, "complexity": 17, "token_count": 244, "parameters": [ "self" ], "start_line": 398, "end_line": 439, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 42, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , val )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 16, "parameters": [ "self", "val" ], "start_line": 442, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 44, "parameters": [ "self", "other" ], "start_line": 445, "end_line": 450, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 44, "parameters": [ "self", "other" ], "start_line": 452, "end_line": 457, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__add__", "long_name": "__add__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 459, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__radd__", "long_name": "__radd__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 463, "end_line": 465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , val )", "filename": "polynomial.py", "nloc": 7, "complexity": 5, "token_count": 57, "parameters": [ "self", "val" ], "start_line": 467, "end_line": 473, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__sub__", "long_name": "__sub__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__rsub__", "long_name": "__rsub__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 479, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__div__", "long_name": "__div__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 46, "parameters": [ "self", "other" ], "start_line": 483, "end_line": 488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__rdiv__", "long_name": "__rdiv__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 46, "parameters": [ "self", "other" ], "start_line": 490, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__setattr__", "long_name": "__setattr__( self , key , val )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self", "key", "val" ], "start_line": 497, "end_line": 498, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , key )", "filename": "polynomial.py", "nloc": 9, "complexity": 4, "token_count": 58, "parameters": [ "self", "key" ], "start_line": 500, "end_line": 508, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , val )", "filename": "polynomial.py", "nloc": 7, "complexity": 3, "token_count": 37, "parameters": [ "self", "val" ], "start_line": 510, "end_line": 516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__setitem__", "long_name": "__setitem__( self , key , val )", "filename": "polynomial.py", "nloc": 11, "complexity": 3, "token_count": 92, "parameters": [ "self", "key", "val" ], "start_line": 518, "end_line": 528, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "integ", "long_name": "integ( self , m = 1 , k = 0 )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 31, "parameters": [ "self", "m", "k" ], "start_line": 530, "end_line": 531, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "deriv", "long_name": "deriv( self , m = 1 )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "self", "m" ], "start_line": 533, "end_line": 534, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_linalg_funcs", "long_name": "get_linalg_funcs( )", "filename": "polynomial.py", "nloc": 6, "complexity": 1, "token_count": 27, "parameters": [], "start_line": 16, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "_eigvals", "long_name": "_eigvals( arg )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 23, "parameters": [ "arg" ], "start_line": 23, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "_lstsq", "long_name": "_lstsq( * args )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 26, "parameters": [ "args" ], "start_line": 30, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "poly", "long_name": "poly( seq_of_zeros )", "filename": "polynomial.py", "nloc": 22, "complexity": 9, "token_count": 188, "parameters": [ "seq_of_zeros" ], "start_line": 42, "end_line": 78, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "roots", "long_name": "roots( p )", "filename": "polynomial.py", "nloc": 18, "complexity": 4, "token_count": 179, "parameters": [ "p" ], "start_line": 80, "end_line": 116, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "polyint", "long_name": "polyint( p , m = 1 , k = None )", "filename": "polynomial.py", "nloc": 24, "complexity": 8, "token_count": 190, "parameters": [ "p", "m", "k" ], "start_line": 118, "end_line": 148, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "polyder", "long_name": "polyder( p , m = 1 )", "filename": "polynomial.py", "nloc": 15, "complexity": 4, "token_count": 97, "parameters": [ "p", "m" ], "start_line": 150, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "polyfit", "long_name": "polyfit( x , y , N )", "filename": "polynomial.py", "nloc": 8, "complexity": 1, "token_count": 79, "parameters": [ "x", "y", "N" ], "start_line": 168, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "polyval", "long_name": "polyval( p , x )", "filename": "polynomial.py", "nloc": 10, "complexity": 3, "token_count": 70, "parameters": [ "p", "x" ], "start_line": 214, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "polyadd", "long_name": "polyadd( a1 , a2 )", "filename": "polynomial.py", "nloc": 15, "complexity": 5, "token_count": 124, "parameters": [ "a1", "a2" ], "start_line": 239, "end_line": 255, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "polysub", "long_name": "polysub( a1 , a2 )", "filename": "polynomial.py", "nloc": 15, "complexity": 5, "token_count": 124, "parameters": [ "a1", "a2" ], "start_line": 257, "end_line": 273, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "polymul", "long_name": "polymul( a1 , a2 )", "filename": "polynomial.py", "nloc": 6, "complexity": 3, "token_count": 46, "parameters": [ "a1", "a2" ], "start_line": 276, "end_line": 283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "deconvolve", "long_name": "deconvolve( signal , divisor )", "filename": "polynomial.py", "nloc": 18, "complexity": 3, "token_count": 115, "parameters": [ "signal", "divisor" ], "start_line": 286, "end_line": 305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "polydiv", "long_name": "polydiv( a1 , a2 )", "filename": "polynomial.py", "nloc": 8, "complexity": 5, "token_count": 94, "parameters": [ "a1", "a2" ], "start_line": 307, "end_line": 316, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_raise_power", "long_name": "_raise_power( astr , wrap = 70 )", "filename": "polynomial.py", "nloc": 25, "complexity": 5, "token_count": 194, "parameters": [ "astr", "wrap" ], "start_line": 321, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , c_or_r , r = 0 )", "filename": "polynomial.py", "nloc": 15, "complexity": 6, "token_count": 122, "parameters": [ "self", "c_or_r", "r" ], "start_line": 365, "end_line": 379, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "__array__", "long_name": "__array__( self , t = None )", "filename": "polynomial.py", "nloc": 5, "complexity": 2, "token_count": 30, "parameters": [ "self", "t" ], "start_line": 381, "end_line": 385, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__coerce__", "long_name": "__coerce__( self , other )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 387, "end_line": 388, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "polynomial.py", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 390, "end_line": 393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 395, "end_line": 396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "polynomial.py", "nloc": 41, "complexity": 17, "token_count": 244, "parameters": [ "self" ], "start_line": 398, "end_line": 439, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 42, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , val )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 16, "parameters": [ "self", "val" ], "start_line": 442, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 44, "parameters": [ "self", "other" ], "start_line": 445, "end_line": 450, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 44, "parameters": [ "self", "other" ], "start_line": 452, "end_line": 457, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__add__", "long_name": "__add__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 459, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__radd__", "long_name": "__radd__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 463, "end_line": 465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , val )", "filename": "polynomial.py", "nloc": 7, "complexity": 5, "token_count": 57, "parameters": [ "self", "val" ], "start_line": 467, "end_line": 473, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__sub__", "long_name": "__sub__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__rsub__", "long_name": "__rsub__( self , other )", "filename": "polynomial.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self", "other" ], "start_line": 479, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__div__", "long_name": "__div__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 46, "parameters": [ "self", "other" ], "start_line": 483, "end_line": 488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__rdiv__", "long_name": "__rdiv__( self , other )", "filename": "polynomial.py", "nloc": 6, "complexity": 2, "token_count": 46, "parameters": [ "self", "other" ], "start_line": 490, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__setattr__", "long_name": "__setattr__( self , key , val )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self", "key", "val" ], "start_line": 497, "end_line": 498, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , key )", "filename": "polynomial.py", "nloc": 9, "complexity": 4, "token_count": 58, "parameters": [ "self", "key" ], "start_line": 500, "end_line": 508, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , val )", "filename": "polynomial.py", "nloc": 7, "complexity": 3, "token_count": 37, "parameters": [ "self", "val" ], "start_line": 510, "end_line": 516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__setitem__", "long_name": "__setitem__( self , key , val )", "filename": "polynomial.py", "nloc": 11, "complexity": 3, "token_count": 92, "parameters": [ "self", "key", "val" ], "start_line": 518, "end_line": 528, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "integ", "long_name": "integ( self , m = 1 , k = 0 )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 31, "parameters": [ "self", "m", "k" ], "start_line": 530, "end_line": 531, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "deriv", "long_name": "deriv( self , m = 1 )", "filename": "polynomial.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "self", "m" ], "start_line": 533, "end_line": 534, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "get_linalg_funcs", "long_name": "get_linalg_funcs( )", "filename": "polynomial.py", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [], "start_line": 16, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 } ], "nloc": 380, "complexity": 119, "token_count": 2749, "diff_parsed": { "added": [ " import scipy" ], "deleted": [ " import scipy.linalg" ] } }, { "old_path": "scipy/corelib/blasdot/_dotblas.c", "new_path": "scipy/corelib/blasdot/_dotblas.c", "filename": "_dotblas.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -226,7 +226,7 @@ dotblas_matrixproduct(PyObject *dummy, PyObject *args)\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n \t\t\t\t typenum, NULL, NULL, 0, 0, \n-\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n+\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1)); \n if (ret == NULL) goto fail;\n memset(ret->data, '\\0', PyArray_SIZE(ret));\n \n@@ -473,7 +473,7 @@ dotblas_innerproduct(PyObject *dummy, PyObject *args)\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n \t\t\t\t typenum, NULL, NULL, 0, 0, \n-\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n+\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_SIZE(ret));\n", "added_lines": 2, "deleted_lines": 2, "source_code": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1)); \n if (ret == NULL) goto fail;\n memset(ret->data, '\\0', PyArray_SIZE(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_SIZE(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "source_code_before": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n if (ret == NULL) goto fail;\n memset(ret->data, '\\0', PyArray_SIZE(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_SIZE(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "methods": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 209, "complexity": 53, "token_count": 2018, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 374, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 243, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 206, "complexity": 53, "token_count": 1992, "parameters": [ "dummy", "args" ], "start_line": 380, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 240, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 625, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 731, "end_line": 754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "methods_before": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 209, "complexity": 53, "token_count": 2014, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 374, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 243, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 206, "complexity": 53, "token_count": 1988, "parameters": [ "dummy", "args" ], "start_line": 380, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 240, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 625, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 731, "end_line": 754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 206, "complexity": 53, "token_count": 1992, "parameters": [ "dummy", "args" ], "start_line": 380, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 240, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 209, "complexity": 53, "token_count": 2018, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 374, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 243, "top_nesting_level": 0 } ], "nloc": 606, "complexity": 138, "token_count": 5528, "diff_parsed": { "added": [ "\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));", "\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));" ], "deleted": [ "\t\t\t\t (prior2 > prior1 ? ap2 : ap1));", "\t\t\t\t (prior2 > prior1 ? ap2 : ap1));" ] } } ] }, { "hash": "c9833ef726fd000fa0634f8a5850c75413aa6471", "msg": "r327@Blasphemy: kern | 2005-10-11 19:49:52 -0700\n Missing self.", "author": { "name": "Robert Kern", "email": "robert.kern@gmail.com" }, "committer": { "name": "Robert Kern", "email": "robert.kern@gmail.com" }, "author_date": "2005-10-12T02:51:02+00:00", "author_timezone": 0, "committer_date": "2005-10-12T02:51:02+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e8e5a126e12edccbc3e3fa8e614e4c0d2711606b" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/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/command/build_src.py", "new_path": "scipy/distutils/command/build_src.py", "filename": "build_src.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -115,7 +115,7 @@ def build_library_sources(self, lib_name, build_info):\n sources, h_files = self.filter_h_files(sources)\n \n if h_files:\n- print package,'- nothing done with h_files=',h_files\n+ print self.package,'- nothing done with h_files=',h_files\n \n #for f in h_files:\n # self.distribution.headers.append((lib_name,f))\n", "added_lines": 1, "deleted_lines": 1, "source_code": "\"\"\" Build swig, f2py, weave, sources.\n\"\"\"\n\nimport os\nimport re\nimport copy\n\nfrom distutils.cmd import Command\nfrom distutils.command import build_ext, build_py\nfrom distutils.util import convert_path\nfrom distutils.dep_util import newer_group, newer\n\nfrom scipy.distutils import log\nfrom scipy.distutils.misc_util import fortran_ext_match, all_strings, dot_join,\\\n appendpath\nfrom scipy.distutils.from_template import process_file as process_f_file\nfrom scipy.distutils.conv_template import process_file as process_c_file\nfrom scipy.distutils.extension import Extension\nfrom scipy.distutils.system_info import get_info, dict_append\n\nclass build_src(build_ext.build_ext):\n\n description = \"build sources from SWIG, F2PY files or a function\"\n\n user_options = [\n ('build-src=', 'd', \"directory to \\\"build\\\" sources to\"),\n ('f2pyflags=', None, \"additonal flags to f2py\"),\n ('swigflags=', None, \"additional flags to swig\"),\n ('force', 'f', \"forcibly build everything (ignore file timestamps)\"),\n ('inplace', 'i',\n \"ignore build-lib and put compiled extensions into the source \" +\n \"directory alongside your pure Python modules\"),\n ]\n\n boolean_options = ['force','inplace']\n\n help_options = []\n\n def initialize_options(self):\n self.extensions = None\n self.package = None\n self.py_modules = None\n self.build_src = None\n self.build_lib = None\n self.build_base = None\n self.force = None\n self.inplace = None\n self.package_dir = None\n self.f2pyflags = None\n self.swigflags = None\n return\n\n def finalize_options(self):\n self.set_undefined_options('build',\n ('build_base', 'build_base'),\n ('build_lib', 'build_lib'),\n ('force', 'force'))\n if self.package is None:\n self.package = self.distribution.ext_package\n self.extensions = self.distribution.ext_modules\n self.libraries = self.distribution.libraries or []\n self.py_modules = self.distribution.py_modules\n if self.build_src is None:\n self.build_src = os.path.join(self.build_base, 'src')\n if self.inplace is None:\n build_ext = self.get_finalized_command('build_ext')\n self.inplace = build_ext.inplace\n\n # py_modules is used in build_py.find_package_modules\n self.py_modules = {}\n\n if self.f2pyflags is None:\n self.f2pyflags = []\n else:\n self.f2pyflags = self.f2pyflags.split() # XXX spaces??\n\n if self.swigflags is None:\n self.swigflags = []\n else:\n self.swigflags = self.swigflags.split() # XXX spaces??\n return\n\n def run(self):\n if not (self.extensions or self.libraries):\n return\n self.build_sources()\n\n return\n \n def build_sources(self):\n\n for libname_info in self.libraries:\n self.build_library_sources(*libname_info)\n\n if self.extensions:\n self.check_extensions_list(self.extensions)\n\n for ext in self.extensions:\n self.build_extension_sources(ext)\n\n return\n\n def build_library_sources(self, lib_name, build_info):\n sources = list(build_info.get('sources',[]))\n\n if not sources:\n return\n\n log.info('building library \"%s\" sources' % (lib_name))\n\n sources = self.generate_sources(sources, (lib_name, build_info))\n\n sources = self.template_sources(sources, (lib_name, build_info))\n\n sources, h_files = self.filter_h_files(sources)\n\n if h_files:\n print self.package,'- nothing done with h_files=',h_files\n\n #for f in h_files:\n # self.distribution.headers.append((lib_name,f))\n\n build_info['sources'] = sources\n return\n\n def build_extension_sources(self, ext):\n\n sources = list(ext.sources)\n\n log.info('building extension \"%s\" sources' % (ext.name))\n\n fullname = self.get_ext_fullname(ext.name)\n\n modpath = fullname.split('.')\n package = '.'.join(modpath[0:-1])\n\n\n if self.inplace:\n build_py = self.get_finalized_command('build_py')\n self.ext_target_dir = build_py.get_package_dir(package)\n\n\n sources = self.generate_sources(sources, ext)\n\n sources = self.template_sources(sources, ext)\n \n sources = self.swig_sources(sources, ext)\n\n sources = self.f2py_sources(sources, ext)\n\n sources, py_files = self.filter_py_files(sources)\n\n if not self.py_modules.has_key(package):\n self.py_modules[package] = []\n modules = []\n for f in py_files:\n module = os.path.splitext(os.path.basename(f))[0]\n modules.append((package, module, f))\n self.py_modules[package] += modules\n\n sources, h_files = self.filter_h_files(sources)\n\n if h_files:\n print package,'- nothing done with h_files=',h_files\n #for f in h_files:\n # self.distribution.headers.append((package,f))\n\n ext.sources = sources\n\n return\n\n def generate_sources(self, sources, extension):\n new_sources = []\n func_sources = []\n for source in sources:\n if type(source) is type(''):\n new_sources.append(source)\n else:\n func_sources.append(source)\n if not func_sources:\n return new_sources\n if self.inplace:\n build_dir = self.ext_target_dir\n else:\n if type(extension) is type(()):\n name = extension[0]\n # if not extension[1].has_key('include_dirs'):\n # extension[1]['include_dirs'] = []\n # incl_dirs = extension[1]['include_dirs']\n else:\n name = extension.name\n # incl_dirs = extension.include_dirs\n #if self.build_src not in incl_dirs:\n # incl_dirs.append(self.build_src)\n build_dir = os.path.join(*([self.build_src]\\\n +name.split('.')[:-1]))\n self.mkpath(build_dir)\n for func in func_sources:\n source = func(extension, build_dir)\n if not source:\n continue\n if type(source) is type([]):\n [log.info(\" adding '%s' to sources.\" % (s)) for s in source]\n new_sources.extend(source)\n else:\n log.info(\" adding '%s' to sources.\" % (source))\n new_sources.append(source)\n\n return new_sources\n\n def filter_py_files(self, sources):\n return self.filter_files(sources,['.py'])\n\n def filter_h_files(self, sources):\n return self.filter_files(sources,['.h','.hpp','.inc'])\n\n def filter_files(self, sources, exts = []):\n new_sources = []\n files = []\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext in exts: \n files.append(source)\n else:\n new_sources.append(source)\n return new_sources, files\n\n def template_sources(self, sources, extension):\n new_sources = []\n if type(extension) is type(()):\n depends = extension[1].get('depends')\n include_dirs = extension[1].get('include_dirs')\n else: \n depends = extension.depends\n include_dirs = extension.include_dirs\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext == '.src': # Template file\n if self.inplace:\n target_dir = os.path.dirname(base)\n else:\n target_dir = appendpath(self.build_src, os.path.dirname(base))\n self.mkpath(target_dir)\n target_file = os.path.join(target_dir,os.path.basename(base))\n if (self.force or newer_group([source] + depends, target_file)):\n if _f_pyf_ext_match(base):\n log.info(\"from_template:> %s\" % (target_file))\n outstr = process_f_file(source)\n else:\n log.info(\"conv_template:> %s\" % (target_file))\n outstr = process_c_file(source)\n fid = open(target_file,'w')\n fid.write(outstr)\n fid.close()\n if _header_ext_match(target_file):\n d = os.path.dirname(target_file)\n if d not in include_dirs:\n log.info(\" adding '%s' to include_dirs.\" % (d))\n include_dirs.append(d)\n new_sources.append(target_file)\n else:\n new_sources.append(source)\n return new_sources \n \n def f2py_sources(self, sources, extension):\n new_sources = []\n f2py_sources = []\n f_sources = []\n f2py_targets = {}\n target_dirs = []\n ext_name = extension.name.split('.')[-1]\n skip_f2py = 0\n\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext == '.pyf': # F2PY interface file\n if self.inplace:\n target_dir = os.path.dirname(base)\n else:\n target_dir = appendpath(self.build_src, os.path.dirname(base))\n if os.path.isfile(source):\n name = get_f2py_modulename(source)\n assert name==ext_name,'mismatch of extension names: '\\\n +source+' provides'\\\n ' '+`name`+' but expected '+`ext_name`\n target_file = os.path.join(target_dir,name+'module.c')\n else:\n log.debug(' source %s does not exist: skipping f2py\\'ing.' \\\n % (source))\n name = ext_name\n skip_f2py = 1\n target_file = os.path.join(target_dir,name+'module.c')\n if not os.path.isfile(target_file):\n log.debug(' target %s does not exist:\\n '\\\n 'Assuming %smodule.c was generated with '\\\n '\"build_src --inplace\" command.' \\\n % (target_file, name))\n target_dir = os.path.dirname(base)\n target_file = os.path.join(target_dir,name+'module.c')\n assert os.path.isfile(target_file),`target_file`+' missing'\n log.debug(' Yes! Using %s as up-to-date target.' \\\n % (target_file))\n target_dirs.append(target_dir)\n f2py_sources.append(source)\n f2py_targets[source] = target_file\n new_sources.append(target_file)\n elif fortran_ext_match(ext):\n f_sources.append(source)\n else:\n new_sources.append(source)\n\n if not (f2py_sources or f_sources):\n return new_sources\n\n map(self.mkpath, target_dirs)\n\n f2py_options = extension.f2py_options + self.f2pyflags\n\n if self.distribution.libraries:\n for name,build_info in self.distribution.libraries:\n if name in extension.libraries:\n f2py_options.extend(build_info.get('f2py_options',[]))\n\n log.info(\"f2py options: %s\" % (f2py_options))\n\n if f2py_sources:\n assert len(f2py_sources)==1,\\\n 'only one .pyf file is allowed per extension module but got'\\\n ' more:'+`f2py_sources`\n source = f2py_sources[0]\n target_file = f2py_targets[source]\n target_dir = os.path.dirname(target_file) or '.'\n depends = [source] + extension.depends\n if (self.force or newer_group(depends, target_file,'newer')) \\\n and not skip_f2py:\n log.info(\"f2py: %s\" % (source))\n import scipy.f2py as f2py2e\n f2py2e.run_main(f2py_options + ['--build-dir',target_dir,source])\n else:\n log.debug(\" skipping '%s' f2py interface (up-to-date)\" % (source))\n else:\n #XXX TODO: --inplace support for sdist command\n if type(extension) is type(()): name = extension[0]\n else: name = extension.name\n target_dir = os.path.join(*([self.build_src]\\\n +name.split('.')[:-1]))\n target_file = os.path.join(target_dir,ext_name + 'module.c')\n new_sources.append(target_file)\n depends = f_sources + extension.depends\n if (self.force or newer_group(depends, target_file, 'newer')) \\\n and not skip_f2py:\n import scipy.f2py as f2py2e\n log.info(\"f2py:> %s\" % (target_file))\n self.mkpath(target_dir)\n f2py2e.run_main(f2py_options + ['--lower',\n '--build-dir',target_dir]+\\\n ['-m',ext_name]+f_sources)\n else:\n log.debug(\" skipping f2py fortran files for '%s' (up-to-date)\"\\\n % (target_file))\n\n assert os.path.isfile(target_file),`target_file`+' missing'\n\n target_c = os.path.join(self.build_src,'fortranobject.c')\n target_h = os.path.join(self.build_src,'fortranobject.h')\n log.info(\" adding '%s' to sources.\" % (target_c))\n new_sources.append(target_c)\n if self.build_src not in extension.include_dirs:\n log.info(\" adding '%s' to include_dirs.\" \\\n % (self.build_src))\n extension.include_dirs.append(self.build_src)\n\n if not skip_f2py:\n import scipy.f2py as f2py2e\n d = os.path.dirname(f2py2e.__file__)\n source_c = os.path.join(d,'src','fortranobject.c')\n source_h = os.path.join(d,'src','fortranobject.h')\n if newer(source_c,target_c) or newer(source_h,target_h):\n self.mkpath(os.path.dirname(target_c))\n self.copy_file(source_c,target_c)\n self.copy_file(source_h,target_h)\n else:\n assert os.path.isfile(target_c),`target_c` + ' missing'\n assert os.path.isfile(target_h),`target_h` + ' missing'\n \n for name_ext in ['-f2pywrappers.f','-f2pywrappers2.f90']:\n filename = os.path.join(target_dir,ext_name + name_ext)\n if os.path.isfile(filename):\n log.info(\" adding '%s' to sources.\" % (filename))\n f_sources.append(filename)\n\n return new_sources + f_sources\n\n def swig_sources(self, sources, extension):\n # Assuming SWIG 1.3.14 or later. See compatibility note in\n # http://www.swig.org/Doc1.3/Python.html#Python_nn6\n\n new_sources = []\n swig_sources = []\n swig_targets = {}\n target_dirs = []\n py_files = [] # swig generated .py files\n target_ext = '.c'\n typ = None\n is_cpp = 0\n skip_swig = 0\n ext_name = extension.name.split('.')[-1]\n\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext == '.i': # SWIG interface file\n if self.inplace:\n target_dir = os.path.dirname(base)\n py_target_dir = self.ext_target_dir\n else:\n target_dir = appendpath(self.build_src, os.path.dirname(base))\n py_target_dir = target_dir\n if os.path.isfile(source):\n name = get_swig_modulename(source)\n assert name==ext_name[1:],'mismatch of extension names: '\\\n +source+' provides'\\\n ' '+`name`+' but expected '+`ext_name[1:]`\n if typ is None:\n typ = get_swig_target(source)\n is_cpp = typ=='c++'\n if is_cpp:\n target_ext = '.cpp'\n else:\n assert typ == get_swig_target(source),`typ`\n target_file = os.path.join(target_dir,'%s_wrap%s' \\\n % (name, target_ext))\n else:\n log.debug(' source %s does not exist: skipping swig\\'ing.' \\\n % (source))\n name = ext_name[1:]\n skip_swig = 1\n target_file = _find_swig_target(target_dir, name)\n if not os.path.isfile(target_file):\n log.debug(' target %s does not exist:\\n '\\\n 'Assuming %s_wrap.{c,cpp} was generated with '\\\n '\"build_src --inplace\" command.' \\\n % (target_file, name))\n target_dir = os.path.dirname(base)\n target_file = _find_swig_target(target_dir, name)\n assert os.path.isfile(target_file),`target_file`+' missing'\n log.debug(' Yes! Using %s as up-to-date target.' \\\n % (target_file))\n target_dirs.append(target_dir)\n new_sources.append(target_file)\n py_files.append(os.path.join(py_target_dir, name+'.py'))\n swig_sources.append(source)\n swig_targets[source] = new_sources[-1]\n else:\n new_sources.append(source)\n\n if not swig_sources:\n return new_sources\n\n if skip_swig:\n return new_sources + py_files\n\n map(self.mkpath, target_dirs)\n swig = self.find_swig()\n swig_cmd = [swig, \"-python\"]\n if is_cpp:\n swig_cmd.append('-c++')\n for d in extension.include_dirs:\n swig_cmd.append('-I'+d)\n for source in swig_sources:\n target = swig_targets[source]\n depends = [source] + extension.depends\n if self.force or newer_group(depends, target, 'newer'):\n log.info(\"%s: %s\" % (os.path.basename(swig) \\\n + (is_cpp and '++' or ''), source))\n self.spawn(swig_cmd + self.swigflags \\\n + [\"-o\", target, '-outdir', py_target_dir, source])\n else:\n log.debug(\" skipping '%s' swig interface (up-to-date)\" \\\n % (source))\n\n return new_sources + py_files\n\n_f_pyf_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f|pyf)\\Z',re.I).match\n_header_ext_match = re.compile(r'.*[.](inc|h|hpp)\\Z',re.I).match\n\n#### SWIG related auxiliary functions ####\n_swig_module_name_match = re.compile(r'\\s*%module\\s*(?P[\\w_]+)',\n re.I).match\n_has_c_header = re.compile(r'-[*]-\\s*c\\s*-[*]-',re.I).search\n_has_cpp_header = re.compile(r'-[*]-\\s*c[+][+]\\s*-[*]-',re.I).search\n\ndef get_swig_target(source):\n f = open(source,'r')\n result = 'c'\n line = f.readline()\n if _has_cpp_header(line):\n result = 'c++'\n if _has_c_header(line):\n result = 'c'\n f.close()\n return result\n\ndef get_swig_modulename(source):\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = _swig_module_name_match(line)\n if m:\n name = m.group('name')\n break\n f.close()\n return name\n\ndef _find_swig_target(target_dir,name):\n for ext in ['.cpp','.c']:\n target = os.path.join(target_dir,'%s_wrap%s' % (name, ext))\n if os.path.isfile(target):\n break\n return target\n\n#### F2PY related auxiliary functions ####\n\n_f2py_module_name_match = re.compile(r'\\s*python\\s*module\\s*(?P[\\w_]+)',\n re.I).match\n_f2py_user_module_name_match = re.compile(r'\\s*python\\s*module\\s*(?P[\\w_]*?'\\\n '__user__[\\w_]*)',re.I).match\n\ndef get_f2py_modulename(source):\n name = None\n f = open(source)\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = _f2py_module_name_match(line)\n if m:\n if _f2py_user_module_name_match(line): # skip *__user__* names\n continue\n name = m.group('name')\n break\n f.close()\n return name\n\n##########################################\n", "source_code_before": "\"\"\" Build swig, f2py, weave, sources.\n\"\"\"\n\nimport os\nimport re\nimport copy\n\nfrom distutils.cmd import Command\nfrom distutils.command import build_ext, build_py\nfrom distutils.util import convert_path\nfrom distutils.dep_util import newer_group, newer\n\nfrom scipy.distutils import log\nfrom scipy.distutils.misc_util import fortran_ext_match, all_strings, dot_join,\\\n appendpath\nfrom scipy.distutils.from_template import process_file as process_f_file\nfrom scipy.distutils.conv_template import process_file as process_c_file\nfrom scipy.distutils.extension import Extension\nfrom scipy.distutils.system_info import get_info, dict_append\n\nclass build_src(build_ext.build_ext):\n\n description = \"build sources from SWIG, F2PY files or a function\"\n\n user_options = [\n ('build-src=', 'd', \"directory to \\\"build\\\" sources to\"),\n ('f2pyflags=', None, \"additonal flags to f2py\"),\n ('swigflags=', None, \"additional flags to swig\"),\n ('force', 'f', \"forcibly build everything (ignore file timestamps)\"),\n ('inplace', 'i',\n \"ignore build-lib and put compiled extensions into the source \" +\n \"directory alongside your pure Python modules\"),\n ]\n\n boolean_options = ['force','inplace']\n\n help_options = []\n\n def initialize_options(self):\n self.extensions = None\n self.package = None\n self.py_modules = None\n self.build_src = None\n self.build_lib = None\n self.build_base = None\n self.force = None\n self.inplace = None\n self.package_dir = None\n self.f2pyflags = None\n self.swigflags = None\n return\n\n def finalize_options(self):\n self.set_undefined_options('build',\n ('build_base', 'build_base'),\n ('build_lib', 'build_lib'),\n ('force', 'force'))\n if self.package is None:\n self.package = self.distribution.ext_package\n self.extensions = self.distribution.ext_modules\n self.libraries = self.distribution.libraries or []\n self.py_modules = self.distribution.py_modules\n if self.build_src is None:\n self.build_src = os.path.join(self.build_base, 'src')\n if self.inplace is None:\n build_ext = self.get_finalized_command('build_ext')\n self.inplace = build_ext.inplace\n\n # py_modules is used in build_py.find_package_modules\n self.py_modules = {}\n\n if self.f2pyflags is None:\n self.f2pyflags = []\n else:\n self.f2pyflags = self.f2pyflags.split() # XXX spaces??\n\n if self.swigflags is None:\n self.swigflags = []\n else:\n self.swigflags = self.swigflags.split() # XXX spaces??\n return\n\n def run(self):\n if not (self.extensions or self.libraries):\n return\n self.build_sources()\n\n return\n \n def build_sources(self):\n\n for libname_info in self.libraries:\n self.build_library_sources(*libname_info)\n\n if self.extensions:\n self.check_extensions_list(self.extensions)\n\n for ext in self.extensions:\n self.build_extension_sources(ext)\n\n return\n\n def build_library_sources(self, lib_name, build_info):\n sources = list(build_info.get('sources',[]))\n\n if not sources:\n return\n\n log.info('building library \"%s\" sources' % (lib_name))\n\n sources = self.generate_sources(sources, (lib_name, build_info))\n\n sources = self.template_sources(sources, (lib_name, build_info))\n\n sources, h_files = self.filter_h_files(sources)\n\n if h_files:\n print package,'- nothing done with h_files=',h_files\n\n #for f in h_files:\n # self.distribution.headers.append((lib_name,f))\n\n build_info['sources'] = sources\n return\n\n def build_extension_sources(self, ext):\n\n sources = list(ext.sources)\n\n log.info('building extension \"%s\" sources' % (ext.name))\n\n fullname = self.get_ext_fullname(ext.name)\n\n modpath = fullname.split('.')\n package = '.'.join(modpath[0:-1])\n\n\n if self.inplace:\n build_py = self.get_finalized_command('build_py')\n self.ext_target_dir = build_py.get_package_dir(package)\n\n\n sources = self.generate_sources(sources, ext)\n\n sources = self.template_sources(sources, ext)\n \n sources = self.swig_sources(sources, ext)\n\n sources = self.f2py_sources(sources, ext)\n\n sources, py_files = self.filter_py_files(sources)\n\n if not self.py_modules.has_key(package):\n self.py_modules[package] = []\n modules = []\n for f in py_files:\n module = os.path.splitext(os.path.basename(f))[0]\n modules.append((package, module, f))\n self.py_modules[package] += modules\n\n sources, h_files = self.filter_h_files(sources)\n\n if h_files:\n print package,'- nothing done with h_files=',h_files\n #for f in h_files:\n # self.distribution.headers.append((package,f))\n\n ext.sources = sources\n\n return\n\n def generate_sources(self, sources, extension):\n new_sources = []\n func_sources = []\n for source in sources:\n if type(source) is type(''):\n new_sources.append(source)\n else:\n func_sources.append(source)\n if not func_sources:\n return new_sources\n if self.inplace:\n build_dir = self.ext_target_dir\n else:\n if type(extension) is type(()):\n name = extension[0]\n # if not extension[1].has_key('include_dirs'):\n # extension[1]['include_dirs'] = []\n # incl_dirs = extension[1]['include_dirs']\n else:\n name = extension.name\n # incl_dirs = extension.include_dirs\n #if self.build_src not in incl_dirs:\n # incl_dirs.append(self.build_src)\n build_dir = os.path.join(*([self.build_src]\\\n +name.split('.')[:-1]))\n self.mkpath(build_dir)\n for func in func_sources:\n source = func(extension, build_dir)\n if not source:\n continue\n if type(source) is type([]):\n [log.info(\" adding '%s' to sources.\" % (s)) for s in source]\n new_sources.extend(source)\n else:\n log.info(\" adding '%s' to sources.\" % (source))\n new_sources.append(source)\n\n return new_sources\n\n def filter_py_files(self, sources):\n return self.filter_files(sources,['.py'])\n\n def filter_h_files(self, sources):\n return self.filter_files(sources,['.h','.hpp','.inc'])\n\n def filter_files(self, sources, exts = []):\n new_sources = []\n files = []\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext in exts: \n files.append(source)\n else:\n new_sources.append(source)\n return new_sources, files\n\n def template_sources(self, sources, extension):\n new_sources = []\n if type(extension) is type(()):\n depends = extension[1].get('depends')\n include_dirs = extension[1].get('include_dirs')\n else: \n depends = extension.depends\n include_dirs = extension.include_dirs\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext == '.src': # Template file\n if self.inplace:\n target_dir = os.path.dirname(base)\n else:\n target_dir = appendpath(self.build_src, os.path.dirname(base))\n self.mkpath(target_dir)\n target_file = os.path.join(target_dir,os.path.basename(base))\n if (self.force or newer_group([source] + depends, target_file)):\n if _f_pyf_ext_match(base):\n log.info(\"from_template:> %s\" % (target_file))\n outstr = process_f_file(source)\n else:\n log.info(\"conv_template:> %s\" % (target_file))\n outstr = process_c_file(source)\n fid = open(target_file,'w')\n fid.write(outstr)\n fid.close()\n if _header_ext_match(target_file):\n d = os.path.dirname(target_file)\n if d not in include_dirs:\n log.info(\" adding '%s' to include_dirs.\" % (d))\n include_dirs.append(d)\n new_sources.append(target_file)\n else:\n new_sources.append(source)\n return new_sources \n \n def f2py_sources(self, sources, extension):\n new_sources = []\n f2py_sources = []\n f_sources = []\n f2py_targets = {}\n target_dirs = []\n ext_name = extension.name.split('.')[-1]\n skip_f2py = 0\n\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext == '.pyf': # F2PY interface file\n if self.inplace:\n target_dir = os.path.dirname(base)\n else:\n target_dir = appendpath(self.build_src, os.path.dirname(base))\n if os.path.isfile(source):\n name = get_f2py_modulename(source)\n assert name==ext_name,'mismatch of extension names: '\\\n +source+' provides'\\\n ' '+`name`+' but expected '+`ext_name`\n target_file = os.path.join(target_dir,name+'module.c')\n else:\n log.debug(' source %s does not exist: skipping f2py\\'ing.' \\\n % (source))\n name = ext_name\n skip_f2py = 1\n target_file = os.path.join(target_dir,name+'module.c')\n if not os.path.isfile(target_file):\n log.debug(' target %s does not exist:\\n '\\\n 'Assuming %smodule.c was generated with '\\\n '\"build_src --inplace\" command.' \\\n % (target_file, name))\n target_dir = os.path.dirname(base)\n target_file = os.path.join(target_dir,name+'module.c')\n assert os.path.isfile(target_file),`target_file`+' missing'\n log.debug(' Yes! Using %s as up-to-date target.' \\\n % (target_file))\n target_dirs.append(target_dir)\n f2py_sources.append(source)\n f2py_targets[source] = target_file\n new_sources.append(target_file)\n elif fortran_ext_match(ext):\n f_sources.append(source)\n else:\n new_sources.append(source)\n\n if not (f2py_sources or f_sources):\n return new_sources\n\n map(self.mkpath, target_dirs)\n\n f2py_options = extension.f2py_options + self.f2pyflags\n\n if self.distribution.libraries:\n for name,build_info in self.distribution.libraries:\n if name in extension.libraries:\n f2py_options.extend(build_info.get('f2py_options',[]))\n\n log.info(\"f2py options: %s\" % (f2py_options))\n\n if f2py_sources:\n assert len(f2py_sources)==1,\\\n 'only one .pyf file is allowed per extension module but got'\\\n ' more:'+`f2py_sources`\n source = f2py_sources[0]\n target_file = f2py_targets[source]\n target_dir = os.path.dirname(target_file) or '.'\n depends = [source] + extension.depends\n if (self.force or newer_group(depends, target_file,'newer')) \\\n and not skip_f2py:\n log.info(\"f2py: %s\" % (source))\n import scipy.f2py as f2py2e\n f2py2e.run_main(f2py_options + ['--build-dir',target_dir,source])\n else:\n log.debug(\" skipping '%s' f2py interface (up-to-date)\" % (source))\n else:\n #XXX TODO: --inplace support for sdist command\n if type(extension) is type(()): name = extension[0]\n else: name = extension.name\n target_dir = os.path.join(*([self.build_src]\\\n +name.split('.')[:-1]))\n target_file = os.path.join(target_dir,ext_name + 'module.c')\n new_sources.append(target_file)\n depends = f_sources + extension.depends\n if (self.force or newer_group(depends, target_file, 'newer')) \\\n and not skip_f2py:\n import scipy.f2py as f2py2e\n log.info(\"f2py:> %s\" % (target_file))\n self.mkpath(target_dir)\n f2py2e.run_main(f2py_options + ['--lower',\n '--build-dir',target_dir]+\\\n ['-m',ext_name]+f_sources)\n else:\n log.debug(\" skipping f2py fortran files for '%s' (up-to-date)\"\\\n % (target_file))\n\n assert os.path.isfile(target_file),`target_file`+' missing'\n\n target_c = os.path.join(self.build_src,'fortranobject.c')\n target_h = os.path.join(self.build_src,'fortranobject.h')\n log.info(\" adding '%s' to sources.\" % (target_c))\n new_sources.append(target_c)\n if self.build_src not in extension.include_dirs:\n log.info(\" adding '%s' to include_dirs.\" \\\n % (self.build_src))\n extension.include_dirs.append(self.build_src)\n\n if not skip_f2py:\n import scipy.f2py as f2py2e\n d = os.path.dirname(f2py2e.__file__)\n source_c = os.path.join(d,'src','fortranobject.c')\n source_h = os.path.join(d,'src','fortranobject.h')\n if newer(source_c,target_c) or newer(source_h,target_h):\n self.mkpath(os.path.dirname(target_c))\n self.copy_file(source_c,target_c)\n self.copy_file(source_h,target_h)\n else:\n assert os.path.isfile(target_c),`target_c` + ' missing'\n assert os.path.isfile(target_h),`target_h` + ' missing'\n \n for name_ext in ['-f2pywrappers.f','-f2pywrappers2.f90']:\n filename = os.path.join(target_dir,ext_name + name_ext)\n if os.path.isfile(filename):\n log.info(\" adding '%s' to sources.\" % (filename))\n f_sources.append(filename)\n\n return new_sources + f_sources\n\n def swig_sources(self, sources, extension):\n # Assuming SWIG 1.3.14 or later. See compatibility note in\n # http://www.swig.org/Doc1.3/Python.html#Python_nn6\n\n new_sources = []\n swig_sources = []\n swig_targets = {}\n target_dirs = []\n py_files = [] # swig generated .py files\n target_ext = '.c'\n typ = None\n is_cpp = 0\n skip_swig = 0\n ext_name = extension.name.split('.')[-1]\n\n for source in sources:\n (base, ext) = os.path.splitext(source)\n if ext == '.i': # SWIG interface file\n if self.inplace:\n target_dir = os.path.dirname(base)\n py_target_dir = self.ext_target_dir\n else:\n target_dir = appendpath(self.build_src, os.path.dirname(base))\n py_target_dir = target_dir\n if os.path.isfile(source):\n name = get_swig_modulename(source)\n assert name==ext_name[1:],'mismatch of extension names: '\\\n +source+' provides'\\\n ' '+`name`+' but expected '+`ext_name[1:]`\n if typ is None:\n typ = get_swig_target(source)\n is_cpp = typ=='c++'\n if is_cpp:\n target_ext = '.cpp'\n else:\n assert typ == get_swig_target(source),`typ`\n target_file = os.path.join(target_dir,'%s_wrap%s' \\\n % (name, target_ext))\n else:\n log.debug(' source %s does not exist: skipping swig\\'ing.' \\\n % (source))\n name = ext_name[1:]\n skip_swig = 1\n target_file = _find_swig_target(target_dir, name)\n if not os.path.isfile(target_file):\n log.debug(' target %s does not exist:\\n '\\\n 'Assuming %s_wrap.{c,cpp} was generated with '\\\n '\"build_src --inplace\" command.' \\\n % (target_file, name))\n target_dir = os.path.dirname(base)\n target_file = _find_swig_target(target_dir, name)\n assert os.path.isfile(target_file),`target_file`+' missing'\n log.debug(' Yes! Using %s as up-to-date target.' \\\n % (target_file))\n target_dirs.append(target_dir)\n new_sources.append(target_file)\n py_files.append(os.path.join(py_target_dir, name+'.py'))\n swig_sources.append(source)\n swig_targets[source] = new_sources[-1]\n else:\n new_sources.append(source)\n\n if not swig_sources:\n return new_sources\n\n if skip_swig:\n return new_sources + py_files\n\n map(self.mkpath, target_dirs)\n swig = self.find_swig()\n swig_cmd = [swig, \"-python\"]\n if is_cpp:\n swig_cmd.append('-c++')\n for d in extension.include_dirs:\n swig_cmd.append('-I'+d)\n for source in swig_sources:\n target = swig_targets[source]\n depends = [source] + extension.depends\n if self.force or newer_group(depends, target, 'newer'):\n log.info(\"%s: %s\" % (os.path.basename(swig) \\\n + (is_cpp and '++' or ''), source))\n self.spawn(swig_cmd + self.swigflags \\\n + [\"-o\", target, '-outdir', py_target_dir, source])\n else:\n log.debug(\" skipping '%s' swig interface (up-to-date)\" \\\n % (source))\n\n return new_sources + py_files\n\n_f_pyf_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f|pyf)\\Z',re.I).match\n_header_ext_match = re.compile(r'.*[.](inc|h|hpp)\\Z',re.I).match\n\n#### SWIG related auxiliary functions ####\n_swig_module_name_match = re.compile(r'\\s*%module\\s*(?P[\\w_]+)',\n re.I).match\n_has_c_header = re.compile(r'-[*]-\\s*c\\s*-[*]-',re.I).search\n_has_cpp_header = re.compile(r'-[*]-\\s*c[+][+]\\s*-[*]-',re.I).search\n\ndef get_swig_target(source):\n f = open(source,'r')\n result = 'c'\n line = f.readline()\n if _has_cpp_header(line):\n result = 'c++'\n if _has_c_header(line):\n result = 'c'\n f.close()\n return result\n\ndef get_swig_modulename(source):\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = _swig_module_name_match(line)\n if m:\n name = m.group('name')\n break\n f.close()\n return name\n\ndef _find_swig_target(target_dir,name):\n for ext in ['.cpp','.c']:\n target = os.path.join(target_dir,'%s_wrap%s' % (name, ext))\n if os.path.isfile(target):\n break\n return target\n\n#### F2PY related auxiliary functions ####\n\n_f2py_module_name_match = re.compile(r'\\s*python\\s*module\\s*(?P[\\w_]+)',\n re.I).match\n_f2py_user_module_name_match = re.compile(r'\\s*python\\s*module\\s*(?P[\\w_]*?'\\\n '__user__[\\w_]*)',re.I).match\n\ndef get_f2py_modulename(source):\n name = None\n f = open(source)\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = _f2py_module_name_match(line)\n if m:\n if _f2py_user_module_name_match(line): # skip *__user__* names\n continue\n name = m.group('name')\n break\n f.close()\n return name\n\n##########################################\n", "methods": [ { "name": "initialize_options", "long_name": "initialize_options( self )", "filename": "build_src.py", "nloc": 13, "complexity": 1, "token_count": 61, "parameters": [ "self" ], "start_line": 39, "end_line": 51, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "build_src.py", "nloc": 25, "complexity": 7, "token_count": 179, "parameters": [ "self" ], "start_line": 53, "end_line": 81, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "build_src.py", "nloc": 5, "complexity": 3, "token_count": 24, "parameters": [ "self" ], "start_line": 83, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "build_sources", "long_name": "build_sources( self )", "filename": "build_src.py", "nloc": 8, "complexity": 4, "token_count": 46, "parameters": [ "self" ], "start_line": 90, "end_line": 101, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "build_library_sources", "long_name": "build_library_sources( self , lib_name , build_info )", "filename": "build_src.py", "nloc": 12, "complexity": 3, "token_count": 94, "parameters": [ "self", "lib_name", "build_info" ], "start_line": 103, "end_line": 124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "build_extension_sources", "long_name": "build_extension_sources( self , ext )", "filename": "build_src.py", "nloc": 26, "complexity": 5, "token_count": 226, "parameters": [ "self", "ext" ], "start_line": 126, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 1 }, { "name": "generate_sources", "long_name": "generate_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 31, "complexity": 10, "token_count": 198, "parameters": [ "self", "sources", "extension" ], "start_line": 172, "end_line": 209, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "filter_py_files", "long_name": "filter_py_files( self , sources )", "filename": "build_src.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self", "sources" ], "start_line": 211, "end_line": 212, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "filter_h_files", "long_name": "filter_h_files( self , sources )", "filename": "build_src.py", "nloc": 2, "complexity": 1, "token_count": 22, "parameters": [ "self", "sources" ], "start_line": 214, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "filter_files", "long_name": "filter_files( self , sources , exts = [ ] )", "filename": "build_src.py", "nloc": 10, "complexity": 3, "token_count": 62, "parameters": [ "self", "sources", "exts" ], "start_line": 217, "end_line": 226, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "template_sources", "long_name": "template_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 36, "complexity": 10, "token_count": 273, "parameters": [ "self", "sources", "extension" ], "start_line": 228, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "f2py_sources", "long_name": "f2py_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 115, "complexity": 27, "token_count": 935, "parameters": [ "self", "sources", "extension" ], "start_line": 265, "end_line": 392, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 1 }, { "name": "swig_sources", "long_name": "swig_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 80, "complexity": 17, "token_count": 539, "parameters": [ "self", "sources", "extension" ], "start_line": 394, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 88, "top_nesting_level": 1 }, { "name": "get_swig_target", "long_name": "get_swig_target( source )", "filename": "build_src.py", "nloc": 10, "complexity": 3, "token_count": 48, "parameters": [ "source" ], "start_line": 492, "end_line": 501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_swig_modulename", "long_name": "get_swig_modulename( source )", "filename": "build_src.py", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "source" ], "start_line": 503, "end_line": 512, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_find_swig_target", "long_name": "_find_swig_target( target_dir , name )", "filename": "build_src.py", "nloc": 6, "complexity": 3, "token_count": 47, "parameters": [ "target_dir", "name" ], "start_line": 514, "end_line": 519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "get_f2py_modulename", "long_name": "get_f2py_modulename( source )", "filename": "build_src.py", "nloc": 13, "complexity": 4, "token_count": 65, "parameters": [ "source" ], "start_line": 528, "end_line": 540, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 } ], "methods_before": [ { "name": "initialize_options", "long_name": "initialize_options( self )", "filename": "build_src.py", "nloc": 13, "complexity": 1, "token_count": 61, "parameters": [ "self" ], "start_line": 39, "end_line": 51, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "build_src.py", "nloc": 25, "complexity": 7, "token_count": 179, "parameters": [ "self" ], "start_line": 53, "end_line": 81, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "build_src.py", "nloc": 5, "complexity": 3, "token_count": 24, "parameters": [ "self" ], "start_line": 83, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "build_sources", "long_name": "build_sources( self )", "filename": "build_src.py", "nloc": 8, "complexity": 4, "token_count": 46, "parameters": [ "self" ], "start_line": 90, "end_line": 101, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "build_library_sources", "long_name": "build_library_sources( self , lib_name , build_info )", "filename": "build_src.py", "nloc": 12, "complexity": 3, "token_count": 92, "parameters": [ "self", "lib_name", "build_info" ], "start_line": 103, "end_line": 124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "build_extension_sources", "long_name": "build_extension_sources( self , ext )", "filename": "build_src.py", "nloc": 26, "complexity": 5, "token_count": 226, "parameters": [ "self", "ext" ], "start_line": 126, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 1 }, { "name": "generate_sources", "long_name": "generate_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 31, "complexity": 10, "token_count": 198, "parameters": [ "self", "sources", "extension" ], "start_line": 172, "end_line": 209, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "filter_py_files", "long_name": "filter_py_files( self , sources )", "filename": "build_src.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self", "sources" ], "start_line": 211, "end_line": 212, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "filter_h_files", "long_name": "filter_h_files( self , sources )", "filename": "build_src.py", "nloc": 2, "complexity": 1, "token_count": 22, "parameters": [ "self", "sources" ], "start_line": 214, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "filter_files", "long_name": "filter_files( self , sources , exts = [ ] )", "filename": "build_src.py", "nloc": 10, "complexity": 3, "token_count": 62, "parameters": [ "self", "sources", "exts" ], "start_line": 217, "end_line": 226, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "template_sources", "long_name": "template_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 36, "complexity": 10, "token_count": 273, "parameters": [ "self", "sources", "extension" ], "start_line": 228, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "f2py_sources", "long_name": "f2py_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 115, "complexity": 27, "token_count": 935, "parameters": [ "self", "sources", "extension" ], "start_line": 265, "end_line": 392, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 1 }, { "name": "swig_sources", "long_name": "swig_sources( self , sources , extension )", "filename": "build_src.py", "nloc": 80, "complexity": 17, "token_count": 539, "parameters": [ "self", "sources", "extension" ], "start_line": 394, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 88, "top_nesting_level": 1 }, { "name": "get_swig_target", "long_name": "get_swig_target( source )", "filename": "build_src.py", "nloc": 10, "complexity": 3, "token_count": 48, "parameters": [ "source" ], "start_line": 492, "end_line": 501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_swig_modulename", "long_name": "get_swig_modulename( source )", "filename": "build_src.py", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "source" ], "start_line": 503, "end_line": 512, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_find_swig_target", "long_name": "_find_swig_target( target_dir , name )", "filename": "build_src.py", "nloc": 6, "complexity": 3, "token_count": 47, "parameters": [ "target_dir", "name" ], "start_line": 514, "end_line": 519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "get_f2py_modulename", "long_name": "get_f2py_modulename( source )", "filename": "build_src.py", "nloc": 13, "complexity": 4, "token_count": 65, "parameters": [ "source" ], "start_line": 528, "end_line": 540, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "build_library_sources", "long_name": "build_library_sources( self , lib_name , build_info )", "filename": "build_src.py", "nloc": 12, "complexity": 3, "token_count": 94, "parameters": [ "self", "lib_name", "build_info" ], "start_line": 103, "end_line": 124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 } ], "nloc": 443, "complexity": 105, "token_count": 3180, "diff_parsed": { "added": [ " print self.package,'- nothing done with h_files=',h_files" ], "deleted": [ " print package,'- nothing done with h_files=',h_files" ] } } ] }, { "hash": "3d0634c3381ecdf2717b574ffd0e3dbb872a4e5e", "msg": "r328@Blasphemy: kern | 2005-10-11 19:50:41 -0700\n matrix.py fixes and tests.", "author": { "name": "Robert Kern", "email": "robert.kern@gmail.com" }, "committer": { "name": "Robert Kern", "email": "robert.kern@gmail.com" }, "author_date": "2005-10-12T02:51:09+00:00", "author_timezone": 0, "committer_date": "2005-10-12T02:51:09+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "c9833ef726fd000fa0634f8a5850c75413aa6471" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 5, "insertions": 78, "lines": 83, "files": 2, "dmm_unit_size": 0.6326530612244898, "dmm_unit_complexity": 0.9795918367346939, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/base/matrix.py", "new_path": "scipy/base/matrix.py", "filename": "matrix.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -128,8 +128,13 @@ def __rmul__(self, other):\n else:\n return N.dot(other, self)\n \n+ def __imul__(self, other):\n+ self[:] = self * other\n+ return self\n+\n def __pow__(self, other):\n- if len(shape)!=2 or shape[0]!=shape[1]:\n+ shape = self.shape\n+ if len(shape) != 2 or shape[0] != shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n@@ -184,14 +189,13 @@ def getT(self):\n \n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n- return self.transpose(self.conjugate())\n+ return self.transpose().conjugate()\n else:\n return self.transpose()\n \n def getI(self):\n-\timport scipy\n- inv = scipy.linalg.inv\n- return matrix(inv(self))\n+ from scipy import linalg\n+ return matrix(linalg.inv(self))\n \n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n", "added_lines": 9, "deleted_lines": 5, "source_code": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=(not arr.flags['NOTSWAPPED']))\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1, self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first inde\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __imul__(self, other):\n self[:] = self * other\n return self\n\n def __pow__(self, other):\n shape = self.shape\n if len(shape) != 2 or shape[0] != shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose().conjugate()\n else:\n return self.transpose()\n\n def getI(self):\n from scipy import linalg\n return matrix(linalg.inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "source_code_before": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=(not arr.flags['NOTSWAPPED']))\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1, self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first inde\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __pow__(self, other):\n if len(shape)!=2 or shape[0]!=shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose(self.conjugate())\n else:\n return self.transpose()\n\n def getI(self):\n\timport scipy\n inv = scipy.linalg.inv\n return matrix(inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "methods": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 247, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__imul__", "long_name": "__imul__( self , other )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 32, "complexity": 11, "token_count": 205, "parameters": [ "self", "other" ], "start_line": 135, "end_line": 168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 170, "end_line": 171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 173, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 181, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 184, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 187, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 190, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 196, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 206, "end_line": 228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 231, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "methods_before": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 247, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 31, "complexity": 11, "token_count": 200, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 163, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 165, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 168, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 171, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 179, "end_line": 180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 182, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 36, "parameters": [ "self" ], "start_line": 185, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 4, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 191, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 202, "end_line": 224, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 227, "end_line": 261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "__imul__", "long_name": "__imul__( self , other )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 190, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 32, "complexity": 11, "token_count": 205, "parameters": [ "self", "other" ], "start_line": 135, "end_line": 168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 196, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "nloc": 209, "complexity": 73, "token_count": 1463, "diff_parsed": { "added": [ " def __imul__(self, other):", " self[:] = self * other", " return self", "", " shape = self.shape", " if len(shape) != 2 or shape[0] != shape[1]:", " return self.transpose().conjugate()", " from scipy import linalg", " return matrix(linalg.inv(self))" ], "deleted": [ " if len(shape)!=2 or shape[0]!=shape[1]:", " return self.transpose(self.conjugate())", "\timport scipy", " inv = scipy.linalg.inv", " return matrix(inv(self))" ] } }, { "old_path": null, "new_path": "scipy/base/tests/test_matrix.py", "filename": "test_matrix.py", "extension": "py", "change_type": "ADD", "diff": "@@ -0,0 +1,69 @@\n+import unittest\n+import sys\n+\n+from scipy.test.testing import *\n+set_package_path()\n+import scipy.base;reload(scipy.base)\n+from scipy.base import *\n+del sys.path[0]\n+\n+class test_ctor(ScipyTestCase):\n+ def test_basic(self):\n+ A = array([[1,2],[3,4]])\n+ mA = matrix(A)\n+ assert all(mA.A == A)\n+\n+ B = bmat(\"A,A;A,A\")\n+ C = bmat([[A,A], [A,A]])\n+ D = array([[1,2,1,2],\n+ [3,4,3,4],\n+ [1,2,1,2],\n+ [3,4,3,4]])\n+ assert all(B.A == D)\n+ assert all(C.A == D)\n+ \n+ vec = arange(5)\n+ mvec = matrix(vec)\n+ assert mvec.shape == (1,5)\n+ \n+class test_properties(ScipyTestCase):\n+ def test_basic(self):\n+ from scipy import linalg\n+ \n+ A = array([[1., 2.], \n+ [3., 4.]])\n+ mA = matrix(A)\n+ assert allclose(linalg.inv(A), mA.I)\n+ assert all(array(transpose(A) == mA.T))\n+ assert all(array(transpose(A) == mA.H))\n+ assert all(A == mA.A)\n+ \n+ B = A + 2j*A\n+ mB = matrix(B)\n+ assert allclose(linalg.inv(B), mB.I)\n+ assert all(array(transpose(B) == mB.T))\n+ assert all(array(conjugate(transpose(B)), mB.H))\n+\n+class test_algebra(ScipyTestCase):\n+ def test_basic(self):\n+ from scipy import linalg\n+ \n+ A = array([[1., 2.],\n+ [3., 4.]])\n+ mA = matrix(A)\n+\n+ B = identity(2)\n+ for i in xrange(6):\n+ assert allclose((mA ** i).A, B)\n+ B = dot(B, A)\n+ \n+ Ainv = linalg.inv(A)\n+ B = identity(2)\n+ for i in xrange(6):\n+ assert allclose((mA ** -i).A, B)\n+ B = dot(B, Ainv)\n+\n+ assert allclose((mA * mA).A, dot(A, A))\n+ assert allclose((mA + mA).A, (A + A)) \n+ assert allclose((3*mA).A, (3*A))\n+\n", "added_lines": 69, "deleted_lines": 0, "source_code": "import unittest\nimport sys\n\nfrom scipy.test.testing import *\nset_package_path()\nimport scipy.base;reload(scipy.base)\nfrom scipy.base import *\ndel sys.path[0]\n\nclass test_ctor(ScipyTestCase):\n def test_basic(self):\n A = array([[1,2],[3,4]])\n mA = matrix(A)\n assert all(mA.A == A)\n\n B = bmat(\"A,A;A,A\")\n C = bmat([[A,A], [A,A]])\n D = array([[1,2,1,2],\n [3,4,3,4],\n [1,2,1,2],\n [3,4,3,4]])\n assert all(B.A == D)\n assert all(C.A == D)\n \n vec = arange(5)\n mvec = matrix(vec)\n assert mvec.shape == (1,5)\n \nclass test_properties(ScipyTestCase):\n def test_basic(self):\n from scipy import linalg\n \n A = array([[1., 2.], \n [3., 4.]])\n mA = matrix(A)\n assert allclose(linalg.inv(A), mA.I)\n assert all(array(transpose(A) == mA.T))\n assert all(array(transpose(A) == mA.H))\n assert all(A == mA.A)\n \n B = A + 2j*A\n mB = matrix(B)\n assert allclose(linalg.inv(B), mB.I)\n assert all(array(transpose(B) == mB.T))\n assert all(array(conjugate(transpose(B)), mB.H))\n\nclass test_algebra(ScipyTestCase):\n def test_basic(self):\n from scipy import linalg\n \n A = array([[1., 2.],\n [3., 4.]])\n mA = matrix(A)\n\n B = identity(2)\n for i in xrange(6):\n assert allclose((mA ** i).A, B)\n B = dot(B, A)\n \n Ainv = linalg.inv(A)\n B = identity(2)\n for i in xrange(6):\n assert allclose((mA ** -i).A, B)\n B = dot(B, Ainv)\n\n assert allclose((mA * mA).A, dot(A, A))\n assert allclose((mA + mA).A, (A + A)) \n assert allclose((3*mA).A, (3*A))\n\n", "source_code_before": null, "methods": [ { "name": "test_basic", "long_name": "test_basic( self )", "filename": "test_matrix.py", "nloc": 15, "complexity": 1, "token_count": 148, "parameters": [ "self" ], "start_line": 11, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "test_basic", "long_name": "test_basic( self )", "filename": "test_matrix.py", "nloc": 14, "complexity": 1, "token_count": 150, "parameters": [ "self" ], "start_line": 30, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "test_basic", "long_name": "test_basic( self )", "filename": "test_matrix.py", "nloc": 17, "complexity": 3, "token_count": 168, "parameters": [ "self" ], "start_line": 48, "end_line": 68, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 } ], "methods_before": [], "changed_methods": [ { "name": "test_basic", "long_name": "test_basic( self )", "filename": "test_matrix.py", "nloc": 15, "complexity": 1, "token_count": 148, "parameters": [ "self" ], "start_line": 11, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 } ], "nloc": 56, "complexity": 5, "token_count": 526, "diff_parsed": { "added": [ "import unittest", "import sys", "", "from scipy.test.testing import *", "set_package_path()", "import scipy.base;reload(scipy.base)", "from scipy.base import *", "del sys.path[0]", "", "class test_ctor(ScipyTestCase):", " def test_basic(self):", " A = array([[1,2],[3,4]])", " mA = matrix(A)", " assert all(mA.A == A)", "", " B = bmat(\"A,A;A,A\")", " C = bmat([[A,A], [A,A]])", " D = array([[1,2,1,2],", " [3,4,3,4],", " [1,2,1,2],", " [3,4,3,4]])", " assert all(B.A == D)", " assert all(C.A == D)", "", " vec = arange(5)", " mvec = matrix(vec)", " assert mvec.shape == (1,5)", "", "class test_properties(ScipyTestCase):", " def test_basic(self):", " from scipy import linalg", "", " A = array([[1., 2.],", " [3., 4.]])", " mA = matrix(A)", " assert allclose(linalg.inv(A), mA.I)", " assert all(array(transpose(A) == mA.T))", " assert all(array(transpose(A) == mA.H))", " assert all(A == mA.A)", "", " B = A + 2j*A", " mB = matrix(B)", " assert allclose(linalg.inv(B), mB.I)", " assert all(array(transpose(B) == mB.T))", " assert all(array(conjugate(transpose(B)), mB.H))", "", "class test_algebra(ScipyTestCase):", " def test_basic(self):", " from scipy import linalg", "", " A = array([[1., 2.],", " [3., 4.]])", " mA = matrix(A)", "", " B = identity(2)", " for i in xrange(6):", " assert allclose((mA ** i).A, B)", " B = dot(B, A)", "", " Ainv = linalg.inv(A)", " B = identity(2)", " for i in xrange(6):", " assert allclose((mA ** -i).A, B)", " B = dot(B, Ainv)", "", " assert allclose((mA * mA).A, dot(A, A))", " assert allclose((mA + mA).A, (A + A))", " assert allclose((3*mA).A, (3*A))", "" ], "deleted": [] } } ] }, { "hash": "b94cc89ffccc068f8f0d92a7ab56b7ff9523eb2c", "msg": "Fixed memset to 0 in dotblas.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T03:42:48+00:00", "author_timezone": 0, "committer_date": "2005-10-12T03:42:48+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "3d0634c3381ecdf2717b574ffd0e3dbb872a4e5e" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 4, "insertions": 7, "lines": 11, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/corelib/blasdot/_dotblas.c", "new_path": "scipy/corelib/blasdot/_dotblas.c", "filename": "_dotblas.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -226,9 +226,11 @@ dotblas_matrixproduct(PyObject *dummy, PyObject *args)\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n \t\t\t\t typenum, NULL, NULL, 0, 0, \n-\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1)); \n+\t\t\t\t (PyObject *)\\\n+\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n+\n if (ret == NULL) goto fail;\n- memset(ret->data, '\\0', PyArray_SIZE(ret));\n+ memset(ret->data, 0, PyArray_NBYTES(ret));\n \n if (ap2->nd == 0) {\n \t/* Multiplication by a scalar -- Level 1 BLAS */\n@@ -473,10 +475,11 @@ dotblas_innerproduct(PyObject *dummy, PyObject *args)\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n \t\t\t\t typenum, NULL, NULL, 0, 0, \n-\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));\n+\t\t\t\t (PyObject *)\\\n+\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n- memset(ret->data, 0, PyArray_SIZE(ret));\n+ memset(ret->data, 0, PyArray_NBYTES(ret));\n \n if (ap2->nd == 0) {\n \t/* Multiplication by a scalar -- Level 1 BLAS */\n", "added_lines": 7, "deleted_lines": 4, "source_code": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n\n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "source_code_before": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1)); \n if (ret == NULL) goto fail;\n memset(ret->data, '\\0', PyArray_SIZE(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_SIZE(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "methods": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 628, "end_line": 722, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 734, "end_line": 757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "methods_before": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 209, "complexity": 53, "token_count": 2018, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 374, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 243, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 206, "complexity": 53, "token_count": 1992, "parameters": [ "dummy", "args" ], "start_line": 380, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 240, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 625, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 731, "end_line": 754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 } ], "nloc": 608, "complexity": 138, "token_count": 5530, "diff_parsed": { "added": [ "\t\t\t\t (PyObject *)\\", "\t\t\t\t (prior2 > prior1 ? ap2 : ap1));", "", " memset(ret->data, 0, PyArray_NBYTES(ret));", "\t\t\t\t (PyObject *)\\", "\t\t\t\t (prior2 > prior1 ? ap2 : ap1));", " memset(ret->data, 0, PyArray_NBYTES(ret));" ], "deleted": [ "\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));", " memset(ret->data, '\\0', PyArray_SIZE(ret));", "\t\t\t\t (PyObject *)(prior2 > prior1 ? ap2 : ap1));", " memset(ret->data, 0, PyArray_SIZE(ret));" ] } } ] }, { "hash": "1f5d8aeef7d9bb8cd33ace3b0cd99d7be5d2431a", "msg": "Fixed memset to 0 in dotblas.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T03:43:40+00:00", "author_timezone": 0, "committer_date": "2005-10-12T03:43:40+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "b94cc89ffccc068f8f0d92a7ab56b7ff9523eb2c" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 5, "insertions": 5, "lines": 10, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/corelib/blasdot/_dotblas.c", "new_path": "scipy/corelib/blasdot/_dotblas.c", "filename": "_dotblas.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -238,14 +238,14 @@ dotblas_matrixproduct(PyObject *dummy, PyObject *args)\n \t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n \t\t\t(double *)ret->data, 1);\n \t} \n-\telse if (typenum == PyArray_FLOAT) {\n-\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n-\t\t\t(float *)ret->data, 1);\n-\t}\n \telse if (typenum == PyArray_CDOUBLE) {\n \t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n \t\t\t(double *)ret->data, 1);\n \t}\n+\telse if (typenum == PyArray_FLOAT) {\n+\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n+\t\t\t(float *)ret->data, 1);\n+\t}\n \telse if (typenum == PyArray_CFLOAT) {\n \t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n \t\t\t(float *)ret->data, 1);\n@@ -491,7 +491,7 @@ dotblas_innerproduct(PyObject *dummy, PyObject *args)\n \t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n \t\t\t(double *)ret->data, 1);\n \t}\n-\telse if (typenum == PyArray_FLOAT) {\n+\telse if (typenum == PyArray_FLOAT) {\n \t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n \t\t\t(float *)ret->data, 1);\n \t}\n", "added_lines": 5, "deleted_lines": 5, "source_code": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n\n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "source_code_before": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n\n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "methods": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 628, "end_line": 722, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 734, "end_line": 757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "methods_before": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 628, "end_line": 722, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 734, "end_line": 757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 } ], "nloc": 608, "complexity": 138, "token_count": 5530, "diff_parsed": { "added": [ "\telse if (typenum == PyArray_FLOAT) {", "\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,", "\t\t\t(float *)ret->data, 1);", "\t}", "\telse if (typenum == PyArray_FLOAT) {" ], "deleted": [ "\telse if (typenum == PyArray_FLOAT) {", "\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,", "\t\t\t(float *)ret->data, 1);", "\t}", "\telse if (typenum == PyArray_FLOAT) {" ] } } ] }, { "hash": "8c1d5fa4cff205667a48ffbb8936bac5e7e59beb", "msg": "Updated version after beta tag", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T04:05:38+00:00", "author_timezone": 0, "committer_date": "2005-10-12T04:05:38+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "1f5d8aeef7d9bb8cd33ace3b0cd99d7be5d2431a" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/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/core_version.py", "new_path": "scipy/core_version.py", "filename": "core_version.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -1,4 +1,4 @@\n-version='0.4.2'\n+version='0.4.3'\n \n try:\n import base.__svn_version__ as svn\n", "added_lines": 1, "deleted_lines": 1, "source_code": "version='0.4.3'\n\ntry:\n import base.__svn_version__ as svn\n version += '.'+svn.version\nexcept ImportError:\n pass\n\n", "source_code_before": "version='0.4.2'\n\ntry:\n import base.__svn_version__ as svn\n version += '.'+svn.version\nexcept ImportError:\n pass\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 6, "complexity": 0, "token_count": 22, "diff_parsed": { "added": [ "version='0.4.3'" ], "deleted": [ "version='0.4.2'" ] } } ] }, { "hash": "dce41a2a15d9be0cd2cd592ed209b7f30ce166ee", "msg": "Moved doc to subdir of scipy", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T05:21:47+00:00", "author_timezone": 0, "committer_date": "2005-10-12T05:21:47+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "8c1d5fa4cff205667a48ffbb8936bac5e7e59beb" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 0, "insertions": 1, "lines": 1, "files": 4, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "doc/CAPI.txt", "new_path": "scipy/doc/CAPI.txt", "filename": "CAPI.txt", "extension": "txt", "change_type": "RENAME", "diff": "", "added_lines": 0, "deleted_lines": 0, "source_code": null, "source_code_before": null, "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [], "deleted": [] } }, { "old_path": "doc/DISTUTILS.txt", "new_path": "scipy/doc/DISTUTILS.txt", "filename": "DISTUTILS.txt", "extension": "txt", "change_type": "RENAME", "diff": "", "added_lines": 0, "deleted_lines": 0, "source_code": null, "source_code_before": null, "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [], "deleted": [] } }, { "old_path": "doc/README.txt", "new_path": "scipy/doc/README.txt", "filename": "README.txt", "extension": "txt", "change_type": "RENAME", "diff": "", "added_lines": 0, "deleted_lines": 0, "source_code": null, "source_code_before": null, "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [], "deleted": [] } }, { "old_path": "scipy/setup.py", "new_path": "scipy/setup.py", "filename": "setup.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -11,6 +11,7 @@ def configuration(parent_package='',top_path=None):\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n+ config.add_data_dir('doc')\n return config.todict()\n \n if __name__ == '__main__':\n", "added_lines": 1, "deleted_lines": 0, "source_code": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "source_code_before": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 12, "complexity": 1, "token_count": 83, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 11, "complexity": 1, "token_count": 77, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 14, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 12, "complexity": 1, "token_count": 83, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "nloc": 18, "complexity": 1, "token_count": 125, "diff_parsed": { "added": [ " config.add_data_dir('doc')" ], "deleted": [] } } ] }, { "hash": "82fb451cf43785e6b7313a140e2cc3997eeb5ff2", "msg": "Moved back to 0.4.2", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T07:50:14+00:00", "author_timezone": 0, "committer_date": "2005-10-12T07:50:14+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "dce41a2a15d9be0cd2cd592ed209b7f30ce166ee" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 18, "insertions": 94, "lines": 112, "files": 3, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/base/setup.py", "new_path": "scipy/base/setup.py", "filename": "setup.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -62,6 +62,8 @@ def generate_config_h(ext, build_dir):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC')\n if config_cmd.check_func('atanhf', **kws_args):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC_FLOAT')\n+ if config_cmd.check_func('atanhl', **kws_args):\n+ moredefs.append('HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE') \n if config_cmd.check_func('isnan', **kws_args):\n moredefs.append('HAVE_ISNAN')\n \n", "added_lines": 2, "deleted_lines": 0, "source_code": "\nimport imp\nimport os\nfrom os.path import join\nfrom glob import glob\nfrom scipy.distutils.misc_util import Configuration,dot_join\nfrom distutils.dep_util import newer,newer_group\n\nfrom scipy.distutils.command.build import build\n\n\ndef configuration(parent_package='',top_path=None):\n config = Configuration('base',parent_package,top_path)\n local_dir = config.local_path\n codegen_dir = join(local_dir,'code_generators')\n\n generate_umath_py = join(codegen_dir,'generate_umath.py')\n n = dot_join(config.name,'generate_umath')\n generate_umath = imp.load_module('_'.join(n.split('.')),\n open(generate_umath_py,'U'),generate_umath_py,\n ('.py','U',1))\n\n header_dir = join(*(config.name.split('.')+['include','scipy']))\n\n def generate_config_h(ext, build_dir):\n target = join(build_dir,'config.h')\n if newer(__file__,target):\n config_cmd = config.get_config_cmd()\n print 'Generating',target\n #\n tc = generate_testcode(target)\n from distutils import sysconfig\n python_include = sysconfig.get_python_inc()\n result = config_cmd.try_run(tc,include_dirs=[python_include])\n if not result:\n raise \"ERROR: Failed to test configuration\" \n moredefs = []\n\n #\n mathlibs = []\n tc = testcode_mathlib()\n mathlibs_choices = [[],['m'],['cpml']]\n mathlib = os.environ.get('MATHLIB')\n if mathlib:\n mathlibs_choices.insert(0,mathlib.split(','))\n for libs in mathlibs_choices:\n if config_cmd.try_run(tc,libraries=libs):\n mathlibs = libs\n break\n else:\n raise \"math library missing; rerun setup.py after setting the MATHLIB env variable\"\n ext.libraries.extend(mathlibs)\n moredefs.append(('MATHLIB',','.join(mathlibs)))\n\n libs = mathlibs\n kws_args = {'libraries':libs,'decl':0,'headers':['math.h']}\n if config_cmd.check_func('expl', **kws_args):\n moredefs.append('HAVE_LONGDOUBLE_FUNCS')\n if config_cmd.check_func('expf', **kws_args):\n moredefs.append('HAVE_FLOAT_FUNCS')\n if config_cmd.check_func('asinh', **kws_args):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC')\n if config_cmd.check_func('atanhf', **kws_args):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC_FLOAT')\n if config_cmd.check_func('atanhl', **kws_args):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE') \n if config_cmd.check_func('isnan', **kws_args):\n moredefs.append('HAVE_ISNAN')\n\n if moredefs:\n target_f = open(target,'a')\n for d in moredefs:\n if isinstance(d,str):\n target_f.write('#define %s\\n' % (d))\n else:\n target_f.write('#define %s %s\\n' % (d[0],d[1]))\n target_f.close()\n else:\n mathlibs = []\n target_f = open(target)\n for line in target_f.readlines():\n s = '#define MATHLIB'\n if line.startswith(s):\n value = line[len(s):].strip()\n if value:\n mathlibs.extend(value.split(','))\n target_f.close()\n\n ext.libraries.extend(mathlibs)\n\n incl_dir = os.path.dirname(target)\n if incl_dir not in config.scipy_include_dirs:\n config.scipy_include_dirs.append(incl_dir)\n\n config.add_data_files((header_dir,target))\n return target\n\n def generate_array_api(ext,build_dir):\n target = join(build_dir,'__multiarray_api.h')\n script = join(codegen_dir,'generate_array_api.py')\n if newer(script,target):\n script = os.path.abspath(script)\n old_cwd = os.getcwd()\n os.chdir(build_dir)\n print 'executing',script\n execfile(script,{},{})\n os.chdir(old_cwd)\n config.add_data_files((header_dir,target))\n return target\n\n def generate_ufunc_api(ext,build_dir):\n target = join(build_dir,'__ufunc_api.h')\n script = join(codegen_dir,'generate_ufunc_api.py')\n if newer(script,target):\n script = os.path.abspath(script)\n old_cwd = os.getcwd()\n os.chdir(build_dir)\n print 'executing',script\n execfile(script,{},{})\n os.chdir(old_cwd)\n config.add_data_files((header_dir,target))\n return target\n\n def generate_umath_c(ext,build_dir):\n target = join(build_dir,'__umath_generated.c')\n script = generate_umath_py\n if newer(script,target):\n f = open(target,'w')\n f.write(generate_umath.make_code(generate_umath.defdict,\n generate_umath.__file__))\n f.close()\n return []\n\n config.add_data_files(join('include','scipy','*.h'))\n config.add_include_dirs('src')\n\n config.scipy_include_dirs.extend(config.paths('include'))\n\n deps = [join('src','arrayobject.c'),\n join('src','arraymethods.c'),\n join('src','scalartypes.inc.src'),\n join('src','arraytypes.inc.src'),\n join('include','scipy','*object.h')\n ]\n\n config.add_extension('multiarray',\n sources = [join('src','multiarraymodule.c'),\n generate_config_h,\n generate_array_api,\n join('src','scalartypes.inc.src'),\n join('src','arraytypes.inc.src'),\n join(codegen_dir,'generate_array_api.py'),\n join('*.py')\n ],\n depends = deps,\n )\n\n config.add_extension('umath',\n sources = [generate_config_h,\n join('src','umathmodule.c.src'),\n generate_umath_c,\n generate_ufunc_api,\n join('src','scalartypes.inc.src'),\n join('src','arraytypes.inc.src'),\n ],\n depends = [join('src','ufuncobject.c'),\n generate_umath_py,\n join(codegen_dir,'generate_ufunc_api.py')\n ]+deps,\n )\n\n config.add_extension('_compiled_base',\n sources=[join('src','_compiled_base.c'),\n generate_config_h,\n generate_array_api,\n ],\n )\n\n config.add_data_dir('tests')\n config.make_svn_version_py()\n\n return config\n\ndef testcode_mathlib():\n return \"\"\"\\\n/* check whether libm is broken */\n#include \nint main(int argc, char *argv[])\n{\n return exp(-720.) > 1.0; /* typically an IEEE denormal */\n}\n\"\"\"\n\nimport sys\ndef generate_testcode(target):\n if sys.platform == 'win32':\n target = target.replace('\\\\','\\\\\\\\')\n testcode = [r'''\n#include \n#include \n#include \n\nint main(int argc, char **argv)\n{\n\n FILE *fp;\n\n fp = fopen(\"'''+target+'''\",\"w\");\n ''']\n\n c_size_test = r'''\n#ifndef %(sz)s\n fprintf(fp,\"#define %(sz)s %%d\\n\", sizeof(%(type)s));\n#else\n fprintf(fp,\"/* #define %(sz)s %%d */\\n\", %(sz)s);\n#endif\n'''\n for sz, t in [('SIZEOF_SHORT', 'short'),\n ('SIZEOF_INT', 'int'),\n ('SIZEOF_LONG', 'long'),\n ('SIZEOF_FLOAT', 'float'),\n ('SIZEOF_DOUBLE', 'double'),\n ('SIZEOF_LONG_DOUBLE', 'long double'),\n ('SIZEOF_PY_INTPTR_T', 'Py_intptr_t'),\n ]:\n testcode.append(c_size_test % {'sz' : sz, 'type' : t})\n\n testcode.append('#ifdef PY_LONG_LONG')\n testcode.append(c_size_test % {'sz' : 'SIZEOF_LONG_LONG',\n 'type' : 'PY_LONG_LONG'})\n testcode.append(c_size_test % {'sz' : 'SIZEOF_PY_LONG_LONG',\n 'type' : 'PY_LONG_LONG'})\n \n\n testcode.append(r'''\n#else\n fprintf(fp, \"/* PY_LONG_LONG not defined */\\n\");\n#endif\n#ifndef CHAR_BIT\n {\n unsigned char var = 2;\n int i=0;\n while (var >= 2) {\n var = var << 1;\n i++;\n }\n fprintf(fp,\"#define CHAR_BIT %d\\n\", i+1);\n }\n#else\n fprintf(fp, \"/* #define CHAR_BIT %d */\\n\", CHAR_BIT);\n#endif\n fclose(fp);\n return 0;\n}\n''')\n testcode = '\\n'.join(testcode) \n return testcode\n\nif __name__=='__main__':\n from scipy.distutils.core import setup\n setup(**configuration(top_path='').todict())\n", "source_code_before": "\nimport imp\nimport os\nfrom os.path import join\nfrom glob import glob\nfrom scipy.distutils.misc_util import Configuration,dot_join\nfrom distutils.dep_util import newer,newer_group\n\nfrom scipy.distutils.command.build import build\n\n\ndef configuration(parent_package='',top_path=None):\n config = Configuration('base',parent_package,top_path)\n local_dir = config.local_path\n codegen_dir = join(local_dir,'code_generators')\n\n generate_umath_py = join(codegen_dir,'generate_umath.py')\n n = dot_join(config.name,'generate_umath')\n generate_umath = imp.load_module('_'.join(n.split('.')),\n open(generate_umath_py,'U'),generate_umath_py,\n ('.py','U',1))\n\n header_dir = join(*(config.name.split('.')+['include','scipy']))\n\n def generate_config_h(ext, build_dir):\n target = join(build_dir,'config.h')\n if newer(__file__,target):\n config_cmd = config.get_config_cmd()\n print 'Generating',target\n #\n tc = generate_testcode(target)\n from distutils import sysconfig\n python_include = sysconfig.get_python_inc()\n result = config_cmd.try_run(tc,include_dirs=[python_include])\n if not result:\n raise \"ERROR: Failed to test configuration\" \n moredefs = []\n\n #\n mathlibs = []\n tc = testcode_mathlib()\n mathlibs_choices = [[],['m'],['cpml']]\n mathlib = os.environ.get('MATHLIB')\n if mathlib:\n mathlibs_choices.insert(0,mathlib.split(','))\n for libs in mathlibs_choices:\n if config_cmd.try_run(tc,libraries=libs):\n mathlibs = libs\n break\n else:\n raise \"math library missing; rerun setup.py after setting the MATHLIB env variable\"\n ext.libraries.extend(mathlibs)\n moredefs.append(('MATHLIB',','.join(mathlibs)))\n\n libs = mathlibs\n kws_args = {'libraries':libs,'decl':0,'headers':['math.h']}\n if config_cmd.check_func('expl', **kws_args):\n moredefs.append('HAVE_LONGDOUBLE_FUNCS')\n if config_cmd.check_func('expf', **kws_args):\n moredefs.append('HAVE_FLOAT_FUNCS')\n if config_cmd.check_func('asinh', **kws_args):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC')\n if config_cmd.check_func('atanhf', **kws_args):\n moredefs.append('HAVE_INVERSE_HYPERBOLIC_FLOAT')\n if config_cmd.check_func('isnan', **kws_args):\n moredefs.append('HAVE_ISNAN')\n\n if moredefs:\n target_f = open(target,'a')\n for d in moredefs:\n if isinstance(d,str):\n target_f.write('#define %s\\n' % (d))\n else:\n target_f.write('#define %s %s\\n' % (d[0],d[1]))\n target_f.close()\n else:\n mathlibs = []\n target_f = open(target)\n for line in target_f.readlines():\n s = '#define MATHLIB'\n if line.startswith(s):\n value = line[len(s):].strip()\n if value:\n mathlibs.extend(value.split(','))\n target_f.close()\n\n ext.libraries.extend(mathlibs)\n\n incl_dir = os.path.dirname(target)\n if incl_dir not in config.scipy_include_dirs:\n config.scipy_include_dirs.append(incl_dir)\n\n config.add_data_files((header_dir,target))\n return target\n\n def generate_array_api(ext,build_dir):\n target = join(build_dir,'__multiarray_api.h')\n script = join(codegen_dir,'generate_array_api.py')\n if newer(script,target):\n script = os.path.abspath(script)\n old_cwd = os.getcwd()\n os.chdir(build_dir)\n print 'executing',script\n execfile(script,{},{})\n os.chdir(old_cwd)\n config.add_data_files((header_dir,target))\n return target\n\n def generate_ufunc_api(ext,build_dir):\n target = join(build_dir,'__ufunc_api.h')\n script = join(codegen_dir,'generate_ufunc_api.py')\n if newer(script,target):\n script = os.path.abspath(script)\n old_cwd = os.getcwd()\n os.chdir(build_dir)\n print 'executing',script\n execfile(script,{},{})\n os.chdir(old_cwd)\n config.add_data_files((header_dir,target))\n return target\n\n def generate_umath_c(ext,build_dir):\n target = join(build_dir,'__umath_generated.c')\n script = generate_umath_py\n if newer(script,target):\n f = open(target,'w')\n f.write(generate_umath.make_code(generate_umath.defdict,\n generate_umath.__file__))\n f.close()\n return []\n\n config.add_data_files(join('include','scipy','*.h'))\n config.add_include_dirs('src')\n\n config.scipy_include_dirs.extend(config.paths('include'))\n\n deps = [join('src','arrayobject.c'),\n join('src','arraymethods.c'),\n join('src','scalartypes.inc.src'),\n join('src','arraytypes.inc.src'),\n join('include','scipy','*object.h')\n ]\n\n config.add_extension('multiarray',\n sources = [join('src','multiarraymodule.c'),\n generate_config_h,\n generate_array_api,\n join('src','scalartypes.inc.src'),\n join('src','arraytypes.inc.src'),\n join(codegen_dir,'generate_array_api.py'),\n join('*.py')\n ],\n depends = deps,\n )\n\n config.add_extension('umath',\n sources = [generate_config_h,\n join('src','umathmodule.c.src'),\n generate_umath_c,\n generate_ufunc_api,\n join('src','scalartypes.inc.src'),\n join('src','arraytypes.inc.src'),\n ],\n depends = [join('src','ufuncobject.c'),\n generate_umath_py,\n join(codegen_dir,'generate_ufunc_api.py')\n ]+deps,\n )\n\n config.add_extension('_compiled_base',\n sources=[join('src','_compiled_base.c'),\n generate_config_h,\n generate_array_api,\n ],\n )\n\n config.add_data_dir('tests')\n config.make_svn_version_py()\n\n return config\n\ndef testcode_mathlib():\n return \"\"\"\\\n/* check whether libm is broken */\n#include \nint main(int argc, char *argv[])\n{\n return exp(-720.) > 1.0; /* typically an IEEE denormal */\n}\n\"\"\"\n\nimport sys\ndef generate_testcode(target):\n if sys.platform == 'win32':\n target = target.replace('\\\\','\\\\\\\\')\n testcode = [r'''\n#include \n#include \n#include \n\nint main(int argc, char **argv)\n{\n\n FILE *fp;\n\n fp = fopen(\"'''+target+'''\",\"w\");\n ''']\n\n c_size_test = r'''\n#ifndef %(sz)s\n fprintf(fp,\"#define %(sz)s %%d\\n\", sizeof(%(type)s));\n#else\n fprintf(fp,\"/* #define %(sz)s %%d */\\n\", %(sz)s);\n#endif\n'''\n for sz, t in [('SIZEOF_SHORT', 'short'),\n ('SIZEOF_INT', 'int'),\n ('SIZEOF_LONG', 'long'),\n ('SIZEOF_FLOAT', 'float'),\n ('SIZEOF_DOUBLE', 'double'),\n ('SIZEOF_LONG_DOUBLE', 'long double'),\n ('SIZEOF_PY_INTPTR_T', 'Py_intptr_t'),\n ]:\n testcode.append(c_size_test % {'sz' : sz, 'type' : t})\n\n testcode.append('#ifdef PY_LONG_LONG')\n testcode.append(c_size_test % {'sz' : 'SIZEOF_LONG_LONG',\n 'type' : 'PY_LONG_LONG'})\n testcode.append(c_size_test % {'sz' : 'SIZEOF_PY_LONG_LONG',\n 'type' : 'PY_LONG_LONG'})\n \n\n testcode.append(r'''\n#else\n fprintf(fp, \"/* PY_LONG_LONG not defined */\\n\");\n#endif\n#ifndef CHAR_BIT\n {\n unsigned char var = 2;\n int i=0;\n while (var >= 2) {\n var = var << 1;\n i++;\n }\n fprintf(fp,\"#define CHAR_BIT %d\\n\", i+1);\n }\n#else\n fprintf(fp, \"/* #define CHAR_BIT %d */\\n\", CHAR_BIT);\n#endif\n fclose(fp);\n return 0;\n}\n''')\n testcode = '\\n'.join(testcode) \n return testcode\n\nif __name__=='__main__':\n from scipy.distutils.core import setup\n setup(**configuration(top_path='').todict())\n", "methods": [ { "name": "configuration.generate_config_h", "long_name": "configuration.generate_config_h( ext , build_dir )", "filename": "setup.py", "nloc": 64, "complexity": 19, "token_count": 464, "parameters": [ "ext", "build_dir" ], "start_line": 25, "end_line": 96, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 72, "top_nesting_level": 1 }, { "name": "configuration.generate_array_api", "long_name": "configuration.generate_array_api( ext , build_dir )", "filename": "setup.py", "nloc": 12, "complexity": 2, "token_count": 86, "parameters": [ "ext", "build_dir" ], "start_line": 98, "end_line": 109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "configuration.generate_ufunc_api", "long_name": "configuration.generate_ufunc_api( ext , build_dir )", "filename": "setup.py", "nloc": 12, "complexity": 2, "token_count": 86, "parameters": [ "ext", "build_dir" ], "start_line": 111, "end_line": 122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "configuration.generate_umath_c", "long_name": "configuration.generate_umath_c( ext , build_dir )", "filename": "setup.py", "nloc": 9, "complexity": 2, "token_count": 59, "parameters": [ "ext", "build_dir" ], "start_line": 124, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 56, "complexity": 1, "token_count": 338, "parameters": [ "parent_package", "top_path" ], "start_line": 12, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 171, "top_nesting_level": 0 }, { "name": "testcode_mathlib", "long_name": "testcode_mathlib( )", "filename": "setup.py", "nloc": 9, "complexity": 1, "token_count": 6, "parameters": [], "start_line": 184, "end_line": 192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "generate_testcode", "long_name": "generate_testcode( target )", "filename": "setup.py", "nloc": 59, "complexity": 3, "token_count": 157, "parameters": [ "target" ], "start_line": 195, "end_line": 257, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 } ], "methods_before": [ { "name": "configuration.generate_config_h", "long_name": "configuration.generate_config_h( ext , build_dir )", "filename": "setup.py", "nloc": 62, "complexity": 18, "token_count": 447, "parameters": [ "ext", "build_dir" ], "start_line": 25, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 1 }, { "name": "configuration.generate_array_api", "long_name": "configuration.generate_array_api( ext , build_dir )", "filename": "setup.py", "nloc": 12, "complexity": 2, "token_count": 86, "parameters": [ "ext", "build_dir" ], "start_line": 96, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "configuration.generate_ufunc_api", "long_name": "configuration.generate_ufunc_api( ext , build_dir )", "filename": "setup.py", "nloc": 12, "complexity": 2, "token_count": 86, "parameters": [ "ext", "build_dir" ], "start_line": 109, "end_line": 120, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "configuration.generate_umath_c", "long_name": "configuration.generate_umath_c( ext , build_dir )", "filename": "setup.py", "nloc": 9, "complexity": 2, "token_count": 59, "parameters": [ "ext", "build_dir" ], "start_line": 122, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 56, "complexity": 1, "token_count": 338, "parameters": [ "parent_package", "top_path" ], "start_line": 12, "end_line": 180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 169, "top_nesting_level": 0 }, { "name": "testcode_mathlib", "long_name": "testcode_mathlib( )", "filename": "setup.py", "nloc": 9, "complexity": 1, "token_count": 6, "parameters": [], "start_line": 182, "end_line": 190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "generate_testcode", "long_name": "generate_testcode( target )", "filename": "setup.py", "nloc": 59, "complexity": 3, "token_count": 157, "parameters": [ "target" ], "start_line": 193, "end_line": 255, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 56, "complexity": 1, "token_count": 338, "parameters": [ "parent_package", "top_path" ], "start_line": 12, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 171, "top_nesting_level": 0 }, { "name": "configuration.generate_config_h", "long_name": "configuration.generate_config_h( ext , build_dir )", "filename": "setup.py", "nloc": 64, "complexity": 19, "token_count": 464, "parameters": [ "ext", "build_dir" ], "start_line": 25, "end_line": 96, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 72, "top_nesting_level": 1 } ], "nloc": 228, "complexity": 30, "token_count": 1266, "diff_parsed": { "added": [ " if config_cmd.check_func('atanhl', **kws_args):", " moredefs.append('HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE')" ], "deleted": [] } }, { "old_path": "scipy/base/src/umathmodule.c.src", "new_path": "scipy/base/src/umathmodule.c.src", "filename": "umathmodule.c.src", "extension": "src", "change_type": "MODIFY", "diff": "@@ -47,23 +47,6 @@ static double atanh(double x)\n }\n #endif\n \n-#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n-static float acoshf(float x)\n-{\n- return (float)acosh((double)(x));\n-}\n-\n-static float asinhf(float x)\n-{\n- return (float)asinh((double)(x));\n-}\n-\n-static float atanhf(float x)\n-{\n- return (float)atanh((double)(x));\n-}\n-#endif\n-\n #ifdef HAVE_HYPOT\n #if !defined(NeXT) && !defined(_MSC_VER)\n extern double hypot(double, double);\n@@ -239,6 +222,97 @@ hypot, atan2, pow\n /**end repeat**/\n \n \n+#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n+#ifdef HAVE_FLOAT_FUNCS\n+static float acoshf(float x)\n+{\n+\treturn logf(x + sqrtf((x-1.0)*(x+1.0)));\n+}\n+\n+static float asinhf(float xx)\n+{\n+\tfloat x;\n+\tint sign;\n+\tif (xx < 0.0) {\n+\t\tsign = -1;\n+\t\tx = -xx;\n+\t}\n+\telse {\n+\t\tsign = 1;\n+\t\tx = xx;\n+\t}\n+\treturn sign*logf(x + sqrtf(x*x+1.0));\n+}\n+\n+static float atanhf(float x)\n+{\n+\treturn 0.5*logf((1.0+x)/(1.0-x));\n+}\n+#else\n+static float acoshf(float x)\n+{\n+ return (float)acosh((double)(x));\n+}\n+\n+static float asinhf(float x)\n+{\n+ return (float)asinh((double)(x));\n+}\n+\n+static float atanhf(float x)\n+{\n+ return (float)atanh((double)(x));\n+}\n+#endif\n+#endif\n+\n+\n+#if !defined(HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE)\n+#ifdef HAVE_LONGDOUBLE_FUNCS\n+static longdouble acoshl(longdouble x)\n+{\n+\treturn logl(x + sqrtl((x-1.0)*(x+1.0)));\n+}\n+\n+static longdouble asinhl(longdouble xx)\n+{\n+\tlongdouble x;\n+\tint sign;\n+\tif (xx < 0.0) {\n+\t\tsign = -1;\n+\t\tx = -xx;\n+\t}\n+\telse {\n+\t\tsign = 1;\n+\t\tx = xx;\n+\t}\n+\treturn sign*logl(x + sqrtl(x*x+1.0));\n+}\n+\n+static longdouble atanhl(longdouble x)\n+{\n+\treturn 0.5*logl((1.0+x)/(1.0-x));\n+}\n+#else\n+static longdouble acoshl(longdouble x)\n+{\n+ return (longdouble)acosh((double)(x));\n+}\n+\n+static longdouble asinhl(longdouble x)\n+{\n+ return (longdouble)asinh((double)(x));\n+}\n+\n+static longdouble atanhl(longdouble x)\n+{\n+ return (longdouble)atanh((double)(x));\n+}\n+#endif\n+#endif\n+\n+\n+\n \n /* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n", "added_lines": 91, "deleted_lines": 17, "source_code": "/* -*- c -*- */\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#define _UMATHMODULE\n#include \"scipy/ufuncobject.h\"\n#include \"abstract.h\"\n#include \n\n\n/* A whole slew of basic math functions are provided originally 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#ifndef M_PI\n#define M_PI 3.14159265358979323846264338328\n#endif\n\n#ifndef HAVE_INVERSE_HYPERBOLIC\nstatic double acosh(double x)\n{\n\treturn log(x + sqrt((x-1.0)*(x+1.0)));\n}\n\nstatic double asinh(double xx)\n{\n\tdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*log(x + sqrt(x*x+1.0));\n}\n\nstatic double atanh(double x)\n{\n\treturn 0.5*log((1.0+x)/(1.0-x));\n}\n#endif\n\n#ifdef HAVE_HYPOT\n#if !defined(NeXT) && !defined(_MSC_VER)\nextern double hypot(double, double);\n#endif\n#else\ndouble hypot(double x, double y)\n{\n\tdouble yx;\n\n\tx = fabs(x);\n\ty = fabs(y);\n\tif (x < y) {\n\t\tdouble temp = x;\n\t\tx = y;\n\t\ty = temp;\n\t}\n\tif (x == 0.)\n\t\treturn 0.;\n\telse {\n\t\tyx = y/x;\n\t\treturn x*sqrt(1.+yx*yx);\n\t}\n}\n#endif\n\n\n\n/* Define isnan, isinf, isfinite, signbit if needed */\n/* Use fpclassify if possible */\n/* isnan, isinf --\n these will use macros and then fpclassify if available before\n defaulting to a dumb convert-to-double version...\n\n isfinite -- define a macro if not already available\n signbit -- if macro available use it, otherwise define a function\n and a dumb convert-to-double version for other types.\n*/\n\n#if defined(fpclassify)\n\n#if !defined(isnan)\n#define isnan(x) (fpclassify(x) == FP_NAN)\n#endif\n#if !defined(isinf)\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n#endif\n\n#else /* check to see if already have a function like this */\n\n#if !defined(HAVE_ISNAN)\n\n#if !defined(isnan)\n#include \"_isnan.c\"\n#endif\n\n#if !defined(isinf)\n#define isinf(x) (!isnan((x)) && isnan((x)-(x)))\n#endif\n\n#endif /* HAVE_ISNAN */\n#endif /* !defined(isnan) */\n\n\n/* Define signbit if needed */\n#if !defined(signbit)\n#include \"_signbit.c\"\n#endif\n\n\n/* Now defined the extended type macros */\n\n/* We assume that isnan and isinf are defined in the same \n way: as functions, with extended functions, or macros\n*/\n\n#if !defined(isnan)\n\n#if !defined(HAVE_LONGDOUBLE_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanl(x) isnan((double)(x))\n#define isinfl(x) (!isnanl((x)) && isnanl((x)-(x)))\n#endif\n\n#if !defined(HAVE_FLOAT_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanf(x) isnan((double)(x))\n#define isinff(x) (!isnanf((x)) && isnanf((x)-(x)))\n#endif\n\n#else /* !defined(isnan) */\n\n#define isnanl(x) isnan((x))\n#define isnanf(x) isnan((x))\n#define isinfl(x) isinf((x))\n#define isinff(x) isinf((x))\n\n#endif /* !defined(isnan) */\n\n\n\n#if !defined(signbit)\n#define signbitl(x) ((longdouble) signbit((double)(x)))\n#define signbitf(x) ((float) signbit((double) (x)))\n#else\n#define signbitl(x) signbit((x))\n#define signbitf(x) signbit((x))\n#endif\n\n#if !defined(isfinite)\n#define isfinite(x) (!(isinf((x)) || isnan((x))))\n#endif\n#define isfinitef(x) (!(isinff((x)) || isnanf((x))))\n#define isfinitel(x) (!(isinfl((x)) || isnanl((x))))\n\n\n/* First, the C functions that do the real work */\n\n/* if C99 extensions not availble\n\nthen define dummy functions that use the double versions for\n\nsin, cos, tan\nsinh, cosh, tanh, \nfabs, floor, ceil, fmod, sqrt, log10, log, exp, fabs\nasin, acos, atan, \nasinh, acosh, atanh\n\nhypot, atan2, pow\n\n*/\n\n/**begin repeat\n\n#kind=(sin,cos,tan,sinh,cosh,tanh,fabs,floor,ceil,sqrt,log10,log,exp,asin,acos,atan,asinh,acosh,atanh)*2#\n#typ=longdouble*19, float*19#\n#c=l*19,f*19#\n#TYPE=LONGDOUBLE*19, FLOAT*19#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x) {\n\treturn (@typ@) @kind@((double)x);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n\n#kind=(atan2,hypot,pow,fmod)*2#\n#typ=longdouble*4, float*4#\n#c=l*4,f*4#\n#TYPE=LONGDOUBLE*4,FLOAT*4#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x, @typ@ y) {\n\treturn (@typ@) @kind@((double)x, (double) y);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n#kind=modf*2#\n#typ=longdouble, float#\n#c=l,f#\n#TYPE=LONGDOUBLE, FLOAT#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ modf@c@(@typ@ x, @typ@ *iptr) {\n double nx, niptr, y;\n nx = (double) x;\n y = modf(nx, &niptr);\n *iptr = (@typ@) niptr;\n return (@typ@) y;\n}\n#endif\n/**end repeat**/\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n#ifdef HAVE_FLOAT_FUNCS\nstatic float acoshf(float x)\n{\n\treturn logf(x + sqrtf((x-1.0)*(x+1.0)));\n}\n\nstatic float asinhf(float xx)\n{\n\tfloat x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logf(x + sqrtf(x*x+1.0));\n}\n\nstatic float atanhf(float x)\n{\n\treturn 0.5*logf((1.0+x)/(1.0-x));\n}\n#else\nstatic float acoshf(float x)\n{\n return (float)acosh((double)(x));\n}\n\nstatic float asinhf(float x)\n{\n return (float)asinh((double)(x));\n}\n\nstatic float atanhf(float x)\n{\n return (float)atanh((double)(x));\n}\n#endif\n#endif\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE)\n#ifdef HAVE_LONGDOUBLE_FUNCS\nstatic longdouble acoshl(longdouble x)\n{\n\treturn logl(x + sqrtl((x-1.0)*(x+1.0)));\n}\n\nstatic longdouble asinhl(longdouble xx)\n{\n\tlongdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logl(x + sqrtl(x*x+1.0));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n\treturn 0.5*logl((1.0+x)/(1.0-x));\n}\n#else\nstatic longdouble acoshl(longdouble x)\n{\n return (longdouble)acosh((double)(x));\n}\n\nstatic longdouble asinhl(longdouble x)\n{\n return (longdouble)asinh((double)(x));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n return (longdouble)atanh((double)(x));\n}\n#endif\n#endif\n\n\n\n\n/* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n segfaults if ufuncobject.c is compiled with a different compiler\n than an extension that makes use of the UFUNC API\n*/\n\n/**begin repeat\n\n#typ=float, double, longdouble#\n#c=f,,l#\n*/\n\n/* constants */\nstatic c@typ@ nc_1@c@ = {1., 0.};\nstatic c@typ@ nc_half@c@ = {0.5, 0.};\nstatic c@typ@ nc_i@c@ = {0., 1.};\nstatic c@typ@ nc_i2@c@ = {0., 0.5};\n/*\nstatic c@typ@ nc_mi@c@ = {0., -1.};\nstatic c@typ@ nc_pi2@c@ = {M_PI/2., 0.};\n*/\n\nstatic void\nnc_sum@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real + b->real;\n\tr->imag = a->imag + b->imag;\n\treturn;\n}\n\nstatic void\nnc_diff@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real - b->real;\n\tr->imag = a->imag - b->imag;\n\treturn;\n}\n\nstatic void\nnc_neg@c@(c@typ@ *a, c@typ@ *r)\n{\n\tr->real = -a->real;\n\tr->imag = -a->imag;\n\treturn;\n}\n\nstatic void\nnc_prod@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\tr->real = ar*br - ai*bi;\n\tr->imag = ar*bi + ai*br;\n\treturn;\n}\n\nstatic void\nnc_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = (ar*br + ai*bi)/d;\n\tr->imag = (ai*br - ar*bi)/d;\n\treturn;\n}\n\nstatic void\nnc_floor_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = floor@c@((ar*br + ai*bi)/d);\n\tr->imag = 0;\n\treturn;\n}\n\nstatic void \nnc_sqrt@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ s,d;\n\tif (x->real == 0. && x->imag == 0.)\n\t\t*r = *x;\n\telse {\n\t\ts = sqrt@c@(0.5*(fabs@c@(x->real) + hypot@c@(x->real,x->imag)));\n\t\td = 0.5*x->imag/s;\n\t\tif (x->real > 0.) {\n\t\t\tr->real = s;\n\t\t\tr->imag = d;\n\t\t}\n\t\telse if (x->imag >= 0.) {\n\t\t\tr->real = d;\n\t\t\tr->imag = s;\n\t\t}\n\t\telse {\n\t\t\tr->real = -d;\n\t\t\tr->imag = -s;\n\t\t}\n\t}\n\treturn;\n}\n\nstatic void \nnc_log@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ l = hypot@c@(x->real,x->imag);\n\tr->imag = atan2@c@(x->imag, x->real);\n\tr->real = log@c@(l);\n\treturn;\n}\n\nstatic void \nnc_exp@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ a = exp@c@(x->real);\n\tr->real = a*cos@c@(x->imag);\n\tr->imag = a*sin@c@(x->imag);\n\treturn;\n}\n\nstatic void\nnc_pow@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\t\n\tif (br == 0. && bi == 0.) {\n\t\tr->real = 1.;\n\t\tr->imag = 0.;\n\t}\n\telse if (ar == 0. && ai == 0.) {\n\t\tr->real = 0.;\n\t\tr->imag = 0.;\n\t}\n\telse {\n\t\tnc_log@c@(a, r);\n\t\tnc_prod@c@(r, b, r);\n\t\tnc_exp@c@(r, r);\n\t}\n\treturn;\n}\n\n\nstatic void \nnc_prodi@c@(c@typ@ *x, c@typ@ *r)\n{\n\tr->real = -x->imag;\n\tr->imag = x->real;\n\treturn;\n}\n\n\nstatic void \nnc_acos@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x,x,r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn; \n\t/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));\n\t*/\n}\n\nstatic void \nnc_acosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\treturn;\n\t/*\n\t return nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));\n\t*/\n}\n\nstatic void \nnc_asin@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(x, pa);\n\tnc_sum@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/* \n\t return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));\n\t*/\n}\n\n\nstatic void \nnc_asinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_sum@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_diff@c@(r, x, r);\n\tnc_log@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/*\n\t return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));\n\t*/\n}\n\nstatic void \nnc_atan@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_i@c@, x, pa);\n\tnc_sum@c@(&nc_i@c@, x, r);\n\tnc_quot@c@(r, pa, r);\n\tnc_log@c@(r,r);\n\tnc_prod@c@(&nc_i2@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));\n\t*/\n}\n\nstatic void \nnc_atanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_1@c@, x, r);\n\tnc_sum@c@(&nc_1@c@, x, pa);\n\tnc_quot@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prod@c@(&nc_half@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));\n\t*/\n}\n\nstatic void\nnc_cos@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos@c@(xr)*cosh@c@(xi);\n\tr->imag = -sin@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void \nnc_cosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos(xi)*cosh(xr);\n\tr->imag = sin(xi)*sinh(xr);\n\treturn;\n}\n\n\n#define M_LOG10_E 0.434294481903251827651128918916605082294397\n\nstatic void \nnc_log10@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_log@c@(x, r);\n\tr->real *= M_LOG10_E;\n\tr->imag *= M_LOG10_E;\n\treturn;\n}\n\nstatic void \nnc_sin@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = sin@c@(xr)*cosh@c@(xi);\n\tr->imag = cos@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void\nnc_sinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag; \n\tr->real = cos@c@(xi)*sinh@c@(xr);\n\tr->imag = sin@c@(xi)*cosh@c@(xr);\n\treturn;\n}\n\nstatic void \nnc_tan@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ sr,cr,shi,chi;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsr = sin@c@(xr);\n\tcr = cos@c@(xr);\n\tshi = sinh(xi);\n\tchi = cosh(xi);\n\trs = sr*chi;\n\tis = cr*shi;\n\trc = cr*chi;\n\tic = -sr*shi;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\nstatic void \nnc_tanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ si,ci,shr,chr;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsi = sin@c@(xi);\n\tci = cos@c@(xi);\n\tshr = sinh@c@(xr);\n\tchr = cosh@c@(xr);\n\trs = ci*shr;\n\tis = si*chr;\n\trc = ci*chr;\n\tic = si*shr;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\n/**end repeat**/\n\n\n/**begin repeat\n\n#TYPE=(BOOL, BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE)*2#\n#OP=||, +*13, ^, -*13#\n#kind=add*14, subtract*14#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble)*2#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else\n\tah = al = bh = bl = 0;\n#endif\n\n /* 128-bit product: z*2**64 + (x+y)*2**32 + w */\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n\t/* *c = ((x + y)<<32) + w; */\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>32) || (y>>32) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 32);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>64) || (y>>64) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 64);\n#else\n\treturn 0;\n#endif\n\t\n}\n\nstatic int slonglong_overflow(longlong a0, longlong b0)\n{\n\tulonglong a, b;\n ulonglong ah, al, bh, bl, w, x, y, z;\n\n /* Convert to non-negative quantities */\n\tif (a0 < 0) { a = -a0; } else { a = a0; }\n\tif (b0 < 0) { b = -b0; } else { b = b0; }\n\n\n#if SIZEOF_LONGLONG == 64\n\tah = (a >> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else \n\tah = al = bh = bl = 0;\n#endif\n\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n /* \n\t ulonglong c = ((x + y)<<32) + w;\n\t if ((a0 < 0) ^ (b0 < 0))\n\t *c = -c;\n\t else \n\t *c = c\n\t */\n\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>31) || (y>>31) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 31);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>63) || (y>>63) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 63);\n#else\n\treturn 0;\n#endif\n}\n\n/** end direct numarray code **/\n\nstatic void\nBOOL_multiply(char **args, intp *dimensions, intp *steps, void *func) {\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nULONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tulonglong temp;\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\telse if (temp < MIN_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nLONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tlonglong temp;\n\tfor (i=0; i, >=, <, <=, ==, !=, &&, ||, &, |, ^#\n**/\nstatic void\nBOOL_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tBool in1, in2;\n\tfor(i=0; i*16, >=*16, <*16, <=*16#\n#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*4#\n#kind= greater*16, greater_equal*16, less*16, less_equal*16#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i>*10#\n#kind=remainder*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i*17, <*17#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*2#\n#kind= maximum*17, minimum*17#\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i\n\n\n/* A whole slew of basic math functions are provided originally 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#ifndef M_PI\n#define M_PI 3.14159265358979323846264338328\n#endif\n\n#ifndef HAVE_INVERSE_HYPERBOLIC\nstatic double acosh(double x)\n{\n\treturn log(x + sqrt((x-1.0)*(x+1.0)));\n}\n\nstatic double asinh(double xx)\n{\n\tdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*log(x + sqrt(x*x+1.0));\n}\n\nstatic double atanh(double x)\n{\n\treturn 0.5*log((1.0+x)/(1.0-x));\n}\n#endif\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\nstatic float acoshf(float x)\n{\n return (float)acosh((double)(x));\n}\n\nstatic float asinhf(float x)\n{\n return (float)asinh((double)(x));\n}\n\nstatic float atanhf(float x)\n{\n return (float)atanh((double)(x));\n}\n#endif\n\n#ifdef HAVE_HYPOT\n#if !defined(NeXT) && !defined(_MSC_VER)\nextern double hypot(double, double);\n#endif\n#else\ndouble hypot(double x, double y)\n{\n\tdouble yx;\n\n\tx = fabs(x);\n\ty = fabs(y);\n\tif (x < y) {\n\t\tdouble temp = x;\n\t\tx = y;\n\t\ty = temp;\n\t}\n\tif (x == 0.)\n\t\treturn 0.;\n\telse {\n\t\tyx = y/x;\n\t\treturn x*sqrt(1.+yx*yx);\n\t}\n}\n#endif\n\n\n\n/* Define isnan, isinf, isfinite, signbit if needed */\n/* Use fpclassify if possible */\n/* isnan, isinf --\n these will use macros and then fpclassify if available before\n defaulting to a dumb convert-to-double version...\n\n isfinite -- define a macro if not already available\n signbit -- if macro available use it, otherwise define a function\n and a dumb convert-to-double version for other types.\n*/\n\n#if defined(fpclassify)\n\n#if !defined(isnan)\n#define isnan(x) (fpclassify(x) == FP_NAN)\n#endif\n#if !defined(isinf)\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n#endif\n\n#else /* check to see if already have a function like this */\n\n#if !defined(HAVE_ISNAN)\n\n#if !defined(isnan)\n#include \"_isnan.c\"\n#endif\n\n#if !defined(isinf)\n#define isinf(x) (!isnan((x)) && isnan((x)-(x)))\n#endif\n\n#endif /* HAVE_ISNAN */\n#endif /* !defined(isnan) */\n\n\n/* Define signbit if needed */\n#if !defined(signbit)\n#include \"_signbit.c\"\n#endif\n\n\n/* Now defined the extended type macros */\n\n/* We assume that isnan and isinf are defined in the same \n way: as functions, with extended functions, or macros\n*/\n\n#if !defined(isnan)\n\n#if !defined(HAVE_LONGDOUBLE_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanl(x) isnan((double)(x))\n#define isinfl(x) (!isnanl((x)) && isnanl((x)-(x)))\n#endif\n\n#if !defined(HAVE_FLOAT_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanf(x) isnan((double)(x))\n#define isinff(x) (!isnanf((x)) && isnanf((x)-(x)))\n#endif\n\n#else /* !defined(isnan) */\n\n#define isnanl(x) isnan((x))\n#define isnanf(x) isnan((x))\n#define isinfl(x) isinf((x))\n#define isinff(x) isinf((x))\n\n#endif /* !defined(isnan) */\n\n\n\n#if !defined(signbit)\n#define signbitl(x) ((longdouble) signbit((double)(x)))\n#define signbitf(x) ((float) signbit((double) (x)))\n#else\n#define signbitl(x) signbit((x))\n#define signbitf(x) signbit((x))\n#endif\n\n#if !defined(isfinite)\n#define isfinite(x) (!(isinf((x)) || isnan((x))))\n#endif\n#define isfinitef(x) (!(isinff((x)) || isnanf((x))))\n#define isfinitel(x) (!(isinfl((x)) || isnanl((x))))\n\n\n/* First, the C functions that do the real work */\n\n/* if C99 extensions not availble\n\nthen define dummy functions that use the double versions for\n\nsin, cos, tan\nsinh, cosh, tanh, \nfabs, floor, ceil, fmod, sqrt, log10, log, exp, fabs\nasin, acos, atan, \nasinh, acosh, atanh\n\nhypot, atan2, pow\n\n*/\n\n/**begin repeat\n\n#kind=(sin,cos,tan,sinh,cosh,tanh,fabs,floor,ceil,sqrt,log10,log,exp,asin,acos,atan,asinh,acosh,atanh)*2#\n#typ=longdouble*19, float*19#\n#c=l*19,f*19#\n#TYPE=LONGDOUBLE*19, FLOAT*19#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x) {\n\treturn (@typ@) @kind@((double)x);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n\n#kind=(atan2,hypot,pow,fmod)*2#\n#typ=longdouble*4, float*4#\n#c=l*4,f*4#\n#TYPE=LONGDOUBLE*4,FLOAT*4#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x, @typ@ y) {\n\treturn (@typ@) @kind@((double)x, (double) y);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n#kind=modf*2#\n#typ=longdouble, float#\n#c=l,f#\n#TYPE=LONGDOUBLE, FLOAT#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ modf@c@(@typ@ x, @typ@ *iptr) {\n double nx, niptr, y;\n nx = (double) x;\n y = modf(nx, &niptr);\n *iptr = (@typ@) niptr;\n return (@typ@) y;\n}\n#endif\n/**end repeat**/\n\n\n\n/* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n segfaults if ufuncobject.c is compiled with a different compiler\n than an extension that makes use of the UFUNC API\n*/\n\n/**begin repeat\n\n#typ=float, double, longdouble#\n#c=f,,l#\n*/\n\n/* constants */\nstatic c@typ@ nc_1@c@ = {1., 0.};\nstatic c@typ@ nc_half@c@ = {0.5, 0.};\nstatic c@typ@ nc_i@c@ = {0., 1.};\nstatic c@typ@ nc_i2@c@ = {0., 0.5};\n/*\nstatic c@typ@ nc_mi@c@ = {0., -1.};\nstatic c@typ@ nc_pi2@c@ = {M_PI/2., 0.};\n*/\n\nstatic void\nnc_sum@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real + b->real;\n\tr->imag = a->imag + b->imag;\n\treturn;\n}\n\nstatic void\nnc_diff@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real - b->real;\n\tr->imag = a->imag - b->imag;\n\treturn;\n}\n\nstatic void\nnc_neg@c@(c@typ@ *a, c@typ@ *r)\n{\n\tr->real = -a->real;\n\tr->imag = -a->imag;\n\treturn;\n}\n\nstatic void\nnc_prod@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\tr->real = ar*br - ai*bi;\n\tr->imag = ar*bi + ai*br;\n\treturn;\n}\n\nstatic void\nnc_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = (ar*br + ai*bi)/d;\n\tr->imag = (ai*br - ar*bi)/d;\n\treturn;\n}\n\nstatic void\nnc_floor_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = floor@c@((ar*br + ai*bi)/d);\n\tr->imag = 0;\n\treturn;\n}\n\nstatic void \nnc_sqrt@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ s,d;\n\tif (x->real == 0. && x->imag == 0.)\n\t\t*r = *x;\n\telse {\n\t\ts = sqrt@c@(0.5*(fabs@c@(x->real) + hypot@c@(x->real,x->imag)));\n\t\td = 0.5*x->imag/s;\n\t\tif (x->real > 0.) {\n\t\t\tr->real = s;\n\t\t\tr->imag = d;\n\t\t}\n\t\telse if (x->imag >= 0.) {\n\t\t\tr->real = d;\n\t\t\tr->imag = s;\n\t\t}\n\t\telse {\n\t\t\tr->real = -d;\n\t\t\tr->imag = -s;\n\t\t}\n\t}\n\treturn;\n}\n\nstatic void \nnc_log@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ l = hypot@c@(x->real,x->imag);\n\tr->imag = atan2@c@(x->imag, x->real);\n\tr->real = log@c@(l);\n\treturn;\n}\n\nstatic void \nnc_exp@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ a = exp@c@(x->real);\n\tr->real = a*cos@c@(x->imag);\n\tr->imag = a*sin@c@(x->imag);\n\treturn;\n}\n\nstatic void\nnc_pow@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\t\n\tif (br == 0. && bi == 0.) {\n\t\tr->real = 1.;\n\t\tr->imag = 0.;\n\t}\n\telse if (ar == 0. && ai == 0.) {\n\t\tr->real = 0.;\n\t\tr->imag = 0.;\n\t}\n\telse {\n\t\tnc_log@c@(a, r);\n\t\tnc_prod@c@(r, b, r);\n\t\tnc_exp@c@(r, r);\n\t}\n\treturn;\n}\n\n\nstatic void \nnc_prodi@c@(c@typ@ *x, c@typ@ *r)\n{\n\tr->real = -x->imag;\n\tr->imag = x->real;\n\treturn;\n}\n\n\nstatic void \nnc_acos@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x,x,r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn; \n\t/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));\n\t*/\n}\n\nstatic void \nnc_acosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\treturn;\n\t/*\n\t return nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));\n\t*/\n}\n\nstatic void \nnc_asin@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(x, pa);\n\tnc_sum@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/* \n\t return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));\n\t*/\n}\n\n\nstatic void \nnc_asinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_sum@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_diff@c@(r, x, r);\n\tnc_log@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/*\n\t return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));\n\t*/\n}\n\nstatic void \nnc_atan@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_i@c@, x, pa);\n\tnc_sum@c@(&nc_i@c@, x, r);\n\tnc_quot@c@(r, pa, r);\n\tnc_log@c@(r,r);\n\tnc_prod@c@(&nc_i2@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));\n\t*/\n}\n\nstatic void \nnc_atanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_1@c@, x, r);\n\tnc_sum@c@(&nc_1@c@, x, pa);\n\tnc_quot@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prod@c@(&nc_half@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));\n\t*/\n}\n\nstatic void\nnc_cos@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos@c@(xr)*cosh@c@(xi);\n\tr->imag = -sin@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void \nnc_cosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos(xi)*cosh(xr);\n\tr->imag = sin(xi)*sinh(xr);\n\treturn;\n}\n\n\n#define M_LOG10_E 0.434294481903251827651128918916605082294397\n\nstatic void \nnc_log10@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_log@c@(x, r);\n\tr->real *= M_LOG10_E;\n\tr->imag *= M_LOG10_E;\n\treturn;\n}\n\nstatic void \nnc_sin@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = sin@c@(xr)*cosh@c@(xi);\n\tr->imag = cos@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void\nnc_sinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag; \n\tr->real = cos@c@(xi)*sinh@c@(xr);\n\tr->imag = sin@c@(xi)*cosh@c@(xr);\n\treturn;\n}\n\nstatic void \nnc_tan@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ sr,cr,shi,chi;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsr = sin@c@(xr);\n\tcr = cos@c@(xr);\n\tshi = sinh(xi);\n\tchi = cosh(xi);\n\trs = sr*chi;\n\tis = cr*shi;\n\trc = cr*chi;\n\tic = -sr*shi;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\nstatic void \nnc_tanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ si,ci,shr,chr;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsi = sin@c@(xi);\n\tci = cos@c@(xi);\n\tshr = sinh@c@(xr);\n\tchr = cosh@c@(xr);\n\trs = ci*shr;\n\tis = si*chr;\n\trc = ci*chr;\n\tic = si*shr;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\n/**end repeat**/\n\n\n/**begin repeat\n\n#TYPE=(BOOL, BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE)*2#\n#OP=||, +*13, ^, -*13#\n#kind=add*14, subtract*14#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble)*2#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else\n\tah = al = bh = bl = 0;\n#endif\n\n /* 128-bit product: z*2**64 + (x+y)*2**32 + w */\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n\t/* *c = ((x + y)<<32) + w; */\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>32) || (y>>32) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 32);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>64) || (y>>64) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 64);\n#else\n\treturn 0;\n#endif\n\t\n}\n\nstatic int slonglong_overflow(longlong a0, longlong b0)\n{\n\tulonglong a, b;\n ulonglong ah, al, bh, bl, w, x, y, z;\n\n /* Convert to non-negative quantities */\n\tif (a0 < 0) { a = -a0; } else { a = a0; }\n\tif (b0 < 0) { b = -b0; } else { b = b0; }\n\n\n#if SIZEOF_LONGLONG == 64\n\tah = (a >> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else \n\tah = al = bh = bl = 0;\n#endif\n\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n /* \n\t ulonglong c = ((x + y)<<32) + w;\n\t if ((a0 < 0) ^ (b0 < 0))\n\t *c = -c;\n\t else \n\t *c = c\n\t */\n\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>31) || (y>>31) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 31);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>63) || (y>>63) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 63);\n#else\n\treturn 0;\n#endif\n}\n\n/** end direct numarray code **/\n\nstatic void\nBOOL_multiply(char **args, intp *dimensions, intp *steps, void *func) {\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nULONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tulonglong temp;\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\telse if (temp < MIN_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nLONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tlonglong temp;\n\tfor (i=0; i, >=, <, <=, ==, !=, &&, ||, &, |, ^#\n**/\nstatic void\nBOOL_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tBool in1, in2;\n\tfor(i=0; i*16, >=*16, <*16, <=*16#\n#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*4#\n#kind= greater*16, greater_equal*16, less*16, less_equal*16#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i>*10#\n#kind=remainder*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i*17, <*17#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*2#\n#kind= maximum*17, minimum*17#\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i,)\n+ - path to data directory where python datadir suffix defaults\n+ to package dir.\n+ If path is not absolute then it's datadir suffix is\n+ package dir + subdirname of the path.\n \"\"\"\n+ if type(data_path) is type(()):\n+ assert len(data_path)==2,`data_path`\n+ d,data_path = data_path\n+ else:\n+ d = None\n+ assert type(data_path) is type(''),`data_path`\n for path in self.paths(data_path):\n+ if not os.path.exists(path):\n+ print 'Not existing data path',path\n+ continue\n filenames = []\n os.path.walk(path, _gsf_visit_func,filenames)\n if not os.path.isabs(path):\n- self.add_data_files((path,filenames))\n+ if d is None:\n+ ds = path\n+ else:\n+ ds = os.path.join(*([d]+os.path.normpath(path).split()[1:]))\n+ self.add_data_files((ds,filenames))\n else:\n- self.add_data_files(*filenames)\n+ if d is None:\n+ self.add_data_files(*filenames)\n+ else:\n+ self.add_data_files((d,filenames))\n return\n \n def add_data_files(self,*files):\n@@ -459,7 +481,6 @@ def add_data_files(self,*files):\n dist.data_files.extend(data_dict.items())\n else:\n self.data_files.extend(data_dict.items())\n-\n return \n \n def add_include_dirs(self,*paths):\n", "added_lines": 25, "deleted_lines": 4, "source_code": "import os\nimport re\nimport sys\nimport imp\nimport copy\nimport types\nimport glob\n\ndef allpath(name):\n \"Convert a /-separated pathname to one using the OS's path separator.\"\n splitted = name.split('/')\n return os.path.join(*splitted)\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" Return path of the module.\n\n Returned path is relative to parent_path when given,\n otherwise it is absolute path.\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 __import__(mod_name)\n mod = sys.modules[mod_name]\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\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\n#########################\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#########################\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 False\n return True\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 True\n return False\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 True\n return False\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\n\ndef _get_headers(directory_list):\n # get *.h files from list of directories\n headers = []\n for dir in directory_list:\n head = glob.glob(os.path.join(dir,\"*.h\")) #XXX: *.hpp files??\n headers.extend(head)\n return headers\n\ndef _get_directories(list_of_sources):\n # get unique directories from list of sources.\n direcs = []\n for file in list_of_sources:\n dir = os.path.split(file)\n if dir[0] != '' and not dir[0] in direcs:\n direcs.append(dir[0])\n return direcs\n\ndef get_dependencies(sources):\n #XXX scan sources for include statements\n return _get_headers(_get_directories(sources))\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n if type(directory) is not type(''):\n return False\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 False\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n\ndef _gsf_visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn','build']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n ext = os.path.splitext(fullname)[1]\n if ext and ext in ['.pyc','.o']:\n continue\n if os.path.isfile(fullname):\n filenames.append(fullname)\n\ndef get_ext_source_files(ext):\n # Get sources and any include files in the same directory.\n filenames = []\n sources = filter(lambda s:type(s) is types.StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_script_files(scripts):\n scripts = filter(lambda s:type(s) is types.StringType,scripts)\n return scripts\n\ndef get_lib_source_files(lib):\n filenames = []\n sources = lib[1].get('sources',[])\n sources = filter(lambda s:type(s) is types.StringType,sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n depends = build_info.get('depends',[])\n for d in depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_data_files(data):\n if type(data) is types.StringType:\n return [data]\n sources = data[1]\n filenames = []\n for s in sources:\n if callable(s):\n s = s()\n if s is None:\n continue\n if is_local_src_dir(s):\n os.path.walk(s,_gsf_visit_func,filenames)\n elif type(s) is type('') and os.path.isfile(s):\n filenames.append(s)\n else:\n raise TypeError,`s`\n return filenames\n\ndef dot_join(*args):\n return '.'.join(filter(None,args))\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\n######################\n\nclass Configuration:\n\n _list_keys = ['packages','ext_modules','data_files','include_dirs',\n 'libraries','headers','scripts']\n _dict_keys = ['package_dir']\n\n scipy_include_dirs = []\n\n def __init__(self,\n package_name=None,\n parent_name=None,\n top_path=None,\n package_path=None,\n **attrs):\n \"\"\" Construct configuration instance of a package.\n \"\"\"\n self.name = dot_join(parent_name, package_name)\n\n caller_frame = get_frame(1)\n caller_name = eval('__name__',caller_frame.f_globals,caller_frame.f_locals)\n \n self.local_path = get_path(caller_name, top_path)\n if top_path is None:\n top_path = self.local_path\n if package_path is None:\n package_path = self.local_path\n elif os.path.isdir(os.path.join(self.local_path,package_path)):\n package_path = os.path.join(self.local_path,package_path)\n self.top_path = top_path\n\n self.list_keys = copy.copy(self._list_keys)\n self.dict_keys = copy.copy(self._dict_keys)\n\n for n in self.list_keys:\n setattr(self,n,copy.copy(attrs.get(n,[])))\n\n for n in self.dict_keys:\n setattr(self,n,copy.copy(attrs.get(n,{})))\n\n known_keys = self.list_keys + self.dict_keys\n self.extra_keys = []\n for n in attrs.keys():\n if n in known_keys:\n continue\n a = attrs[n]\n setattr(self,n,a)\n if type(a) is types.ListType:\n self.list_keys.append(n)\n elif type(a) is types.DictType:\n self.dict_keys.append(n)\n else:\n self.extra_keys.append(n)\n\n if os.path.exists(os.path.join(package_path,'__init__.py')):\n self.packages.append(self.name)\n self.package_dir[self.name] = package_path \n return\n\n def todict(self):\n \"\"\" Return configuration distionary suitable for passing\n to distutils.core.setup() function.\n \"\"\"\n d = {}\n for n in self.list_keys + self.dict_keys + self.extra_keys:\n a = getattr(self,n)\n if a:\n d[n] = a\n if self.name:\n d['name'] = self.name\n return d\n\n def __dict__(self):\n return self.todict()\n\n def get_distribution(self):\n import distutils.core\n dist = distutils.core._setup_distribution \n return dist\n\n def get_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Return subpackage configuration.\n \"\"\"\n if subpackage_name is None:\n assert subpackage_path is not None\n subpackage_name = os.path.basename(subpackage_path)\n assert '.' not in subpackage_name,`subpackage_name`\n if subpackage_path is None:\n subpackage_path = os.path.join(self.local_path,subpackage_name)\n else:\n subpackage_path = self._fix_paths([subpackage_path])[0]\n\n setup_py = os.path.join(subpackage_path,'setup_%s.py' % (subpackage_name))\n if not os.path.isfile(setup_py):\n setup_py = os.path.join(subpackage_path,'setup.py')\n if not os.path.isfile(setup_py):\n print 'Assuming default configuration '\\\n '(%s/{setup_%s,setup}.py was not found)' \\\n % (os.path.dirname(setup_py),subpackage_name)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n # In case setup_py imports local modules:\n sys.path.insert(0,os.path.dirname(setup_py))\n try:\n info = (open(setup_py),setup_py,('.py','U',1))\n setup_name = os.path.splitext(os.path.basename(setup_py))[0]\n n = dot_join(self.name,setup_name)\n setup_module = imp.load_module('_'.join(n.split('.')),*info)\n\n if not hasattr(setup_module,'configuration'):\n print 'Assuming default configuration '\\\n '(%s does not define configuration())' % (setup_module)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n args = (self.name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (self.top_path,)\n config = setup_module.configuration(*args)\n\n finally:\n del sys.path[0]\n\n return config\n\n def add_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Add subpackage to configuration.\n \"\"\"\n config = self.get_subpackage(subpackage_name,subpackage_path)\n\n if not config:\n print 'No configuration returned, assuming unavailable.'\n else:\n\n if isinstance(config,Configuration):\n print 'Appending %s configuration to %s' % (config.name,self.name)\n self.dict_append(**config.todict())\n else:\n print 'Appending %s configuration to %s' % (config.get('name'),self.name)\n self.dict_append(**config)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a subpackage', subpackage_name\n return\n\n def add_data_dir(self,data_path):\n \"\"\" Recursively add files under data_path to data_files list.\n Argument can be either\n - 2-sequence (,)\n - path to data directory where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + subdirname of the path.\n \"\"\"\n if type(data_path) is type(()):\n assert len(data_path)==2,`data_path`\n d,data_path = data_path\n else:\n d = None\n assert type(data_path) is type(''),`data_path`\n for path in self.paths(data_path):\n if not os.path.exists(path):\n print 'Not existing data path',path\n continue\n filenames = []\n os.path.walk(path, _gsf_visit_func,filenames)\n if not os.path.isabs(path):\n if d is None:\n ds = path\n else:\n ds = os.path.join(*([d]+os.path.normpath(path).split()[1:]))\n self.add_data_files((ds,filenames))\n else:\n if d is None:\n self.add_data_files(*filenames)\n else:\n self.add_data_files((d,filenames))\n return\n\n def add_data_files(self,*files):\n \"\"\" Add data files to configuration data_files.\n Argument(s) can be either\n - 2-sequence (,)\n - paths to data files where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + dirname of the path.\n \"\"\"\n data_dict = {}\n for p in files:\n if type(p) is type(''):\n d = os.path.join(*(self.name.split('.')))\n file_list = self.paths(p)\n if not os.path.isabs(p):\n d = appendpath(d,os.path.dirname(p))\n elif type(p) is type(()):\n assert len(p)==2,`p`\n d = p[0]\n if type(p[1]) is type(''):\n file_list = self.paths(p[1])\n else:\n file_list = self.paths(*p[1])\n else:\n # function\n d = os.path.join(*(self.name.split('.')))\n file_list = [p]\n if not data_dict.has_key(d):\n data_dict[d] = file_list[:]\n else:\n data_dict[d].extend(file_list)\n\n dist = self.get_distribution()\n if dist is not None:\n dist.data_files.extend(data_dict.items())\n else:\n self.data_files.extend(data_dict.items())\n return \n \n def add_include_dirs(self,*paths):\n \"\"\" Add paths to configuration include directories.\n \"\"\"\n include_dirs = self._fix_paths(paths)\n dist = self.get_distribution()\n if dist is not None:\n dist.include_dirs.extend(include_dirs)\n else:\n self.include_dirs.extend(include_dirs)\n return\n\n def add_headers(self,*files):\n \"\"\" Add installable headers to configuration.\n Argument(s) can be either\n - 2-sequence (,)\n - path(s) to header file(s) where python includedir suffix will default\n to package name.\n \"\"\"\n headers = []\n for path in files:\n if type(path) is type(''):\n [headers.append((self.name,p)) for p in self.paths(path)]\n else:\n assert type(path) in [type(()),type([])] and len(path)==2,`path`\n [headers.append((path[0],p)) for p in self.paths(path[1])]\n dist = self.get_distribution()\n if dist is not None:\n dist.headers.extend(headers)\n else:\n self.headers.extend(headers)\n return\n\n def _fix_paths(self,paths):\n new_paths = []\n for n in paths:\n if isinstance(n,str):\n if '*' in n or '?' in n:\n p = glob.glob(n)\n p2 = glob.glob(os.path.join(self.local_path,n))\n if p2:\n new_paths.extend(p2)\n elif p:\n new_paths.extend(p)\n else:\n new_paths.append(n)\n else:\n n2 = os.path.join(self.local_path,n)\n if os.path.exists(n2):\n new_paths.append(n2)\n else:\n new_paths.append(n)\n else:\n new_paths.append(n)\n return new_paths\n\n def paths(self,*paths):\n \"\"\" Apply glob to paths and prepend local_path if needed.\n \"\"\"\n return self._fix_paths(paths)\n\n def add_extension(self,name,sources,**kw):\n \"\"\" Add extension to configuration.\n\n Keywords:\n include_dirs, define_macros, undef_macros,\n library_dirs, libraries, runtime_library_dirs,\n extra_objects, extra_compile_args, extra_link_args,\n export_symbols, swig_opts, depends, language,\n f2py_options, module_dirs\n extra_info - dict or list of dict of keywords to be\n appended to keywords.\n \"\"\"\n ext_args = copy.copy(kw)\n ext_args['name'] = dot_join(self.name,name)\n ext_args['sources'] = sources\n\n if ext_args.has_key('extra_info'):\n extra_info = ext_args['extra_info']\n del ext_args['extra_info']\n if type(extra_info) is type({}):\n extra_info = [extra_info]\n for info in extra_info:\n assert type(info) is type({}),`info`\n dict_append(ext_args,**info)\n\n for k in ext_args.keys():\n v = ext_args[k]\n if k in ['sources','depends','include_dirs','library_dirs',\n 'module_dirs','extra_objects']:\n new_v = self._fix_paths(v)\n ext_args[k] = new_v\n\n # Resolve out-of-tree dependencies\n libraries = ext_args.get('libraries',[])\n libnames = []\n ext_args['libraries'] = []\n for libname in libraries:\n if '@' in libname:\n lname,lpath = libname.split('@',1)\n lpath = os.path.abspath(os.path.join(self.local_path,lpath))\n if os.path.isdir(lpath):\n c = self.get_subpackage(None,lpath)\n if isinstance(c,Configuration):\n c = c.todict()\n for l in [l[0] for l in c.get('libraries',[])]:\n llname = l.split('__OF__',1)[0]\n if llname == lname:\n c.pop('name',None)\n dict_append(ext_args,**c)\n break\n continue\n libnames.append(libname)\n\n ext_args['libraries'] = libnames + ext_args['libraries']\n\n from scipy.distutils.core import Extension\n ext = Extension(**ext_args)\n self.ext_modules.append(ext)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add an extension', name\n return ext\n\n def add_library(self,name,sources,**build_info):\n \"\"\" Add library to configuration.\n \n Valid keywords for build_info:\n depends\n macros\n include_dirs\n extra_compiler_args\n f2py_options\n \"\"\"\n build_info = copy.copy(build_info)\n name = name #+ '__OF__' + self.name\n build_info['sources'] = sources\n\n for k in build_info.keys():\n v = build_info[k]\n if k in ['sources','depends']:\n new_v = self._fix_paths(v)\n build_info[k] = new_v\n self.libraries.append((name,build_info))\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a library', name\n return\n\n def add_scripts(self,*files):\n \"\"\" Add scripts to configuration.\n \"\"\"\n scripts = self._fix_paths(files)\n dist = self.get_distribution()\n if dist is not None:\n dist.scripts.extend(scripts)\n else:\n self.scripts.extend(scripts)\n return\n\n def dict_append(self,**dict):\n for key in self.list_keys:\n a = getattr(self,key)\n a.extend(dict.get(key,[]))\n for key in self.dict_keys:\n a = getattr(self,key)\n a.update(dict.get(key,{}))\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n for key in dict.keys():\n if key not in known_keys and not hasattr(self,key):\n print 'Inheriting attribute %r from %r' \\\n % (key,dict.get('name','?'))\n setattr(self,key,dict[key])\n self.extra_keys.append(key)\n return\n\n def __str__(self):\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n s = '<'+5*'-' + '\\n'\n s += 'Configuration of '+self.name+':\\n'\n for k in known_keys:\n a = getattr(self,k,None)\n if a:\n s += '%s = %r\\n' % (k,a)\n s += 5*'-' + '>'\n return s\n\n def get_config_cmd(self):\n cmd = get_cmd('config')\n cmd.ensure_finalized()\n cmd.dump_source = 0\n cmd.noisy = 0\n old_path = os.environ.get('PATH')\n if old_path:\n path = os.pathsep.join(['.',old_path])\n os.environ['PATH'] = path\n return cmd\n\n def get_build_temp_dir(self):\n cmd = get_cmd('build')\n cmd.ensure_finalized()\n return cmd.build_temp\n\n def have_f77c(self):\n \"\"\" Check for availability of Fortran 77 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f77')\n return flag\n\n def have_f90c(self):\n \"\"\" Check for availability of Fortran 90 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f90')\n return flag\n\n def append_to(self, extlib):\n \"\"\" Append libraries, include_dirs to extension or library item.\n \"\"\"\n if type(extlib) is type(()):\n lib_name, build_info = extlib\n dict_append(build_info,\n libraries=self.libraries,\n include_dirs=self.include_dirs)\n else:\n from scipy.distutils.core import Extension\n assert isinstance(extlib,Extension),`extlib`\n extlib.libraries.extend(self.libraries)\n extlib.include_dirs.extend(self.include_dirs)\n return\n\n def _get_svn_revision(self,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\n def get_version(self):\n \"\"\" Try to get version string of a package.\n \"\"\"\n version = getattr(self,'version',None)\n if version is not None:\n return version\n\n # Get version from version file.\n files = ['__version__.py',\n self.name.split('.')[-1]+'_version.py',\n 'version.py',\n '__svn_version__.py']\n version_vars = ['version',\n '__version__',\n self.name.split('.')[-1]+'_version']\n for f in files:\n fn = os.path.join(self.local_path,f)\n if os.path.isfile(fn):\n info = (open(fn),fn,('.py','U',1))\n name = os.path.splitext(os.path.basename(fn))[0]\n n = dot_join(self.name,name)\n try:\n version_module = imp.load_module('_'.join(n.split('.')),*info)\n except ImportError,msg:\n print msg\n version_module = None\n if version_module is None:\n continue\n\n for a in version_vars:\n version = getattr(version_module,a,None)\n if version is not None:\n break\n if version is not None:\n break\n\n if version is not None:\n self.version = version\n return version\n\n # Get version as SVN revision number\n revision = self._get_svn_revision(self.local_path)\n if revision is not None:\n version = str(revision)\n self.version = version\n\n return version\n\n def make_svn_version_py(self):\n \"\"\" Generate package __svn_version__.py file from SVN revision number,\n it will be removed after python exits but will be available\n when sdist, etc commands are executed.\n\n If __svn_version__.py existed before, nothing is done.\n \"\"\"\n target = os.path.join(self.local_path,'__svn_version__.py')\n if os.path.isfile(target):\n return\n\n def generate_svn_version_py():\n if not os.path.isfile(target):\n revision = self._get_svn_revision(self.local_path)\n assert revision is not None,'hmm, why I am not inside SVN tree???'\n version = str(revision)\n print 'Creating %s (version=%r)' % (target,version)\n f = open(target,'w')\n f.write('version = %r\\n' % (version))\n f.close()\n \n import atexit\n def rm_file(f=target):\n try: os.remove(f); print 'removed',f\n except OSError: pass\n atexit.register(rm_file)\n\n return target\n\n self.add_data_files(generate_svn_version_py)\n return\n\ndef get_cmd(cmdname,_cache={}):\n if not _cache.has_key(cmdname):\n import distutils.core\n dist = distutils.core._setup_distribution\n if dist is None:\n from distutils.errors import DistutilsInternalError\n raise DistutilsInternalError,\\\n 'setup distribution instance not initialized'\n cmd = dist.get_command_obj(cmdname)\n _cache[cmdname] = cmd\n return _cache[cmdname]\n\ndef get_scipy_include_dirs():\n include_dirs = Configuration.scipy_include_dirs[:]\n if not include_dirs:\n import scipy.base as base\n include_dirs.append(os.path.join(os.path.dirname(base.__file__),'include'))\n #from distutils.sysconfig import get_python_inc\n #prefix = []\n #for name in scipy.__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 return include_dirs\n\n#########################\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 appendpath(prefix,path):\n if os.path.isabs(path):\n absprefix = os.path.abspath(prefix)\n d = os.path.commonprefix([absprefix,path])\n if os.path.join(absprefix[:len(d)],absprefix[len(d):])!=absprefix \\\n or os.path.join(path[:len(d)],path[len(d):])!=path:\n # Handle invalid paths\n d = os.path.dirname(d)\n subpath = path[len(d):]\n if os.path.isabs(subpath):\n subpath = subpath[1:]\n else:\n subpath = path\n return os.path.normpath(os.path.join(prefix, subpath))\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", "source_code_before": "import os\nimport re\nimport sys\nimport imp\nimport copy\nimport types\nimport glob\n\ndef allpath(name):\n \"Convert a /-separated pathname to one using the OS's path separator.\"\n splitted = name.split('/')\n return os.path.join(*splitted)\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" Return path of the module.\n\n Returned path is relative to parent_path when given,\n otherwise it is absolute path.\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 __import__(mod_name)\n mod = sys.modules[mod_name]\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\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\n#########################\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#########################\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 False\n return True\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 True\n return False\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 True\n return False\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\n\ndef _get_headers(directory_list):\n # get *.h files from list of directories\n headers = []\n for dir in directory_list:\n head = glob.glob(os.path.join(dir,\"*.h\")) #XXX: *.hpp files??\n headers.extend(head)\n return headers\n\ndef _get_directories(list_of_sources):\n # get unique directories from list of sources.\n direcs = []\n for file in list_of_sources:\n dir = os.path.split(file)\n if dir[0] != '' and not dir[0] in direcs:\n direcs.append(dir[0])\n return direcs\n\ndef get_dependencies(sources):\n #XXX scan sources for include statements\n return _get_headers(_get_directories(sources))\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n if type(directory) is not type(''):\n return False\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 False\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n\ndef _gsf_visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn','build']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n ext = os.path.splitext(fullname)[1]\n if ext and ext in ['.pyc','.o']:\n continue\n if os.path.isfile(fullname):\n filenames.append(fullname)\n\ndef get_ext_source_files(ext):\n # Get sources and any include files in the same directory.\n filenames = []\n sources = filter(lambda s:type(s) is types.StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_script_files(scripts):\n scripts = filter(lambda s:type(s) is types.StringType,scripts)\n return scripts\n\ndef get_lib_source_files(lib):\n filenames = []\n sources = lib[1].get('sources',[])\n sources = filter(lambda s:type(s) is types.StringType,sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n depends = build_info.get('depends',[])\n for d in depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_data_files(data):\n if type(data) is types.StringType:\n return [data]\n sources = data[1]\n filenames = []\n for s in sources:\n if callable(s):\n s = s()\n if s is None:\n continue\n if is_local_src_dir(s):\n os.path.walk(s,_gsf_visit_func,filenames)\n elif type(s) is type('') and os.path.isfile(s):\n filenames.append(s)\n else:\n raise TypeError,`s`\n return filenames\n\ndef dot_join(*args):\n return '.'.join(filter(None,args))\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\n######################\n\nclass Configuration:\n\n _list_keys = ['packages','ext_modules','data_files','include_dirs',\n 'libraries','headers','scripts']\n _dict_keys = ['package_dir']\n\n scipy_include_dirs = []\n\n def __init__(self,\n package_name=None,\n parent_name=None,\n top_path=None,\n package_path=None,\n **attrs):\n \"\"\" Construct configuration instance of a package.\n \"\"\"\n self.name = dot_join(parent_name, package_name)\n\n caller_frame = get_frame(1)\n caller_name = eval('__name__',caller_frame.f_globals,caller_frame.f_locals)\n \n self.local_path = get_path(caller_name, top_path)\n if top_path is None:\n top_path = self.local_path\n if package_path is None:\n package_path = self.local_path\n elif os.path.isdir(os.path.join(self.local_path,package_path)):\n package_path = os.path.join(self.local_path,package_path)\n self.top_path = top_path\n\n self.list_keys = copy.copy(self._list_keys)\n self.dict_keys = copy.copy(self._dict_keys)\n\n for n in self.list_keys:\n setattr(self,n,copy.copy(attrs.get(n,[])))\n\n for n in self.dict_keys:\n setattr(self,n,copy.copy(attrs.get(n,{})))\n\n known_keys = self.list_keys + self.dict_keys\n self.extra_keys = []\n for n in attrs.keys():\n if n in known_keys:\n continue\n a = attrs[n]\n setattr(self,n,a)\n if type(a) is types.ListType:\n self.list_keys.append(n)\n elif type(a) is types.DictType:\n self.dict_keys.append(n)\n else:\n self.extra_keys.append(n)\n\n if os.path.exists(os.path.join(package_path,'__init__.py')):\n self.packages.append(self.name)\n self.package_dir[self.name] = package_path \n return\n\n def todict(self):\n \"\"\" Return configuration distionary suitable for passing\n to distutils.core.setup() function.\n \"\"\"\n d = {}\n for n in self.list_keys + self.dict_keys + self.extra_keys:\n a = getattr(self,n)\n if a:\n d[n] = a\n if self.name:\n d['name'] = self.name\n return d\n\n def __dict__(self):\n return self.todict()\n\n def get_distribution(self):\n import distutils.core\n dist = distutils.core._setup_distribution \n return dist\n\n def get_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Return subpackage configuration.\n \"\"\"\n if subpackage_name is None:\n assert subpackage_path is not None\n subpackage_name = os.path.basename(subpackage_path)\n assert '.' not in subpackage_name,`subpackage_name`\n if subpackage_path is None:\n subpackage_path = os.path.join(self.local_path,subpackage_name)\n else:\n subpackage_path = self._fix_paths([subpackage_path])[0]\n\n setup_py = os.path.join(subpackage_path,'setup_%s.py' % (subpackage_name))\n if not os.path.isfile(setup_py):\n setup_py = os.path.join(subpackage_path,'setup.py')\n if not os.path.isfile(setup_py):\n print 'Assuming default configuration '\\\n '(%s/{setup_%s,setup}.py was not found)' \\\n % (os.path.dirname(setup_py),subpackage_name)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n # In case setup_py imports local modules:\n sys.path.insert(0,os.path.dirname(setup_py))\n try:\n info = (open(setup_py),setup_py,('.py','U',1))\n setup_name = os.path.splitext(os.path.basename(setup_py))[0]\n n = dot_join(self.name,setup_name)\n setup_module = imp.load_module('_'.join(n.split('.')),*info)\n\n if not hasattr(setup_module,'configuration'):\n print 'Assuming default configuration '\\\n '(%s does not define configuration())' % (setup_module)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n args = (self.name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (self.top_path,)\n config = setup_module.configuration(*args)\n\n finally:\n del sys.path[0]\n\n return config\n\n def add_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Add subpackage to configuration.\n \"\"\"\n config = self.get_subpackage(subpackage_name,subpackage_path)\n\n if not config:\n print 'No configuration returned, assuming unavailable.'\n else:\n\n if isinstance(config,Configuration):\n print 'Appending %s configuration to %s' % (config.name,self.name)\n self.dict_append(**config.todict())\n else:\n print 'Appending %s configuration to %s' % (config.get('name'),self.name)\n self.dict_append(**config)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a subpackage', subpackage_name\n return\n\n def add_data_dir(self,data_path):\n \"\"\" Add files under data_path to data_files list.\n \"\"\"\n for path in self.paths(data_path):\n filenames = []\n os.path.walk(path, _gsf_visit_func,filenames)\n if not os.path.isabs(path):\n self.add_data_files((path,filenames))\n else:\n self.add_data_files(*filenames)\n return\n\n def add_data_files(self,*files):\n \"\"\" Add data files to configuration data_files.\n Argument(s) can be either\n - 2-sequence (,)\n - paths to data files where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + dirname of the path.\n \"\"\"\n data_dict = {}\n for p in files:\n if type(p) is type(''):\n d = os.path.join(*(self.name.split('.')))\n file_list = self.paths(p)\n if not os.path.isabs(p):\n d = appendpath(d,os.path.dirname(p))\n elif type(p) is type(()):\n assert len(p)==2,`p`\n d = p[0]\n if type(p[1]) is type(''):\n file_list = self.paths(p[1])\n else:\n file_list = self.paths(*p[1])\n else:\n # function\n d = os.path.join(*(self.name.split('.')))\n file_list = [p]\n if not data_dict.has_key(d):\n data_dict[d] = file_list[:]\n else:\n data_dict[d].extend(file_list)\n\n dist = self.get_distribution()\n if dist is not None:\n dist.data_files.extend(data_dict.items())\n else:\n self.data_files.extend(data_dict.items())\n\n return \n \n def add_include_dirs(self,*paths):\n \"\"\" Add paths to configuration include directories.\n \"\"\"\n include_dirs = self._fix_paths(paths)\n dist = self.get_distribution()\n if dist is not None:\n dist.include_dirs.extend(include_dirs)\n else:\n self.include_dirs.extend(include_dirs)\n return\n\n def add_headers(self,*files):\n \"\"\" Add installable headers to configuration.\n Argument(s) can be either\n - 2-sequence (,)\n - path(s) to header file(s) where python includedir suffix will default\n to package name.\n \"\"\"\n headers = []\n for path in files:\n if type(path) is type(''):\n [headers.append((self.name,p)) for p in self.paths(path)]\n else:\n assert type(path) in [type(()),type([])] and len(path)==2,`path`\n [headers.append((path[0],p)) for p in self.paths(path[1])]\n dist = self.get_distribution()\n if dist is not None:\n dist.headers.extend(headers)\n else:\n self.headers.extend(headers)\n return\n\n def _fix_paths(self,paths):\n new_paths = []\n for n in paths:\n if isinstance(n,str):\n if '*' in n or '?' in n:\n p = glob.glob(n)\n p2 = glob.glob(os.path.join(self.local_path,n))\n if p2:\n new_paths.extend(p2)\n elif p:\n new_paths.extend(p)\n else:\n new_paths.append(n)\n else:\n n2 = os.path.join(self.local_path,n)\n if os.path.exists(n2):\n new_paths.append(n2)\n else:\n new_paths.append(n)\n else:\n new_paths.append(n)\n return new_paths\n\n def paths(self,*paths):\n \"\"\" Apply glob to paths and prepend local_path if needed.\n \"\"\"\n return self._fix_paths(paths)\n\n def add_extension(self,name,sources,**kw):\n \"\"\" Add extension to configuration.\n\n Keywords:\n include_dirs, define_macros, undef_macros,\n library_dirs, libraries, runtime_library_dirs,\n extra_objects, extra_compile_args, extra_link_args,\n export_symbols, swig_opts, depends, language,\n f2py_options, module_dirs\n extra_info - dict or list of dict of keywords to be\n appended to keywords.\n \"\"\"\n ext_args = copy.copy(kw)\n ext_args['name'] = dot_join(self.name,name)\n ext_args['sources'] = sources\n\n if ext_args.has_key('extra_info'):\n extra_info = ext_args['extra_info']\n del ext_args['extra_info']\n if type(extra_info) is type({}):\n extra_info = [extra_info]\n for info in extra_info:\n assert type(info) is type({}),`info`\n dict_append(ext_args,**info)\n\n for k in ext_args.keys():\n v = ext_args[k]\n if k in ['sources','depends','include_dirs','library_dirs',\n 'module_dirs','extra_objects']:\n new_v = self._fix_paths(v)\n ext_args[k] = new_v\n\n # Resolve out-of-tree dependencies\n libraries = ext_args.get('libraries',[])\n libnames = []\n ext_args['libraries'] = []\n for libname in libraries:\n if '@' in libname:\n lname,lpath = libname.split('@',1)\n lpath = os.path.abspath(os.path.join(self.local_path,lpath))\n if os.path.isdir(lpath):\n c = self.get_subpackage(None,lpath)\n if isinstance(c,Configuration):\n c = c.todict()\n for l in [l[0] for l in c.get('libraries',[])]:\n llname = l.split('__OF__',1)[0]\n if llname == lname:\n c.pop('name',None)\n dict_append(ext_args,**c)\n break\n continue\n libnames.append(libname)\n\n ext_args['libraries'] = libnames + ext_args['libraries']\n\n from scipy.distutils.core import Extension\n ext = Extension(**ext_args)\n self.ext_modules.append(ext)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add an extension', name\n return ext\n\n def add_library(self,name,sources,**build_info):\n \"\"\" Add library to configuration.\n \n Valid keywords for build_info:\n depends\n macros\n include_dirs\n extra_compiler_args\n f2py_options\n \"\"\"\n build_info = copy.copy(build_info)\n name = name #+ '__OF__' + self.name\n build_info['sources'] = sources\n\n for k in build_info.keys():\n v = build_info[k]\n if k in ['sources','depends']:\n new_v = self._fix_paths(v)\n build_info[k] = new_v\n self.libraries.append((name,build_info))\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a library', name\n return\n\n def add_scripts(self,*files):\n \"\"\" Add scripts to configuration.\n \"\"\"\n scripts = self._fix_paths(files)\n dist = self.get_distribution()\n if dist is not None:\n dist.scripts.extend(scripts)\n else:\n self.scripts.extend(scripts)\n return\n\n def dict_append(self,**dict):\n for key in self.list_keys:\n a = getattr(self,key)\n a.extend(dict.get(key,[]))\n for key in self.dict_keys:\n a = getattr(self,key)\n a.update(dict.get(key,{}))\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n for key in dict.keys():\n if key not in known_keys and not hasattr(self,key):\n print 'Inheriting attribute %r from %r' \\\n % (key,dict.get('name','?'))\n setattr(self,key,dict[key])\n self.extra_keys.append(key)\n return\n\n def __str__(self):\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n s = '<'+5*'-' + '\\n'\n s += 'Configuration of '+self.name+':\\n'\n for k in known_keys:\n a = getattr(self,k,None)\n if a:\n s += '%s = %r\\n' % (k,a)\n s += 5*'-' + '>'\n return s\n\n def get_config_cmd(self):\n cmd = get_cmd('config')\n cmd.ensure_finalized()\n cmd.dump_source = 0\n cmd.noisy = 0\n old_path = os.environ.get('PATH')\n if old_path:\n path = os.pathsep.join(['.',old_path])\n os.environ['PATH'] = path\n return cmd\n\n def get_build_temp_dir(self):\n cmd = get_cmd('build')\n cmd.ensure_finalized()\n return cmd.build_temp\n\n def have_f77c(self):\n \"\"\" Check for availability of Fortran 77 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f77')\n return flag\n\n def have_f90c(self):\n \"\"\" Check for availability of Fortran 90 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f90')\n return flag\n\n def append_to(self, extlib):\n \"\"\" Append libraries, include_dirs to extension or library item.\n \"\"\"\n if type(extlib) is type(()):\n lib_name, build_info = extlib\n dict_append(build_info,\n libraries=self.libraries,\n include_dirs=self.include_dirs)\n else:\n from scipy.distutils.core import Extension\n assert isinstance(extlib,Extension),`extlib`\n extlib.libraries.extend(self.libraries)\n extlib.include_dirs.extend(self.include_dirs)\n return\n\n def _get_svn_revision(self,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\n def get_version(self):\n \"\"\" Try to get version string of a package.\n \"\"\"\n version = getattr(self,'version',None)\n if version is not None:\n return version\n\n # Get version from version file.\n files = ['__version__.py',\n self.name.split('.')[-1]+'_version.py',\n 'version.py',\n '__svn_version__.py']\n version_vars = ['version',\n '__version__',\n self.name.split('.')[-1]+'_version']\n for f in files:\n fn = os.path.join(self.local_path,f)\n if os.path.isfile(fn):\n info = (open(fn),fn,('.py','U',1))\n name = os.path.splitext(os.path.basename(fn))[0]\n n = dot_join(self.name,name)\n try:\n version_module = imp.load_module('_'.join(n.split('.')),*info)\n except ImportError,msg:\n print msg\n version_module = None\n if version_module is None:\n continue\n\n for a in version_vars:\n version = getattr(version_module,a,None)\n if version is not None:\n break\n if version is not None:\n break\n\n if version is not None:\n self.version = version\n return version\n\n # Get version as SVN revision number\n revision = self._get_svn_revision(self.local_path)\n if revision is not None:\n version = str(revision)\n self.version = version\n\n return version\n\n def make_svn_version_py(self):\n \"\"\" Generate package __svn_version__.py file from SVN revision number,\n it will be removed after python exits but will be available\n when sdist, etc commands are executed.\n\n If __svn_version__.py existed before, nothing is done.\n \"\"\"\n target = os.path.join(self.local_path,'__svn_version__.py')\n if os.path.isfile(target):\n return\n\n def generate_svn_version_py():\n if not os.path.isfile(target):\n revision = self._get_svn_revision(self.local_path)\n assert revision is not None,'hmm, why I am not inside SVN tree???'\n version = str(revision)\n print 'Creating %s (version=%r)' % (target,version)\n f = open(target,'w')\n f.write('version = %r\\n' % (version))\n f.close()\n \n import atexit\n def rm_file(f=target):\n try: os.remove(f); print 'removed',f\n except OSError: pass\n atexit.register(rm_file)\n\n return target\n\n self.add_data_files(generate_svn_version_py)\n return\n\ndef get_cmd(cmdname,_cache={}):\n if not _cache.has_key(cmdname):\n import distutils.core\n dist = distutils.core._setup_distribution\n if dist is None:\n from distutils.errors import DistutilsInternalError\n raise DistutilsInternalError,\\\n 'setup distribution instance not initialized'\n cmd = dist.get_command_obj(cmdname)\n _cache[cmdname] = cmd\n return _cache[cmdname]\n\ndef get_scipy_include_dirs():\n include_dirs = Configuration.scipy_include_dirs[:]\n if not include_dirs:\n import scipy.base as base\n include_dirs.append(os.path.join(os.path.dirname(base.__file__),'include'))\n #from distutils.sysconfig import get_python_inc\n #prefix = []\n #for name in scipy.__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 return include_dirs\n\n#########################\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 appendpath(prefix,path):\n if os.path.isabs(path):\n absprefix = os.path.abspath(prefix)\n d = os.path.commonprefix([absprefix,path])\n if os.path.join(absprefix[:len(d)],absprefix[len(d):])!=absprefix \\\n or os.path.join(path[:len(d)],path[len(d):])!=path:\n # Handle invalid paths\n d = os.path.dirname(d)\n subpath = path[len(d):]\n if os.path.isabs(subpath):\n subpath = subpath[1:]\n else:\n subpath = path\n return os.path.normpath(os.path.join(prefix, subpath))\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", "methods": [ { "name": "allpath", "long_name": "allpath( name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "name" ], "start_line": 9, "end_line": 12, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 129, "parameters": [ "mod_name", "parent_path" ], "start_line": 14, "end_line": 34, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "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": 38, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 42, "parameters": [ "path" ], "start_line": 80, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "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": 92, "end_line": 108, "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": 110, "end_line": 115, "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": 117, "end_line": 122, "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": 124, "end_line": 129, "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": 131, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_get_headers", "long_name": "_get_headers( directory_list )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 39, "parameters": [ "directory_list" ], "start_line": 154, "end_line": 160, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "_get_directories", "long_name": "_get_directories( list_of_sources )", "filename": "misc_util.py", "nloc": 7, "complexity": 4, "token_count": 51, "parameters": [ "list_of_sources" ], "start_line": 162, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "get_dependencies", "long_name": "get_dependencies( sources )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "sources" ], "start_line": 171, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "misc_util.py", "nloc": 12, "complexity": 6, "token_count": 112, "parameters": [ "directory" ], "start_line": 175, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "_gsf_visit_func", "long_name": "_gsf_visit_func( filenames , dirname , names )", "filename": "misc_util.py", "nloc": 13, "complexity": 7, "token_count": 103, "parameters": [ "filenames", "dirname", "names" ], "start_line": 190, "end_line": 202, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_ext_source_files", "long_name": "get_ext_source_files( ext )", "filename": "misc_util.py", "nloc": 11, "complexity": 4, "token_count": 87, "parameters": [ "ext" ], "start_line": 204, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "get_script_files", "long_name": "get_script_files( scripts )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 25, "parameters": [ "scripts" ], "start_line": 217, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "get_lib_source_files", "long_name": "get_lib_source_files( lib )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 108, "parameters": [ "lib" ], "start_line": 221, "end_line": 233, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_data_files", "long_name": "get_data_files( data )", "filename": "misc_util.py", "nloc": 17, "complexity": 8, "token_count": 105, "parameters": [ "data" ], "start_line": 235, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "args" ], "start_line": 253, "end_line": 254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "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": 256, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package_name = None , parent_name = None , top_path = None , package_path = None , ** attrs )", "filename": "misc_util.py", "nloc": 40, "complexity": 11, "token_count": 335, "parameters": [ "self", "package_name", "parent_name", "top_path", "package_path", "attrs" ], "start_line": 275, "end_line": 323, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 1 }, { "name": "todict", "long_name": "todict( self )", "filename": "misc_util.py", "nloc": 9, "complexity": 4, "token_count": 57, "parameters": [ "self" ], "start_line": 325, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__dict__", "long_name": "__dict__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 338, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_distribution", "long_name": "get_distribution( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 341, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_subpackage", "long_name": "get_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 38, "complexity": 8, "token_count": 333, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 346, "end_line": 390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 1 }, { "name": "add_subpackage", "long_name": "add_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 103, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 392, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "add_data_dir", "long_name": "add_data_dir( self , data_path )", "filename": "misc_util.py", "nloc": 25, "complexity": 7, "token_count": 187, "parameters": [ "self", "data_path" ], "start_line": 413, "end_line": 445, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "add_data_files", "long_name": "add_data_files( self , * files )", "filename": "misc_util.py", "nloc": 28, "complexity": 8, "token_count": 247, "parameters": [ "self", "files" ], "start_line": 447, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "add_include_dirs", "long_name": "add_include_dirs( self , * paths )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "paths" ], "start_line": 486, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "add_headers", "long_name": "add_headers( self , * files )", "filename": "misc_util.py", "nloc": 14, "complexity": 7, "token_count": 143, "parameters": [ "self", "files" ], "start_line": 497, "end_line": 516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "_fix_paths", "long_name": "_fix_paths( self , paths )", "filename": "misc_util.py", "nloc": 22, "complexity": 8, "token_count": 136, "parameters": [ "self", "paths" ], "start_line": 518, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "paths", "long_name": "paths( self , * paths )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 16, "parameters": [ "self", "paths" ], "start_line": 541, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "add_extension", "long_name": "add_extension( self , name , sources , ** kw )", "filename": "misc_util.py", "nloc": 45, "complexity": 14, "token_count": 365, "parameters": [ "self", "name", "sources", "kw" ], "start_line": 546, "end_line": 608, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 1 }, { "name": "add_library", "long_name": "add_library( self , name , sources , ** build_info )", "filename": "misc_util.py", "nloc": 14, "complexity": 4, "token_count": 98, "parameters": [ "self", "name", "sources", "build_info" ], "start_line": 610, "end_line": 634, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "add_scripts", "long_name": "add_scripts( self , * files )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "files" ], "start_line": 636, "end_line": 645, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "dict_append", "long_name": "dict_append( self , ** dict )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 138, "parameters": [ "self", "dict" ], "start_line": 647, "end_line": 661, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 72, "parameters": [ "self" ], "start_line": 663, "end_line": 672, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_config_cmd", "long_name": "get_config_cmd( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 2, "token_count": 63, "parameters": [ "self" ], "start_line": 674, "end_line": 683, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_build_temp_dir", "long_name": "get_build_temp_dir( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 685, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "have_f77c", "long_name": "have_f77c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 690, "end_line": 701, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "have_f90c", "long_name": "have_f90c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 703, "end_line": 714, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "append_to", "long_name": "append_to( self , extlib )", "filename": "misc_util.py", "nloc": 12, "complexity": 2, "token_count": 83, "parameters": [ "self", "extlib" ], "start_line": 716, "end_line": 729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "_get_svn_revision", "long_name": "_get_svn_revision( self , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 77, "parameters": [ "self", "path" ], "start_line": 731, "end_line": 742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "get_version", "long_name": "get_version( self )", "filename": "misc_util.py", "nloc": 38, "complexity": 11, "token_count": 257, "parameters": [ "self" ], "start_line": 744, "end_line": 790, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 1 }, { "name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file", "long_name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file( f = target )", "filename": "misc_util.py", "nloc": 3, "complexity": 2, "token_count": 24, "parameters": [ "f" ], "start_line": 814, "end_line": 816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 3 }, { "name": "make_svn_version_py.generate_svn_version_py", "long_name": "make_svn_version_py.generate_svn_version_py( )", "filename": "misc_util.py", "nloc": 13, "complexity": 2, "token_count": 81, "parameters": [], "start_line": 803, "end_line": 819, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 2 }, { "name": "make_svn_version_py", "long_name": "make_svn_version_py( self )", "filename": "misc_util.py", "nloc": 7, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 792, "end_line": 822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "get_cmd", "long_name": "get_cmd( cmdname , _cache = { } )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 65, "parameters": [ "cmdname", "_cache" ], "start_line": 824, "end_line": 834, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "get_scipy_include_dirs", "long_name": "get_scipy_include_dirs( )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 48, "parameters": [], "start_line": 836, "end_line": 848, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "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": 852, "end_line": 857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "appendpath", "long_name": "appendpath( prefix , path )", "filename": "misc_util.py", "nloc": 13, "complexity": 5, "token_count": 157, "parameters": [ "prefix", "path" ], "start_line": 859, "end_line": 872, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "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": 145, "parameters": [ "extension", "build_dir" ], "start_line": 874, "end_line": 910, "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": 912, "end_line": 939, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "methods_before": [ { "name": "allpath", "long_name": "allpath( name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "name" ], "start_line": 9, "end_line": 12, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 129, "parameters": [ "mod_name", "parent_path" ], "start_line": 14, "end_line": 34, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "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": 38, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 42, "parameters": [ "path" ], "start_line": 80, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "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": 92, "end_line": 108, "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": 110, "end_line": 115, "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": 117, "end_line": 122, "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": 124, "end_line": 129, "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": 131, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_get_headers", "long_name": "_get_headers( directory_list )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 39, "parameters": [ "directory_list" ], "start_line": 154, "end_line": 160, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "_get_directories", "long_name": "_get_directories( list_of_sources )", "filename": "misc_util.py", "nloc": 7, "complexity": 4, "token_count": 51, "parameters": [ "list_of_sources" ], "start_line": 162, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "get_dependencies", "long_name": "get_dependencies( sources )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "sources" ], "start_line": 171, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "misc_util.py", "nloc": 12, "complexity": 6, "token_count": 112, "parameters": [ "directory" ], "start_line": 175, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "_gsf_visit_func", "long_name": "_gsf_visit_func( filenames , dirname , names )", "filename": "misc_util.py", "nloc": 13, "complexity": 7, "token_count": 103, "parameters": [ "filenames", "dirname", "names" ], "start_line": 190, "end_line": 202, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_ext_source_files", "long_name": "get_ext_source_files( ext )", "filename": "misc_util.py", "nloc": 11, "complexity": 4, "token_count": 87, "parameters": [ "ext" ], "start_line": 204, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "get_script_files", "long_name": "get_script_files( scripts )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 25, "parameters": [ "scripts" ], "start_line": 217, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "get_lib_source_files", "long_name": "get_lib_source_files( lib )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 108, "parameters": [ "lib" ], "start_line": 221, "end_line": 233, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_data_files", "long_name": "get_data_files( data )", "filename": "misc_util.py", "nloc": 17, "complexity": 8, "token_count": 105, "parameters": [ "data" ], "start_line": 235, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "args" ], "start_line": 253, "end_line": 254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "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": 256, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package_name = None , parent_name = None , top_path = None , package_path = None , ** attrs )", "filename": "misc_util.py", "nloc": 40, "complexity": 11, "token_count": 335, "parameters": [ "self", "package_name", "parent_name", "top_path", "package_path", "attrs" ], "start_line": 275, "end_line": 323, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 1 }, { "name": "todict", "long_name": "todict( self )", "filename": "misc_util.py", "nloc": 9, "complexity": 4, "token_count": 57, "parameters": [ "self" ], "start_line": 325, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__dict__", "long_name": "__dict__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 338, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_distribution", "long_name": "get_distribution( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 341, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_subpackage", "long_name": "get_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 38, "complexity": 8, "token_count": 333, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 346, "end_line": 390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 1 }, { "name": "add_subpackage", "long_name": "add_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 103, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 392, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "add_data_dir", "long_name": "add_data_dir( self , data_path )", "filename": "misc_util.py", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "data_path" ], "start_line": 413, "end_line": 423, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "add_data_files", "long_name": "add_data_files( self , * files )", "filename": "misc_util.py", "nloc": 28, "complexity": 8, "token_count": 247, "parameters": [ "self", "files" ], "start_line": 425, "end_line": 463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "add_include_dirs", "long_name": "add_include_dirs( self , * paths )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "paths" ], "start_line": 465, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "add_headers", "long_name": "add_headers( self , * files )", "filename": "misc_util.py", "nloc": 14, "complexity": 7, "token_count": 143, "parameters": [ "self", "files" ], "start_line": 476, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "_fix_paths", "long_name": "_fix_paths( self , paths )", "filename": "misc_util.py", "nloc": 22, "complexity": 8, "token_count": 136, "parameters": [ "self", "paths" ], "start_line": 497, "end_line": 518, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "paths", "long_name": "paths( self , * paths )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 16, "parameters": [ "self", "paths" ], "start_line": 520, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "add_extension", "long_name": "add_extension( self , name , sources , ** kw )", "filename": "misc_util.py", "nloc": 45, "complexity": 14, "token_count": 365, "parameters": [ "self", "name", "sources", "kw" ], "start_line": 525, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 1 }, { "name": "add_library", "long_name": "add_library( self , name , sources , ** build_info )", "filename": "misc_util.py", "nloc": 14, "complexity": 4, "token_count": 98, "parameters": [ "self", "name", "sources", "build_info" ], "start_line": 589, "end_line": 613, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "add_scripts", "long_name": "add_scripts( self , * files )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "files" ], "start_line": 615, "end_line": 624, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "dict_append", "long_name": "dict_append( self , ** dict )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 138, "parameters": [ "self", "dict" ], "start_line": 626, "end_line": 640, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 72, "parameters": [ "self" ], "start_line": 642, "end_line": 651, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_config_cmd", "long_name": "get_config_cmd( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 2, "token_count": 63, "parameters": [ "self" ], "start_line": 653, "end_line": 662, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_build_temp_dir", "long_name": "get_build_temp_dir( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 664, "end_line": 667, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "have_f77c", "long_name": "have_f77c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 669, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "have_f90c", "long_name": "have_f90c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 682, "end_line": 693, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "append_to", "long_name": "append_to( self , extlib )", "filename": "misc_util.py", "nloc": 12, "complexity": 2, "token_count": 83, "parameters": [ "self", "extlib" ], "start_line": 695, "end_line": 708, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "_get_svn_revision", "long_name": "_get_svn_revision( self , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 77, "parameters": [ "self", "path" ], "start_line": 710, "end_line": 721, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "get_version", "long_name": "get_version( self )", "filename": "misc_util.py", "nloc": 38, "complexity": 11, "token_count": 257, "parameters": [ "self" ], "start_line": 723, "end_line": 769, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 1 }, { "name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file", "long_name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file( f = target )", "filename": "misc_util.py", "nloc": 3, "complexity": 2, "token_count": 24, "parameters": [ "f" ], "start_line": 793, "end_line": 795, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 3 }, { "name": "make_svn_version_py.generate_svn_version_py", "long_name": "make_svn_version_py.generate_svn_version_py( )", "filename": "misc_util.py", "nloc": 13, "complexity": 2, "token_count": 81, "parameters": [], "start_line": 782, "end_line": 798, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 2 }, { "name": "make_svn_version_py", "long_name": "make_svn_version_py( self )", "filename": "misc_util.py", "nloc": 7, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 771, "end_line": 801, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "get_cmd", "long_name": "get_cmd( cmdname , _cache = { } )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 65, "parameters": [ "cmdname", "_cache" ], "start_line": 803, "end_line": 813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "get_scipy_include_dirs", "long_name": "get_scipy_include_dirs( )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 48, "parameters": [], "start_line": 815, "end_line": 827, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "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": 831, "end_line": 836, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "appendpath", "long_name": "appendpath( prefix , path )", "filename": "misc_util.py", "nloc": 13, "complexity": 5, "token_count": 157, "parameters": [ "prefix", "path" ], "start_line": 838, "end_line": 851, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "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": 145, "parameters": [ "extension", "build_dir" ], "start_line": 853, "end_line": 889, "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": 891, "end_line": 918, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "add_data_files", "long_name": "add_data_files( self , * files )", "filename": "misc_util.py", "nloc": 28, "complexity": 8, "token_count": 247, "parameters": [ "self", "files" ], "start_line": 425, "end_line": 463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "add_data_dir", "long_name": "add_data_dir( self , data_path )", "filename": "misc_util.py", "nloc": 25, "complexity": 7, "token_count": 187, "parameters": [ "self", "data_path" ], "start_line": 413, "end_line": 445, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 } ], "nloc": 697, "complexity": 219, "token_count": 5151, "diff_parsed": { "added": [ " \"\"\" Recursively add files under data_path to data_files list.", " Argument can be either", " - 2-sequence (,)", " - path to data directory where python datadir suffix defaults", " to package dir.", " If path is not absolute then it's datadir suffix is", " package dir + subdirname of the path.", " if type(data_path) is type(()):", " assert len(data_path)==2,`data_path`", " d,data_path = data_path", " else:", " d = None", " assert type(data_path) is type(''),`data_path`", " if not os.path.exists(path):", " print 'Not existing data path',path", " continue", " if d is None:", " ds = path", " else:", " ds = os.path.join(*([d]+os.path.normpath(path).split()[1:]))", " self.add_data_files((ds,filenames))", " if d is None:", " self.add_data_files(*filenames)", " else:", " self.add_data_files((d,filenames))" ], "deleted": [ " \"\"\" Add files under data_path to data_files list.", " self.add_data_files((path,filenames))", " self.add_data_files(*filenames)", "" ] } }, { "old_path": "scipy/doc/DISTUTILS.txt", "new_path": "scipy/doc/DISTUTILS.txt", "filename": "DISTUTILS.txt", "extension": "txt", "change_type": "MODIFY", "diff": "@@ -158,6 +158,32 @@ in writing setup scripts:\n + ``config.add_data_dir(data_path)`` --- add directory ``data_path``\n recursively to ``data_files``. The whole directory tree starting at\n ``data_path`` will be copied under package installation directory.\n+ If ``data_path`` is a tuple then its first element defines\n+ the suffix of where data files are copied relative to package installation\n+ directory and the second element specifies the path to data directory.\n+ By default data directory are copied under package installation\n+ directory. For example,\n+ \n+ ::\n+\n+ config.add_data_dir('fun') # fun/ contains foo.dat bar/car.dat\n+ config.add_data_dir(('sun','fun'))\n+ config.add_data_dir(('gun','/full/path/to/fun'))\n+\n+ will install data files to the following locations \n+\n+ /\n+ fun/\n+ foo.dat\n+ bar/\n+ car.dat\n+ sun/\n+ foo.dat\n+ bar/\n+ car.dat\n+ gun/\n+ foo.dat\n+ car.dat\n \n + ``config.add_include_dirs(*paths)`` --- prepend ``paths`` to\n ``include_dirs`` list. This list will be visible to all extension\n", "added_lines": 26, "deleted_lines": 0, "source_code": ".. -*- rest -*-\n\nScipy Distutils - Users Guide\n=============================\n\n:Author: Pearu Peterson \n:Discussions to: scipy-dev@scipy.org\n:Created: October 2005\n\nScipy structure\n---------------\n\nCurrently Scipy project consists of two packages:\n\n- Scipy core --- it provides packages like:\n\n + scipy.distutils - extension to Python distutils\n + scipy.f2py - a tool to bind Fortran/C codes to Python\n + scipy.weave - a tool to bind C++ codes to Python\n + scipy.base - future replacement of Numeric and numarray packages\n + etc\n\n- Scipy --- a collection of Scientific tools for Python.\n\nThe aim of this document is to describe how to add new tools to Scipy.\n\n\nRequirements for SciPy packages\n-------------------------------\n\nScipy consists of Python packages, called Scipy packages, that are\navailable to Python users via ``scipy`` name space. Each Scipy package\nmay contain other Scipy packages. And so on. So, Scipy directory tree\nis a tree of packages with arbitrary depth and width. Any Scipy\npackage may depend on Scipy core packages but the dependence on other\nScipy packages should be kept minimal or zero.\n\nIn order to add a Python package to Scipy, its building script (the\n``setup.py`` file) must meet certain requirements. The minimal and the\nmost important one is that it must define a function\n``configuration(parent_package='',top_path=None)`` that returns a\ndictionary suitable for passing to ``scipy.distutils.core.setup(..)``\nfunction. In order to simplify the construction of such an distionary,\n``scipy.distutils.misc_util`` provides a class ``Configuration``, the\nusage of will be described below.\n\nScipy pure Python package example\n---------------------------------\n\nHere follows a minimal example for a pure Python Scipy package\n``setup.py`` file that will be explained in detail below::\n\n #!/usr/bin/env python\n def configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('mypackage',parent_package,top_path)\n return config\n\n if __name__ == \"__main__\":\n from scipy.distutils.core import setup\n setup(**configuration(top_path='').todict())\n\nThe first argument ``parent_package`` of the main configuration\nfunction will contain a name of the parent Scipy package and the\nsecond argument ``top_path`` contains the name of the directory where\nthe main ``setup.py`` script is located. Both arguments should be\npassed to the ``Configuration`` constructor after the name of the\ncurrent package.\n\nThe ``Configuration`` constructor has also fourth optional argument,\n``package_path``, that can be used when package files are located in\nsome other location than the directory of the ``setup.py`` file. \n\nRemaining ``Configuration`` arguments are all keyword arguments that will\nbe used to initialize attributes of ``Configuration``\ninstance. Usually, these keywords are the same as the ones that\n``setup(..)`` function would expect, for example, ``packages``,\n``ext_modules``, ``data_files``, ``include_dirs``, ``libraries``,\n``headers``, ``scripts``, ``package_dir``, etc. However, the direct\nspecification of these keywords is not recommended as the content of\nthese keyword arguments will not be processed or checked for the\nconsistency of Scipy building system.\n\nFinally, ``Configuration`` has ``.todict()`` method that returns all\nthe configuration data as a dictionary suitable for passing on to the\n``setup(..)`` function.\n\n``Configuration`` instance attributes\n-------------------------------------\n\nIn addition to attributes that can be specified via keyword arguments\nto ``Configuration`` constructor, ``Configuration`` instance (let us\ndenote as ``config``) has the following attributes that can be useful\nin writing setup scripts:\n\n+ ``config.name`` - full name of the current package. The names of parent\n packages can be extracted as ``config.name.split('.')``.\n\n+ ``config.local_path`` - path to the location of current ``setup.py`` file.\n\n+ ``config.top_path`` - path to the location of main ``setup.py`` file.\n\n``Configuration`` instance methods\n----------------------------------\n\n+ ``config.todict()`` --- returns configuration distionary suitable for\n passing to ``scipy.distutils.core.setup(..)`` function.\n\n+ ``config.paths(*paths) --- applies ``glob.glob(..)`` to items of\n ``paths`` if necessary. Fixes ``paths`` item that is relative to\n ``config.local_path``.\n\n+ ``config.get_subpackage(subpackage_name,subpackage_path=None)`` ---\n returns Scipy subpackage configuration. Subpackage is looked in the\n current directory under the name ``subpackage_name`` but the path\n can be specified also via optional ``subpackage_path`` argument.\n If ``subpackage_name`` is specified as ``None`` then the subpackage\n name will be taken the basename of ``subpackage_path``.\n\n+ ``config.add_subpackage(subpackage_name,subpackage_path=None)`` ---\n add Scipy subpackage configuration to the current one. The meaning\n and usage of arguments is explained above, see\n ``config.get_subpackage()`` method.\n\n+ ``config.add_data_files(*files)`` --- prepend ``files`` to ``data_files``\n list. If ``files`` item is a tuple then its first element defines\n the suffix of where data files are copied relative to package installation\n directory and the second element specifies the path to data\n files. By default data files are copied under package installation\n directory. For example,\n\n ::\n\n config.add_data_files('foo.dat',\n ('fun',['gun.dat','nun/pun.dat','/tmp/sun.dat']),\n 'bar/car.dat'.\n '/full/path/to/can.dat',\n )\n\n will install data files to the following locations::\n\n /\n foo.dat\n fun/\n gun.dat\n nun/\n pun.dat\n sun.dat\n bar/\n car.dat\n can.dat \n\n Path to data files can be a function taking no arguments and\n returning path(s) to data files -- this is a useful when data files\n are generated while building the package. (XXX: explain the step\n when this function are called exactly) \n\n+ ``config.add_data_dir(data_path)`` --- add directory ``data_path``\n recursively to ``data_files``. The whole directory tree starting at\n ``data_path`` will be copied under package installation directory.\n If ``data_path`` is a tuple then its first element defines\n the suffix of where data files are copied relative to package installation\n directory and the second element specifies the path to data directory.\n By default data directory are copied under package installation\n directory. For example,\n \n ::\n\n config.add_data_dir('fun') # fun/ contains foo.dat bar/car.dat\n config.add_data_dir(('sun','fun'))\n config.add_data_dir(('gun','/full/path/to/fun'))\n\n will install data files to the following locations \n\n /\n fun/\n foo.dat\n bar/\n car.dat\n sun/\n foo.dat\n bar/\n car.dat\n gun/\n foo.dat\n car.dat\n\n+ ``config.add_include_dirs(*paths)`` --- prepend ``paths`` to\n ``include_dirs`` list. This list will be visible to all extension\n modules of the current package.\n\n+ ``config.add_headers(*files)`` --- prepend ``files`` to ``headers``\n list. By default, headers will be installed under \n ``/include/pythonX.X//``\n directory. If ``files`` item is a tuple then it's first argument\n specifies the installation suffix relative to\n ``/include/pythonX.X/`` path.\n\n+ ``config.add_scripts(*files)`` --- prepend ``files`` to ``scripts``\n list. Scripts will be installed under ``/bin/`` directory.\n\n+ ``config.add_extension(name,sources,*kw)`` --- create and add an\n ``Extension`` instance to ``ext_modules`` list. The first argument \n ``name`` defines the name of the extension module that will be\n installed under ``config.name`` package. The second argument is\n a list of sources. ``add_extension`` method takes also keyword\n arguments that are passed on to the ``Extension`` constructor.\n The list of allowed keywords is the following: ``include_dirs``,\n ``define_macros``, ``undef_macros``, ``library_dirs``, ``libraries``,\n ``runtime_library_dirs``, ``extra_objects``, ``extra_compile_args``,\n ``extra_link_args``, ``export_symbols``, ``swig_opts``, ``depends``,\n ``language``, ``f2py_options``, ``module_dirs``, ``extra_info``.\n\n Note that ``config.paths`` method is applied to all lists that\n may contain paths. ``extra_info`` is a dictionary or a list\n of dictionaries that content will be appended to keyword arguments.\n The list ``depends`` contains paths to files or directories\n that the sources of the extension module depend on. If any path\n in the ``depends`` list is newer than the extension module, then\n the module will be rebuilt.\n\n The list of sources may contain functions ('source generators')\n with a pattern ``def (ext, build_dir): return\n ``. If ``funcname`` returns ``None``, no sources\n are generated. And if the ``Extension`` instance has no sources\n after processing all source generators, no extension module will\n be built. This is the recommended way to conditionally define\n extension modules. Source generator functions are called by the\n ``build_src`` command of ``scipy.distutils``.\n\n For example, here is a typical source generator function::\n\n def generate_source(ext,build_dir):\n import os\n from distutils.dep_util import newer\n target = os.path.join(build_dir,'somesource.c')\n if newer(target,__file__):\n # create target file\n return target\n\n The first argument contains the Extension instance that can be\n useful to access its attributes like ``depends``, ``sources``,\n etc. lists and modify them during the building process.\n The second argument gives a path to a build directory that must\n be used when creating files to a disk.\n\n+ ``config.add_library(name, sources, **build_info)`` --- add\n a library to ``libraries`` list. Allowed keywords arguments\n are ``depends``, ``macros``, ``include_dirs``,\n ``extra_compiler_args``, ``f2py_options``. See ``.add_extension()``\n method for more information on arguments.\n\n+ ``config.have_f77c()`` --- return True if Fortran 77 compiler is\n available (read: a simple Fortran 77 code compiled succesfully). \n\n+ ``config.have_f90c()`` --- return True if Fortran 90 compiler is\n available (read: a simple Fortran 90 code compiled succesfully). \n\n+ ``config.get_version()`` --- return version string of the current package,\n ``None`` if version information could not be detected. This methods\n scans files ``__version__.py``, ``_version.py``,\n ``version.py``, ``__svn_version__.py`` for string variables\n ``version``, ``__version__``, ``_version``.\n\n+ ``config.make_svn_version_py()`` --- appends a data function to\n ``data_files`` list that will generate ``__svn_version__.py`` file\n to the current package directory. The file will be removed from\n the source directory when Python exits.\n\n+ ``config.get_build_temp_dir()`` --- return a path to a temporary\n directory. This is the place where one should build temporary\n files.\n\n+ ``config.get_distribution()`` --- return distutils ``Distribution``\n instance.\n\n+ ``config.get_config_cmd()`` --- returns ``scipy.distutils`` config\n command instance.\n\nTemplate files\n--------------\n\nXXX: Describe how files with extensions ``.f.src``, ``.pyf.src``,\n``.c.src``, etc. are pre-processed by the ``build_src`` command.\n\nUseful functions in ``scipy.distutils.misc_util``\n-------------------------------------------------\n\n+ ``get_scipy_include_dirs()`` --- return a list of Scipy base\n include directories. Scipy base include directories contain\n header files such as ``scipy/arrayobject.h``, ``scipy/funcobject.h``\n etc. For installed Scipy core the returned list has length 1\n but when building Scipy core the list may contain more directories,\n for example, a path to ``config.h`` file that\n ``scipy/base/setup.py`` file generates and is used by ``scipy``\n header files.\n\n+ ``append_path(prefix,path)`` --- smart append ``path`` to ``prefix``.\n\n+ ``def get_cmd(cmdname,_cache={})`` --- returns ``scipy.distutils``\n command instance.\n\n+ ``all_strings(lst)``\n\n+ ``has_f_sources(sources)``\n\n+ ``has_cxx_sources(sources)``\n\n+ ``filter_sources(sources)`` --- return ``c_sources, cxx_sources,\n f_sources, fmodule_sources``\n\n+ ``get_dependencies(sources)``\n\n+ ``is_local_src_dir(directory)``\n\n+ ``get_ext_source_files(ext)``\n\n+ ``get_script_files(scripts)``\n\n+ ``get_lib_source_files(lib)``\n\n+ ``get_data_files(data)``\n\n+ ``dot_join(*args)``\n\n+ ``get_frame(level=0)``\n\n+ ``cyg2win32(path)``\n\n+ ``terminal_has_colors()``, ``red_text(s)``, ``green_text(s)``,\n ``yellow_text(s)``, ``blue_text(s)``, ``cyan_text(s)``\n\n+ ``get_path(mod_name,parent_path=None)``\n\n+ ``allpath(name)``\n\n+ ``cxx_ext_match``, ``fortran_ext_match``, ``f90_ext_match``,\n ``f90_module_name_match``\n\n``scipy.distutils.system_info`` module\n--------------------------------------\n\n+ ``get_info(name,notfound_action=0)``\n+ ``combine_paths(*args,**kws)``\n+ ``show_all()``\n\n``scipy.distutils.cpuinfo`` module\n----------------------------------\n\n+ ``cpuinfo``\n\n``scipy.distutils.log`` module\n------------------------------\n\n+ ``set_verbosity(v)``\n\n\n``scipy.distutils.exec_command`` module\n---------------------------------------\n\n+ ``get_pythonexe()``\n+ ``splitcmdline(line)``\n+ ``find_executable(exe, path=None)``\n+ ``exec_command( command, execute_in='', use_shell=None, use_tee=None, **env )``\n", "source_code_before": ".. -*- rest -*-\n\nScipy Distutils - Users Guide\n=============================\n\n:Author: Pearu Peterson \n:Discussions to: scipy-dev@scipy.org\n:Created: October 2005\n\nScipy structure\n---------------\n\nCurrently Scipy project consists of two packages:\n\n- Scipy core --- it provides packages like:\n\n + scipy.distutils - extension to Python distutils\n + scipy.f2py - a tool to bind Fortran/C codes to Python\n + scipy.weave - a tool to bind C++ codes to Python\n + scipy.base - future replacement of Numeric and numarray packages\n + etc\n\n- Scipy --- a collection of Scientific tools for Python.\n\nThe aim of this document is to describe how to add new tools to Scipy.\n\n\nRequirements for SciPy packages\n-------------------------------\n\nScipy consists of Python packages, called Scipy packages, that are\navailable to Python users via ``scipy`` name space. Each Scipy package\nmay contain other Scipy packages. And so on. So, Scipy directory tree\nis a tree of packages with arbitrary depth and width. Any Scipy\npackage may depend on Scipy core packages but the dependence on other\nScipy packages should be kept minimal or zero.\n\nIn order to add a Python package to Scipy, its building script (the\n``setup.py`` file) must meet certain requirements. The minimal and the\nmost important one is that it must define a function\n``configuration(parent_package='',top_path=None)`` that returns a\ndictionary suitable for passing to ``scipy.distutils.core.setup(..)``\nfunction. In order to simplify the construction of such an distionary,\n``scipy.distutils.misc_util`` provides a class ``Configuration``, the\nusage of will be described below.\n\nScipy pure Python package example\n---------------------------------\n\nHere follows a minimal example for a pure Python Scipy package\n``setup.py`` file that will be explained in detail below::\n\n #!/usr/bin/env python\n def configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('mypackage',parent_package,top_path)\n return config\n\n if __name__ == \"__main__\":\n from scipy.distutils.core import setup\n setup(**configuration(top_path='').todict())\n\nThe first argument ``parent_package`` of the main configuration\nfunction will contain a name of the parent Scipy package and the\nsecond argument ``top_path`` contains the name of the directory where\nthe main ``setup.py`` script is located. Both arguments should be\npassed to the ``Configuration`` constructor after the name of the\ncurrent package.\n\nThe ``Configuration`` constructor has also fourth optional argument,\n``package_path``, that can be used when package files are located in\nsome other location than the directory of the ``setup.py`` file. \n\nRemaining ``Configuration`` arguments are all keyword arguments that will\nbe used to initialize attributes of ``Configuration``\ninstance. Usually, these keywords are the same as the ones that\n``setup(..)`` function would expect, for example, ``packages``,\n``ext_modules``, ``data_files``, ``include_dirs``, ``libraries``,\n``headers``, ``scripts``, ``package_dir``, etc. However, the direct\nspecification of these keywords is not recommended as the content of\nthese keyword arguments will not be processed or checked for the\nconsistency of Scipy building system.\n\nFinally, ``Configuration`` has ``.todict()`` method that returns all\nthe configuration data as a dictionary suitable for passing on to the\n``setup(..)`` function.\n\n``Configuration`` instance attributes\n-------------------------------------\n\nIn addition to attributes that can be specified via keyword arguments\nto ``Configuration`` constructor, ``Configuration`` instance (let us\ndenote as ``config``) has the following attributes that can be useful\nin writing setup scripts:\n\n+ ``config.name`` - full name of the current package. The names of parent\n packages can be extracted as ``config.name.split('.')``.\n\n+ ``config.local_path`` - path to the location of current ``setup.py`` file.\n\n+ ``config.top_path`` - path to the location of main ``setup.py`` file.\n\n``Configuration`` instance methods\n----------------------------------\n\n+ ``config.todict()`` --- returns configuration distionary suitable for\n passing to ``scipy.distutils.core.setup(..)`` function.\n\n+ ``config.paths(*paths) --- applies ``glob.glob(..)`` to items of\n ``paths`` if necessary. Fixes ``paths`` item that is relative to\n ``config.local_path``.\n\n+ ``config.get_subpackage(subpackage_name,subpackage_path=None)`` ---\n returns Scipy subpackage configuration. Subpackage is looked in the\n current directory under the name ``subpackage_name`` but the path\n can be specified also via optional ``subpackage_path`` argument.\n If ``subpackage_name`` is specified as ``None`` then the subpackage\n name will be taken the basename of ``subpackage_path``.\n\n+ ``config.add_subpackage(subpackage_name,subpackage_path=None)`` ---\n add Scipy subpackage configuration to the current one. The meaning\n and usage of arguments is explained above, see\n ``config.get_subpackage()`` method.\n\n+ ``config.add_data_files(*files)`` --- prepend ``files`` to ``data_files``\n list. If ``files`` item is a tuple then its first element defines\n the suffix of where data files are copied relative to package installation\n directory and the second element specifies the path to data\n files. By default data files are copied under package installation\n directory. For example,\n\n ::\n\n config.add_data_files('foo.dat',\n ('fun',['gun.dat','nun/pun.dat','/tmp/sun.dat']),\n 'bar/car.dat'.\n '/full/path/to/can.dat',\n )\n\n will install data files to the following locations::\n\n /\n foo.dat\n fun/\n gun.dat\n nun/\n pun.dat\n sun.dat\n bar/\n car.dat\n can.dat \n\n Path to data files can be a function taking no arguments and\n returning path(s) to data files -- this is a useful when data files\n are generated while building the package. (XXX: explain the step\n when this function are called exactly) \n\n+ ``config.add_data_dir(data_path)`` --- add directory ``data_path``\n recursively to ``data_files``. The whole directory tree starting at\n ``data_path`` will be copied under package installation directory.\n\n+ ``config.add_include_dirs(*paths)`` --- prepend ``paths`` to\n ``include_dirs`` list. This list will be visible to all extension\n modules of the current package.\n\n+ ``config.add_headers(*files)`` --- prepend ``files`` to ``headers``\n list. By default, headers will be installed under \n ``/include/pythonX.X//``\n directory. If ``files`` item is a tuple then it's first argument\n specifies the installation suffix relative to\n ``/include/pythonX.X/`` path.\n\n+ ``config.add_scripts(*files)`` --- prepend ``files`` to ``scripts``\n list. Scripts will be installed under ``/bin/`` directory.\n\n+ ``config.add_extension(name,sources,*kw)`` --- create and add an\n ``Extension`` instance to ``ext_modules`` list. The first argument \n ``name`` defines the name of the extension module that will be\n installed under ``config.name`` package. The second argument is\n a list of sources. ``add_extension`` method takes also keyword\n arguments that are passed on to the ``Extension`` constructor.\n The list of allowed keywords is the following: ``include_dirs``,\n ``define_macros``, ``undef_macros``, ``library_dirs``, ``libraries``,\n ``runtime_library_dirs``, ``extra_objects``, ``extra_compile_args``,\n ``extra_link_args``, ``export_symbols``, ``swig_opts``, ``depends``,\n ``language``, ``f2py_options``, ``module_dirs``, ``extra_info``.\n\n Note that ``config.paths`` method is applied to all lists that\n may contain paths. ``extra_info`` is a dictionary or a list\n of dictionaries that content will be appended to keyword arguments.\n The list ``depends`` contains paths to files or directories\n that the sources of the extension module depend on. If any path\n in the ``depends`` list is newer than the extension module, then\n the module will be rebuilt.\n\n The list of sources may contain functions ('source generators')\n with a pattern ``def (ext, build_dir): return\n ``. If ``funcname`` returns ``None``, no sources\n are generated. And if the ``Extension`` instance has no sources\n after processing all source generators, no extension module will\n be built. This is the recommended way to conditionally define\n extension modules. Source generator functions are called by the\n ``build_src`` command of ``scipy.distutils``.\n\n For example, here is a typical source generator function::\n\n def generate_source(ext,build_dir):\n import os\n from distutils.dep_util import newer\n target = os.path.join(build_dir,'somesource.c')\n if newer(target,__file__):\n # create target file\n return target\n\n The first argument contains the Extension instance that can be\n useful to access its attributes like ``depends``, ``sources``,\n etc. lists and modify them during the building process.\n The second argument gives a path to a build directory that must\n be used when creating files to a disk.\n\n+ ``config.add_library(name, sources, **build_info)`` --- add\n a library to ``libraries`` list. Allowed keywords arguments\n are ``depends``, ``macros``, ``include_dirs``,\n ``extra_compiler_args``, ``f2py_options``. See ``.add_extension()``\n method for more information on arguments.\n\n+ ``config.have_f77c()`` --- return True if Fortran 77 compiler is\n available (read: a simple Fortran 77 code compiled succesfully). \n\n+ ``config.have_f90c()`` --- return True if Fortran 90 compiler is\n available (read: a simple Fortran 90 code compiled succesfully). \n\n+ ``config.get_version()`` --- return version string of the current package,\n ``None`` if version information could not be detected. This methods\n scans files ``__version__.py``, ``_version.py``,\n ``version.py``, ``__svn_version__.py`` for string variables\n ``version``, ``__version__``, ``_version``.\n\n+ ``config.make_svn_version_py()`` --- appends a data function to\n ``data_files`` list that will generate ``__svn_version__.py`` file\n to the current package directory. The file will be removed from\n the source directory when Python exits.\n\n+ ``config.get_build_temp_dir()`` --- return a path to a temporary\n directory. This is the place where one should build temporary\n files.\n\n+ ``config.get_distribution()`` --- return distutils ``Distribution``\n instance.\n\n+ ``config.get_config_cmd()`` --- returns ``scipy.distutils`` config\n command instance.\n\nTemplate files\n--------------\n\nXXX: Describe how files with extensions ``.f.src``, ``.pyf.src``,\n``.c.src``, etc. are pre-processed by the ``build_src`` command.\n\nUseful functions in ``scipy.distutils.misc_util``\n-------------------------------------------------\n\n+ ``get_scipy_include_dirs()`` --- return a list of Scipy base\n include directories. Scipy base include directories contain\n header files such as ``scipy/arrayobject.h``, ``scipy/funcobject.h``\n etc. For installed Scipy core the returned list has length 1\n but when building Scipy core the list may contain more directories,\n for example, a path to ``config.h`` file that\n ``scipy/base/setup.py`` file generates and is used by ``scipy``\n header files.\n\n+ ``append_path(prefix,path)`` --- smart append ``path`` to ``prefix``.\n\n+ ``def get_cmd(cmdname,_cache={})`` --- returns ``scipy.distutils``\n command instance.\n\n+ ``all_strings(lst)``\n\n+ ``has_f_sources(sources)``\n\n+ ``has_cxx_sources(sources)``\n\n+ ``filter_sources(sources)`` --- return ``c_sources, cxx_sources,\n f_sources, fmodule_sources``\n\n+ ``get_dependencies(sources)``\n\n+ ``is_local_src_dir(directory)``\n\n+ ``get_ext_source_files(ext)``\n\n+ ``get_script_files(scripts)``\n\n+ ``get_lib_source_files(lib)``\n\n+ ``get_data_files(data)``\n\n+ ``dot_join(*args)``\n\n+ ``get_frame(level=0)``\n\n+ ``cyg2win32(path)``\n\n+ ``terminal_has_colors()``, ``red_text(s)``, ``green_text(s)``,\n ``yellow_text(s)``, ``blue_text(s)``, ``cyan_text(s)``\n\n+ ``get_path(mod_name,parent_path=None)``\n\n+ ``allpath(name)``\n\n+ ``cxx_ext_match``, ``fortran_ext_match``, ``f90_ext_match``,\n ``f90_module_name_match``\n\n``scipy.distutils.system_info`` module\n--------------------------------------\n\n+ ``get_info(name,notfound_action=0)``\n+ ``combine_paths(*args,**kws)``\n+ ``show_all()``\n\n``scipy.distutils.cpuinfo`` module\n----------------------------------\n\n+ ``cpuinfo``\n\n``scipy.distutils.log`` module\n------------------------------\n\n+ ``set_verbosity(v)``\n\n\n``scipy.distutils.exec_command`` module\n---------------------------------------\n\n+ ``get_pythonexe()``\n+ ``splitcmdline(line)``\n+ ``find_executable(exe, path=None)``\n+ ``exec_command( command, execute_in='', use_shell=None, use_tee=None, **env )``\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ " If ``data_path`` is a tuple then its first element defines", " the suffix of where data files are copied relative to package installation", " directory and the second element specifies the path to data directory.", " By default data directory are copied under package installation", " directory. For example,", "", " ::", "", " config.add_data_dir('fun') # fun/ contains foo.dat bar/car.dat", " config.add_data_dir(('sun','fun'))", " config.add_data_dir(('gun','/full/path/to/fun'))", "", " will install data files to the following locations", "", " /", " fun/", " foo.dat", " bar/", " car.dat", " sun/", " foo.dat", " bar/", " car.dat", " gun/", " foo.dat", " car.dat" ], "deleted": [] } }, { "old_path": "scipy/test/testing.py", "new_path": "scipy/test/testing.py", "filename": "testing.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -292,6 +292,7 @@ def _get_module_tests(self,module,level):\n if short_module_name[-8:]=='_version' \\\n and short_module_name[:-8]==module.__name__.split('.')[-2]:\n return []\n+ print test_file\n print ' !! No test file %r found for %s' \\\n % (os.path.basename(test_file), mstr(module))\n return []\n", "added_lines": 1, "deleted_lines": 0, "source_code": "\"\"\"\nUnit-testing\n------------\n\n ScipyTest -- Scipy tests site manager\n ScipyTestCase -- unittest.TestCase with measure method\n IgnoreException -- raise when checking disabled feature ('ignoring' is displayed)\n set_package_path -- prepend package build directory to path\n set_local_path -- prepend local directory (to tests files) to path\n restore_path -- restore path after set_package_path\n\nTiming tools\n------------\n\n jiffies -- return 1/100ths of a second that the current process has used\n memusage -- virtual memory size in bytes of the running python [linux]\n\nUtility functions\n-----------------\n\n assert_equal -- assert equality\n assert_almost_equal -- assert equality with decimal tolerance\n assert_approx_equal -- assert equality with significant digits tolerance\n assert_array_equal -- assert arrays equality\n assert_array_almost_equal -- assert arrays equality with decimal tolerance\n assert_array_less -- assert arrays less-ordering\n rand -- array of random numbers from given shape\n\n\"\"\"\n\n__all__ = []\n\nimport os,sys,time,glob,string,traceback,unittest\nimport types\nimport imp\n\n#\n# Imports from scipy.base must be done at the end of this file.\n#\n\nDEBUG = 0\n\n__all__.append('set_package_path')\ndef set_package_path(level=1):\n \"\"\" Prepend package directory to sys.path.\n\n set_package_path should be called from a test_file.py that\n satisfies the following tree structure:\n\n //test_file.py\n\n Then the first existing path name from the following list\n\n /build/lib.-\n /..\n\n is prepended to sys.path.\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from distutils.util import get_platform\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n d = os.path.dirname(os.path.dirname(os.path.abspath(testfile)))\n d1 = os.path.join(d,'build','lib.%s-%s'%(get_platform(),sys.version[:3]))\n if not os.path.isdir(d1):\n d1 = os.path.dirname(d)\n if DEBUG:\n print 'Inserting %r to sys.path' % (d1)\n sys.path.insert(0,d1)\n\n__all__.append('set_local_path')\ndef set_local_path(reldir='', level=1):\n \"\"\" Prepend local directory to sys.path.\n\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n local_path = os.path.join(os.path.dirname(os.path.abspath(testfile)),reldir)\n if DEBUG:\n print 'Inserting %r to sys.path' % (local_path)\n sys.path.insert(0,local_path)\n\n__all__.append('restore_path')\ndef restore_path():\n if DEBUG:\n print 'Removing %r from sys.path' % (sys.path[0])\n del sys.path[0]\n\n__all__.extend(['jiffies','memusage'])\nif sys.platform[:5]=='linux':\n def jiffies(_proc_pid_stat = '/proc/%s/stat'%(os.getpid()),\n _load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. See man 5 proc. \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[13])\n except:\n return int(100*(time.time()-_load_time))\n\n def memusage(_proc_pid_stat = '/proc/%s/stat'%(os.getpid())):\n \"\"\" Return virtual memory size in bytes of the running python.\n \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[22])\n except:\n return\nelse:\n # os.getpid is not in all platforms available.\n # Using time is safe but inaccurate, especially when process\n # was suspended or sleeping.\n def jiffies(_load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. [Emulation with time.time]. \"\"\"\n return int(100*(time.time()-_load_time))\n\n def memusage():\n \"\"\" Return memory usage of running python. [Not implemented]\"\"\"\n return\n\n__all__.append('ScipyTestCase')\nclass ScipyTestCase (unittest.TestCase):\n\n def measure(self,code_str,times=1):\n \"\"\" Return elapsed time for executing code_str in the\n namespace of the caller for given times.\n \"\"\"\n frame = sys._getframe(1)\n locs,globs = frame.f_locals,frame.f_globals\n code = compile(code_str,\n 'ScipyTestCase runner for '+self.__class__.__name__,\n 'exec')\n i = 0\n elapsed = jiffies()\n while i>> ScipyTest().test(level=1,verbosity=2)\n\n is package name or its module object.\n\n Package is supposed to contain a directory tests/\n with test_*.py files where * refers to the names of submodules.\n\n test_*.py files are supposed to define a classes, derived\n from ScipyTestCase or unittest.TestCase, with methods having\n names starting with test or bench or check.\n\n And that is it! No need to implement test or test_suite functions\n in each .py file.\n\n Also old styled test_suite(level=1) hooks are supported but\n soon to be removed.\n \"\"\"\n def __init__(self, package='__main__'):\n self.package = package\n\n def _module_str(self, module):\n filename = module.__file__[-30:]\n if filename!=module.__file__:\n filename = '...'+filename\n return '' % (`module.__name__`, `filename`)\n\n def _get_method_names(self,clsobj,level):\n names = []\n for mthname in _get_all_method_names(clsobj):\n if mthname[:5] not in ['bench','check'] \\\n and mthname[:4] not in ['test']:\n continue\n mth = getattr(clsobj, mthname)\n if type(mth) is not types.MethodType:\n continue\n d = mth.im_func.func_defaults\n if d is not None:\n mthlevel = d[0]\n else:\n mthlevel = 1\n if level>=mthlevel:\n if mthname not in names:\n names.append(mthname)\n for base in clsobj.__bases__:\n for n in self._get_method_names(base,level):\n if n not in names:\n names.append(n) \n return names\n\n def _get_module_tests(self,module,level):\n mstr = self._module_str\n d,f = os.path.split(module.__file__)\n\n short_module_name = os.path.splitext(os.path.basename(f))[0]\n if short_module_name=='__init__':\n short_module_name = module.__name__.split('.')[-1]\n\n test_dir = os.path.join(d,'tests')\n test_file = os.path.join(test_dir,'test_'+short_module_name+'.py')\n\n local_test_dir = os.path.join(os.getcwd(),'tests')\n local_test_file = os.path.join(local_test_dir,\n 'test_'+short_module_name+'.py')\n if os.path.basename(os.path.dirname(local_test_dir)) \\\n == os.path.basename(os.path.dirname(test_dir)) \\\n and os.path.isfile(local_test_file):\n test_file = local_test_file\n\n if not os.path.isfile(test_file):\n if short_module_name[:5]=='info_' \\\n and short_module_name[5:]==module.__name__.split('.')[-2]:\n return []\n if short_module_name in ['__cvs_version__','__svn_version__']:\n return []\n if short_module_name[-8:]=='_version' \\\n and short_module_name[:-8]==module.__name__.split('.')[-2]:\n return []\n print test_file\n print ' !! No test file %r found for %s' \\\n % (os.path.basename(test_file), mstr(module))\n return []\n\n try:\n if sys.version[:3]=='2.1':\n # Workaround for Python 2.1 .pyc file generator bug\n import random\n pref = '-nopyc'+`random.randint(1,100)`\n else:\n pref = ''\n f = open(test_file,'r')\n test_module = imp.load_module(\\\n module.__name__+'.test_'+short_module_name+pref,\n f, test_file+pref,('.py', 'r', 1))\n f.close()\n if sys.version[:3]=='2.1' and os.path.isfile(test_file+pref+'c'):\n os.remove(test_file+pref+'c')\n except:\n print ' !! FAILURE importing tests for ', mstr(module)\n print ' ',\n output_exception()\n return []\n return self._get_suite_list(test_module, level, module.__name__)\n\n def _get_suite_list(self, test_module, level, module_name='__main__'):\n mstr = self._module_str\n if hasattr(test_module,'test_suite'):\n # Using old styled test suite\n try:\n total_suite = test_module.test_suite(level)\n return total_suite._tests\n except:\n print ' !! FAILURE building tests for ', mstr(test_module)\n print ' ',\n output_exception()\n return []\n suite_list = []\n for name in dir(test_module):\n obj = getattr(test_module, name)\n if type(obj) is not type(unittest.TestCase) \\\n or not issubclass(obj, unittest.TestCase) \\\n or obj.__name__[:4] != 'test':\n continue\n for mthname in self._get_method_names(obj,level):\n suite = obj(mthname)\n if getattr(suite,'isrunnable',lambda mthname:1)(mthname):\n suite_list.append(suite)\n print ' Found',len(suite_list),'tests for',module_name\n return suite_list\n\n def test(self,level=1,verbosity=1):\n \"\"\" Run Scipy module test suite with level and verbosity.\n \"\"\"\n if type(self.package) is type(''):\n exec 'import %s as this_package' % (self.package)\n else:\n this_package = self.package\n\n package_name = this_package.__name__\n\n suites = []\n for name, module in sys.modules.items():\n if package_name != name[:len(package_name)] \\\n or module is None \\\n or os.path.basename(os.path.dirname(module.__file__))=='tests':\n continue\n suites.extend(self._get_module_tests(module, level))\n\n suites.extend(self._get_suite_list(sys.modules[package_name], level))\n\n all_tests = unittest.TestSuite(suites)\n runner = unittest.TextTestRunner(verbosity=verbosity)\n runner.run(all_tests)\n return runner\n\n def run(self):\n \"\"\" Run Scipy module test suite with level and verbosity\n taken from sys.argv. Requires optparse module.\n \"\"\"\n try:\n from optparse import OptionParser\n except ImportError:\n print 'Failed to import optparse module, ignoring.'\n return self.test()\n usage = r'usage: %prog [-v ] [-l ]'\n parser = OptionParser(usage)\n parser.add_option(\"-v\", \"--verbosity\",\n action=\"store\",\n dest=\"verbosity\",\n default=1,\n type='int')\n parser.add_option(\"-l\", \"--level\",\n action=\"store\",\n dest=\"level\",\n default=1,\n type='int')\n (options, args) = parser.parse_args()\n self.test(options.level,options.verbosity)\n\n#------------\n \ndef remove_ignored_patterns(files,pattern):\n from fnmatch import fnmatch\n good_files = []\n for file in files:\n if not fnmatch(file,pattern):\n good_files.append(file)\n return good_files\n\ndef remove_ignored_files(original,ignored_files,cur_dir):\n \"\"\" This is actually expanded to do pattern matching.\n\n \"\"\"\n if not ignored_files: ignored_files = []\n ignored_modules = map(lambda x: x+'.py',ignored_files)\n ignored_packages = ignored_files[:]\n # always ignore setup.py and __init__.py files\n ignored_files = ['setup.py','setup_*.py','__init__.py']\n ignored_files += ignored_modules + ignored_packages\n ignored_files = map(lambda x,cur_dir=cur_dir: os.path.join(cur_dir,x),\n ignored_files)\n #print 'ignored:', ignored_files\n #good_files = filter(lambda x,ignored = ignored_files: x not in ignored,\n # original)\n good_files = original\n for pattern in ignored_files:\n good_files = remove_ignored_patterns(good_files,pattern)\n\n return good_files\n\n__all__.append('harvest_modules')\ndef harvest_modules(package,ignore=None):\n \"\"\"* Retreive a list of all modules that live within a package.\n\n Only retreive files that are immediate children of the\n package -- do not recurse through child packages or\n directories. The returned list contains actual modules, not\n just their names.\n *\"\"\"\n d,f = os.path.split(package.__file__)\n\n # go through the directory and import every py file there.\n common_dir = os.path.join(d,'*.py')\n py_files = glob.glob(common_dir)\n #py_files.remove(os.path.join(d,'__init__.py'))\n #py_files.remove(os.path.join(d,'setup.py'))\n\n py_files = remove_ignored_files(py_files,ignore,d)\n #print 'py_files:', py_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n\n all_modules = []\n for file in py_files:\n d,f = os.path.split(file)\n base,ext = os.path.splitext(f)\n mod = prefix + '.' + base\n #print 'module: import ' + mod\n try:\n exec ('import ' + mod)\n all_modules.append(eval(mod))\n except:\n print 'FAILURE to import ' + mod\n output_exception()\n\n return all_modules\n\n__all__.append('harvest_packages')\ndef harvest_packages(package,ignore = None):\n \"\"\" Retreive a list of all sub-packages that live within a package.\n\n Only retreive packages that are immediate children of this\n package -- do not recurse through child packages or\n directories. The returned list contains actual package objects, not\n just their names.\n \"\"\"\n join = os.path.join\n\n d,f = os.path.split(package.__file__)\n\n common_dir = os.path.abspath(d)\n all_files = os.listdir(d)\n\n all_files = remove_ignored_files(all_files,ignore,'')\n #print 'all_files:', all_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n all_packages = []\n for directory in all_files:\n path = join(common_dir,directory)\n if os.path.isdir(path) and \\\n os.path.exists(join(path,'__init__.py')):\n sub_package = prefix + '.' + directory\n #print 'sub-package import ' + sub_package\n try:\n exec ('import ' + sub_package)\n all_packages.append(eval(sub_package))\n except:\n print 'FAILURE to import ' + sub_package\n output_exception()\n return all_packages\n\n__all__.append('harvest_modules_and_packages')\ndef harvest_modules_and_packages(package,ignore=None):\n \"\"\" Retreive list of all packages and modules that live within a package.\n\n See harvest_packages() and harvest_modules()\n \"\"\"\n all = harvest_modules(package,ignore) + harvest_packages(package,ignore)\n return all\n\n__all__.append('harvest_test_suites')\ndef harvest_test_suites(package,ignore = None,level=10):\n \"\"\"\n package -- the module to test. This is an actual module object\n (not a string)\n ignore -- a list of module names to omit from the tests\n level -- a value between 1 and 10. 1 will run the minimum number\n of tests. This is a fast \"smoke test\". Tests that take\n longer to run should have higher numbers ranging up to 10.\n \"\"\"\n suites=[]\n test_modules = harvest_modules_and_packages(package,ignore)\n #for i in test_modules:\n # print i.__name__\n for module in test_modules:\n if hasattr(module,'test_suite'):\n try:\n suite = module.test_suite(level=level)\n if suite:\n suites.append(suite)\n else:\n print \" !! FAILURE without error - shouldn't happen\",\n print module.__name__\n except:\n print ' !! FAILURE building test for ', module.__name__\n print ' ',\n output_exception()\n else:\n try:\n print 'No test suite found for ', module.__name__\n except AttributeError:\n # __version__.py getting replaced by a string throws a kink\n # in checking for modules, so we think is a module has\n # actually been overwritten\n print 'No test suite found for ', str(module)\n total_suite = unittest.TestSuite(suites)\n return total_suite\n\n__all__.append('module_test')\ndef module_test(mod_name,mod_file,level=10):\n \"\"\"*\n\n *\"\"\"\n #print 'testing', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);%s.test(%d)' % \\\n ((test_module,)*3 + (level,))\n\n # This would be better cause it forces a reload of the orginal\n # module. It doesn't behave with packages however.\n #test_string = 'reload(%s);import %s;reload(%s);%s.test(%d)' % \\\n # ((mod_name,) + (test_module,)*3)\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n\n__all__.append('module_test_suite')\ndef module_test_suite(mod_name,mod_file,level=10):\n #try:\n print ' creating test suite for:', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);suite = %s.test_suite(%d)' % \\\n ((test_module,)*3+(level,))\n #print test_string\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n return suite\n #except:\n # print ' !! FAILURE loading test suite from', test_module, ':'\n # print ' ',\n # output_exception()\n\n\n# Utility function to facilitate testing.\n\n__all__.append('assert_equal')\ndef assert_equal(actual,desired,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_equal(actual, desired, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert desired == actual, msg\n\n__all__.append('assert_almost_equal')\ndef assert_almost_equal(actual,desired,decimal=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_almost_equal(actual, desired, decimal, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert round(abs(desired - actual),decimal) == 0, msg\n\n__all__.append('assert_approx_equal')\ndef assert_approx_equal(actual,desired,significant=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n Approximately equal is defined as the number of significant digits\n correct\n \"\"\"\n msg = '\\nItems are not equal to %d significant digits:\\n' % significant\n msg += err_msg\n actual, desired = map(float, (actual, desired))\n # Normalized the numbers to be in range (-10.0,10.0)\n scale = pow(10,math.floor(math.log10(0.5*(abs(desired)+abs(actual)))))\n try:\n sc_desired = desired/scale\n except ZeroDivisionError:\n sc_desired = 0.0\n try:\n sc_actual = actual/scale\n except ZeroDivisionError:\n sc_actual = 0.0\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert math.fabs(sc_desired - sc_actual) < pow(10.,-1*significant), msg\n\n\n__all__.append('assert_array_equal')\ndef assert_array_equal(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not equal'\n try:\n assert 0 in [len(shape(x)),len(shape(y))] \\\n or (len(shape(x))==len(shape(y)) and \\\n alltrue(equal(shape(x),shape(y)))),\\\n msg + ' (shapes %s, %s mismatch):\\n\\t' \\\n % (shape(x),shape(y)) + err_msg\n reduced = ravel(equal(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n raise ValueError, msg\n\n__all__.append('assert_array_almost_equal')\ndef assert_array_almost_equal(x,y,decimal=6,err_msg=''):\n x = asarray(x)\n y = asarray(y)\n msg = '\\nArrays are not almost equal'\n try:\n cond = alltrue(equal(shape(x),shape(y)))\n if not cond:\n msg = msg + ' (shapes mismatch):\\n\\t'\\\n 'Shape of array 1: %s\\n\\tShape of array 2: %s' % (shape(x),shape(y))\n assert cond, msg + '\\n\\t' + err_msg\n reduced = ravel(equal(less_equal(around(abs(x-y),decimal),10.0**(-decimal)),1))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=decimal+1)\n s2 = array2string(y,precision=decimal+1)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print sys.exc_value\n print shape(x),shape(y)\n print x, y\n raise ValueError, 'arrays are not almost equal'\n\n__all__.append('assert_array_less')\ndef assert_array_less(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not less-ordered'\n try:\n assert alltrue(equal(shape(x),shape(y))),\\\n msg + ' (shapes mismatch):\\n\\t' + err_msg\n reduced = ravel(less(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print shape(x),shape(y)\n raise ValueError, 'arrays are not less-ordered'\n\n__all__.append('rand')\ndef rand(*args):\n \"\"\"Returns an array of random numbers with the given shape.\n \n This only uses the standard library, so it is useful for testing purposes. \n \"\"\"\n import random\n results = zeros(args,Float64)\n f = results.flat\n for i in range(len(f)):\n f[i] = random.random()\n return results\n\ndef output_exception():\n try:\n type, value, tb = sys.exc_info()\n info = traceback.extract_tb(tb)\n #this is more verbose\n #traceback.print_exc()\n filename, lineno, function, text = info[-1] # last line only\n print \"%s:%d: %s: %s (in %s)\" %\\\n (filename, lineno, type.__name__, str(value), function)\n finally:\n type = value = tb = None # clean up\n\nfrom scipy.base import alltrue, equal, shape, ravel, around, zeros,\\\n Float64, asarray, less_equal, array2string, less, ArrayType\n\ntry:\n from scipy.base import math\nexcept ImportError,msg:\n print msg\n import math\n", "source_code_before": "\"\"\"\nUnit-testing\n------------\n\n ScipyTest -- Scipy tests site manager\n ScipyTestCase -- unittest.TestCase with measure method\n IgnoreException -- raise when checking disabled feature ('ignoring' is displayed)\n set_package_path -- prepend package build directory to path\n set_local_path -- prepend local directory (to tests files) to path\n restore_path -- restore path after set_package_path\n\nTiming tools\n------------\n\n jiffies -- return 1/100ths of a second that the current process has used\n memusage -- virtual memory size in bytes of the running python [linux]\n\nUtility functions\n-----------------\n\n assert_equal -- assert equality\n assert_almost_equal -- assert equality with decimal tolerance\n assert_approx_equal -- assert equality with significant digits tolerance\n assert_array_equal -- assert arrays equality\n assert_array_almost_equal -- assert arrays equality with decimal tolerance\n assert_array_less -- assert arrays less-ordering\n rand -- array of random numbers from given shape\n\n\"\"\"\n\n__all__ = []\n\nimport os,sys,time,glob,string,traceback,unittest\nimport types\nimport imp\n\n#\n# Imports from scipy.base must be done at the end of this file.\n#\n\nDEBUG = 0\n\n__all__.append('set_package_path')\ndef set_package_path(level=1):\n \"\"\" Prepend package directory to sys.path.\n\n set_package_path should be called from a test_file.py that\n satisfies the following tree structure:\n\n //test_file.py\n\n Then the first existing path name from the following list\n\n /build/lib.-\n /..\n\n is prepended to sys.path.\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from distutils.util import get_platform\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n d = os.path.dirname(os.path.dirname(os.path.abspath(testfile)))\n d1 = os.path.join(d,'build','lib.%s-%s'%(get_platform(),sys.version[:3]))\n if not os.path.isdir(d1):\n d1 = os.path.dirname(d)\n if DEBUG:\n print 'Inserting %r to sys.path' % (d1)\n sys.path.insert(0,d1)\n\n__all__.append('set_local_path')\ndef set_local_path(reldir='', level=1):\n \"\"\" Prepend local directory to sys.path.\n\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n local_path = os.path.join(os.path.dirname(os.path.abspath(testfile)),reldir)\n if DEBUG:\n print 'Inserting %r to sys.path' % (local_path)\n sys.path.insert(0,local_path)\n\n__all__.append('restore_path')\ndef restore_path():\n if DEBUG:\n print 'Removing %r from sys.path' % (sys.path[0])\n del sys.path[0]\n\n__all__.extend(['jiffies','memusage'])\nif sys.platform[:5]=='linux':\n def jiffies(_proc_pid_stat = '/proc/%s/stat'%(os.getpid()),\n _load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. See man 5 proc. \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[13])\n except:\n return int(100*(time.time()-_load_time))\n\n def memusage(_proc_pid_stat = '/proc/%s/stat'%(os.getpid())):\n \"\"\" Return virtual memory size in bytes of the running python.\n \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[22])\n except:\n return\nelse:\n # os.getpid is not in all platforms available.\n # Using time is safe but inaccurate, especially when process\n # was suspended or sleeping.\n def jiffies(_load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. [Emulation with time.time]. \"\"\"\n return int(100*(time.time()-_load_time))\n\n def memusage():\n \"\"\" Return memory usage of running python. [Not implemented]\"\"\"\n return\n\n__all__.append('ScipyTestCase')\nclass ScipyTestCase (unittest.TestCase):\n\n def measure(self,code_str,times=1):\n \"\"\" Return elapsed time for executing code_str in the\n namespace of the caller for given times.\n \"\"\"\n frame = sys._getframe(1)\n locs,globs = frame.f_locals,frame.f_globals\n code = compile(code_str,\n 'ScipyTestCase runner for '+self.__class__.__name__,\n 'exec')\n i = 0\n elapsed = jiffies()\n while i>> ScipyTest().test(level=1,verbosity=2)\n\n is package name or its module object.\n\n Package is supposed to contain a directory tests/\n with test_*.py files where * refers to the names of submodules.\n\n test_*.py files are supposed to define a classes, derived\n from ScipyTestCase or unittest.TestCase, with methods having\n names starting with test or bench or check.\n\n And that is it! No need to implement test or test_suite functions\n in each .py file.\n\n Also old styled test_suite(level=1) hooks are supported but\n soon to be removed.\n \"\"\"\n def __init__(self, package='__main__'):\n self.package = package\n\n def _module_str(self, module):\n filename = module.__file__[-30:]\n if filename!=module.__file__:\n filename = '...'+filename\n return '' % (`module.__name__`, `filename`)\n\n def _get_method_names(self,clsobj,level):\n names = []\n for mthname in _get_all_method_names(clsobj):\n if mthname[:5] not in ['bench','check'] \\\n and mthname[:4] not in ['test']:\n continue\n mth = getattr(clsobj, mthname)\n if type(mth) is not types.MethodType:\n continue\n d = mth.im_func.func_defaults\n if d is not None:\n mthlevel = d[0]\n else:\n mthlevel = 1\n if level>=mthlevel:\n if mthname not in names:\n names.append(mthname)\n for base in clsobj.__bases__:\n for n in self._get_method_names(base,level):\n if n not in names:\n names.append(n) \n return names\n\n def _get_module_tests(self,module,level):\n mstr = self._module_str\n d,f = os.path.split(module.__file__)\n\n short_module_name = os.path.splitext(os.path.basename(f))[0]\n if short_module_name=='__init__':\n short_module_name = module.__name__.split('.')[-1]\n\n test_dir = os.path.join(d,'tests')\n test_file = os.path.join(test_dir,'test_'+short_module_name+'.py')\n\n local_test_dir = os.path.join(os.getcwd(),'tests')\n local_test_file = os.path.join(local_test_dir,\n 'test_'+short_module_name+'.py')\n if os.path.basename(os.path.dirname(local_test_dir)) \\\n == os.path.basename(os.path.dirname(test_dir)) \\\n and os.path.isfile(local_test_file):\n test_file = local_test_file\n\n if not os.path.isfile(test_file):\n if short_module_name[:5]=='info_' \\\n and short_module_name[5:]==module.__name__.split('.')[-2]:\n return []\n if short_module_name in ['__cvs_version__','__svn_version__']:\n return []\n if short_module_name[-8:]=='_version' \\\n and short_module_name[:-8]==module.__name__.split('.')[-2]:\n return []\n print ' !! No test file %r found for %s' \\\n % (os.path.basename(test_file), mstr(module))\n return []\n\n try:\n if sys.version[:3]=='2.1':\n # Workaround for Python 2.1 .pyc file generator bug\n import random\n pref = '-nopyc'+`random.randint(1,100)`\n else:\n pref = ''\n f = open(test_file,'r')\n test_module = imp.load_module(\\\n module.__name__+'.test_'+short_module_name+pref,\n f, test_file+pref,('.py', 'r', 1))\n f.close()\n if sys.version[:3]=='2.1' and os.path.isfile(test_file+pref+'c'):\n os.remove(test_file+pref+'c')\n except:\n print ' !! FAILURE importing tests for ', mstr(module)\n print ' ',\n output_exception()\n return []\n return self._get_suite_list(test_module, level, module.__name__)\n\n def _get_suite_list(self, test_module, level, module_name='__main__'):\n mstr = self._module_str\n if hasattr(test_module,'test_suite'):\n # Using old styled test suite\n try:\n total_suite = test_module.test_suite(level)\n return total_suite._tests\n except:\n print ' !! FAILURE building tests for ', mstr(test_module)\n print ' ',\n output_exception()\n return []\n suite_list = []\n for name in dir(test_module):\n obj = getattr(test_module, name)\n if type(obj) is not type(unittest.TestCase) \\\n or not issubclass(obj, unittest.TestCase) \\\n or obj.__name__[:4] != 'test':\n continue\n for mthname in self._get_method_names(obj,level):\n suite = obj(mthname)\n if getattr(suite,'isrunnable',lambda mthname:1)(mthname):\n suite_list.append(suite)\n print ' Found',len(suite_list),'tests for',module_name\n return suite_list\n\n def test(self,level=1,verbosity=1):\n \"\"\" Run Scipy module test suite with level and verbosity.\n \"\"\"\n if type(self.package) is type(''):\n exec 'import %s as this_package' % (self.package)\n else:\n this_package = self.package\n\n package_name = this_package.__name__\n\n suites = []\n for name, module in sys.modules.items():\n if package_name != name[:len(package_name)] \\\n or module is None \\\n or os.path.basename(os.path.dirname(module.__file__))=='tests':\n continue\n suites.extend(self._get_module_tests(module, level))\n\n suites.extend(self._get_suite_list(sys.modules[package_name], level))\n\n all_tests = unittest.TestSuite(suites)\n runner = unittest.TextTestRunner(verbosity=verbosity)\n runner.run(all_tests)\n return runner\n\n def run(self):\n \"\"\" Run Scipy module test suite with level and verbosity\n taken from sys.argv. Requires optparse module.\n \"\"\"\n try:\n from optparse import OptionParser\n except ImportError:\n print 'Failed to import optparse module, ignoring.'\n return self.test()\n usage = r'usage: %prog [-v ] [-l ]'\n parser = OptionParser(usage)\n parser.add_option(\"-v\", \"--verbosity\",\n action=\"store\",\n dest=\"verbosity\",\n default=1,\n type='int')\n parser.add_option(\"-l\", \"--level\",\n action=\"store\",\n dest=\"level\",\n default=1,\n type='int')\n (options, args) = parser.parse_args()\n self.test(options.level,options.verbosity)\n\n#------------\n \ndef remove_ignored_patterns(files,pattern):\n from fnmatch import fnmatch\n good_files = []\n for file in files:\n if not fnmatch(file,pattern):\n good_files.append(file)\n return good_files\n\ndef remove_ignored_files(original,ignored_files,cur_dir):\n \"\"\" This is actually expanded to do pattern matching.\n\n \"\"\"\n if not ignored_files: ignored_files = []\n ignored_modules = map(lambda x: x+'.py',ignored_files)\n ignored_packages = ignored_files[:]\n # always ignore setup.py and __init__.py files\n ignored_files = ['setup.py','setup_*.py','__init__.py']\n ignored_files += ignored_modules + ignored_packages\n ignored_files = map(lambda x,cur_dir=cur_dir: os.path.join(cur_dir,x),\n ignored_files)\n #print 'ignored:', ignored_files\n #good_files = filter(lambda x,ignored = ignored_files: x not in ignored,\n # original)\n good_files = original\n for pattern in ignored_files:\n good_files = remove_ignored_patterns(good_files,pattern)\n\n return good_files\n\n__all__.append('harvest_modules')\ndef harvest_modules(package,ignore=None):\n \"\"\"* Retreive a list of all modules that live within a package.\n\n Only retreive files that are immediate children of the\n package -- do not recurse through child packages or\n directories. The returned list contains actual modules, not\n just their names.\n *\"\"\"\n d,f = os.path.split(package.__file__)\n\n # go through the directory and import every py file there.\n common_dir = os.path.join(d,'*.py')\n py_files = glob.glob(common_dir)\n #py_files.remove(os.path.join(d,'__init__.py'))\n #py_files.remove(os.path.join(d,'setup.py'))\n\n py_files = remove_ignored_files(py_files,ignore,d)\n #print 'py_files:', py_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n\n all_modules = []\n for file in py_files:\n d,f = os.path.split(file)\n base,ext = os.path.splitext(f)\n mod = prefix + '.' + base\n #print 'module: import ' + mod\n try:\n exec ('import ' + mod)\n all_modules.append(eval(mod))\n except:\n print 'FAILURE to import ' + mod\n output_exception()\n\n return all_modules\n\n__all__.append('harvest_packages')\ndef harvest_packages(package,ignore = None):\n \"\"\" Retreive a list of all sub-packages that live within a package.\n\n Only retreive packages that are immediate children of this\n package -- do not recurse through child packages or\n directories. The returned list contains actual package objects, not\n just their names.\n \"\"\"\n join = os.path.join\n\n d,f = os.path.split(package.__file__)\n\n common_dir = os.path.abspath(d)\n all_files = os.listdir(d)\n\n all_files = remove_ignored_files(all_files,ignore,'')\n #print 'all_files:', all_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n all_packages = []\n for directory in all_files:\n path = join(common_dir,directory)\n if os.path.isdir(path) and \\\n os.path.exists(join(path,'__init__.py')):\n sub_package = prefix + '.' + directory\n #print 'sub-package import ' + sub_package\n try:\n exec ('import ' + sub_package)\n all_packages.append(eval(sub_package))\n except:\n print 'FAILURE to import ' + sub_package\n output_exception()\n return all_packages\n\n__all__.append('harvest_modules_and_packages')\ndef harvest_modules_and_packages(package,ignore=None):\n \"\"\" Retreive list of all packages and modules that live within a package.\n\n See harvest_packages() and harvest_modules()\n \"\"\"\n all = harvest_modules(package,ignore) + harvest_packages(package,ignore)\n return all\n\n__all__.append('harvest_test_suites')\ndef harvest_test_suites(package,ignore = None,level=10):\n \"\"\"\n package -- the module to test. This is an actual module object\n (not a string)\n ignore -- a list of module names to omit from the tests\n level -- a value between 1 and 10. 1 will run the minimum number\n of tests. This is a fast \"smoke test\". Tests that take\n longer to run should have higher numbers ranging up to 10.\n \"\"\"\n suites=[]\n test_modules = harvest_modules_and_packages(package,ignore)\n #for i in test_modules:\n # print i.__name__\n for module in test_modules:\n if hasattr(module,'test_suite'):\n try:\n suite = module.test_suite(level=level)\n if suite:\n suites.append(suite)\n else:\n print \" !! FAILURE without error - shouldn't happen\",\n print module.__name__\n except:\n print ' !! FAILURE building test for ', module.__name__\n print ' ',\n output_exception()\n else:\n try:\n print 'No test suite found for ', module.__name__\n except AttributeError:\n # __version__.py getting replaced by a string throws a kink\n # in checking for modules, so we think is a module has\n # actually been overwritten\n print 'No test suite found for ', str(module)\n total_suite = unittest.TestSuite(suites)\n return total_suite\n\n__all__.append('module_test')\ndef module_test(mod_name,mod_file,level=10):\n \"\"\"*\n\n *\"\"\"\n #print 'testing', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);%s.test(%d)' % \\\n ((test_module,)*3 + (level,))\n\n # This would be better cause it forces a reload of the orginal\n # module. It doesn't behave with packages however.\n #test_string = 'reload(%s);import %s;reload(%s);%s.test(%d)' % \\\n # ((mod_name,) + (test_module,)*3)\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n\n__all__.append('module_test_suite')\ndef module_test_suite(mod_name,mod_file,level=10):\n #try:\n print ' creating test suite for:', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);suite = %s.test_suite(%d)' % \\\n ((test_module,)*3+(level,))\n #print test_string\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n return suite\n #except:\n # print ' !! FAILURE loading test suite from', test_module, ':'\n # print ' ',\n # output_exception()\n\n\n# Utility function to facilitate testing.\n\n__all__.append('assert_equal')\ndef assert_equal(actual,desired,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_equal(actual, desired, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert desired == actual, msg\n\n__all__.append('assert_almost_equal')\ndef assert_almost_equal(actual,desired,decimal=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_almost_equal(actual, desired, decimal, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert round(abs(desired - actual),decimal) == 0, msg\n\n__all__.append('assert_approx_equal')\ndef assert_approx_equal(actual,desired,significant=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n Approximately equal is defined as the number of significant digits\n correct\n \"\"\"\n msg = '\\nItems are not equal to %d significant digits:\\n' % significant\n msg += err_msg\n actual, desired = map(float, (actual, desired))\n # Normalized the numbers to be in range (-10.0,10.0)\n scale = pow(10,math.floor(math.log10(0.5*(abs(desired)+abs(actual)))))\n try:\n sc_desired = desired/scale\n except ZeroDivisionError:\n sc_desired = 0.0\n try:\n sc_actual = actual/scale\n except ZeroDivisionError:\n sc_actual = 0.0\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert math.fabs(sc_desired - sc_actual) < pow(10.,-1*significant), msg\n\n\n__all__.append('assert_array_equal')\ndef assert_array_equal(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not equal'\n try:\n assert 0 in [len(shape(x)),len(shape(y))] \\\n or (len(shape(x))==len(shape(y)) and \\\n alltrue(equal(shape(x),shape(y)))),\\\n msg + ' (shapes %s, %s mismatch):\\n\\t' \\\n % (shape(x),shape(y)) + err_msg\n reduced = ravel(equal(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n raise ValueError, msg\n\n__all__.append('assert_array_almost_equal')\ndef assert_array_almost_equal(x,y,decimal=6,err_msg=''):\n x = asarray(x)\n y = asarray(y)\n msg = '\\nArrays are not almost equal'\n try:\n cond = alltrue(equal(shape(x),shape(y)))\n if not cond:\n msg = msg + ' (shapes mismatch):\\n\\t'\\\n 'Shape of array 1: %s\\n\\tShape of array 2: %s' % (shape(x),shape(y))\n assert cond, msg + '\\n\\t' + err_msg\n reduced = ravel(equal(less_equal(around(abs(x-y),decimal),10.0**(-decimal)),1))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=decimal+1)\n s2 = array2string(y,precision=decimal+1)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print sys.exc_value\n print shape(x),shape(y)\n print x, y\n raise ValueError, 'arrays are not almost equal'\n\n__all__.append('assert_array_less')\ndef assert_array_less(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not less-ordered'\n try:\n assert alltrue(equal(shape(x),shape(y))),\\\n msg + ' (shapes mismatch):\\n\\t' + err_msg\n reduced = ravel(less(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print shape(x),shape(y)\n raise ValueError, 'arrays are not less-ordered'\n\n__all__.append('rand')\ndef rand(*args):\n \"\"\"Returns an array of random numbers with the given shape.\n \n This only uses the standard library, so it is useful for testing purposes. \n \"\"\"\n import random\n results = zeros(args,Float64)\n f = results.flat\n for i in range(len(f)):\n f[i] = random.random()\n return results\n\ndef output_exception():\n try:\n type, value, tb = sys.exc_info()\n info = traceback.extract_tb(tb)\n #this is more verbose\n #traceback.print_exc()\n filename, lineno, function, text = info[-1] # last line only\n print \"%s:%d: %s: %s (in %s)\" %\\\n (filename, lineno, type.__name__, str(value), function)\n finally:\n type = value = tb = None # clean up\n\nfrom scipy.base import alltrue, equal, shape, ravel, around, zeros,\\\n Float64, asarray, less_equal, array2string, less, ArrayType\n\ntry:\n from scipy.base import math\nexcept ImportError,msg:\n print msg\n import math\n", "methods": [ { "name": "set_package_path", "long_name": "set_package_path( level = 1 )", "filename": "testing.py", "nloc": 15, "complexity": 4, "token_count": 148, "parameters": [ "level" ], "start_line": 44, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "set_local_path", "long_name": "set_local_path( reldir = '' , level = 1 )", "filename": "testing.py", "nloc": 11, "complexity": 3, "token_count": 99, "parameters": [ "reldir", "level" ], "start_line": 78, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "testing.py", "nloc": 4, "complexity": 2, "token_count": 25, "parameters": [], "start_line": 97, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "jiffies", "long_name": "jiffies( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "_proc_pid_stat" ], "start_line": 104, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "_proc_pid_stat" ], "start_line": 116, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "jiffies", "long_name": "jiffies( _load_time = time . time ( )", "filename": "testing.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "_load_time" ], "start_line": 130, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [], "start_line": 135, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "measure", "long_name": "measure( self , code_str , times = 1 )", "filename": "testing.py", "nloc": 13, "complexity": 2, "token_count": 82, "parameters": [ "self", "code_str", "times" ], "start_line": 142, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , result = None )", "filename": "testing.py", "nloc": 24, "complexity": 6, "token_count": 224, "parameters": [ "self", "result" ], "start_line": 159, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , stream )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "self", "stream" ], "start_line": 186, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "write", "long_name": "write( self , message )", "filename": "testing.py", "nloc": 6, "complexity": 3, "token_count": 47, "parameters": [ "self", "message" ], "start_line": 189, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "writeln", "long_name": "writeln( self , message )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "message" ], "start_line": 195, "end_line": 196, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_get_all_method_names", "long_name": "_get_all_method_names( cls )", "filename": "testing.py", "nloc": 8, "complexity": 5, "token_count": 56, "parameters": [ "cls" ], "start_line": 204, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package = '__main__' )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "package" ], "start_line": 235, "end_line": 236, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_module_str", "long_name": "_module_str( self , module )", "filename": "testing.py", "nloc": 5, "complexity": 2, "token_count": 43, "parameters": [ "self", "module" ], "start_line": 238, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "_get_method_names", "long_name": "_get_method_names( self , clsobj , level )", "filename": "testing.py", "nloc": 22, "complexity": 11, "token_count": 142, "parameters": [ "self", "clsobj", "level" ], "start_line": 244, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level )", "filename": "testing.py", "nloc": 47, "complexity": 14, "token_count": 430, "parameters": [ "self", "module", "level" ], "start_line": 267, "end_line": 319, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "_get_suite_list", "long_name": "_get_suite_list( self , test_module , level , module_name = '__main__' )", "filename": "testing.py", "nloc": 24, "complexity": 9, "token_count": 168, "parameters": [ "self", "test_module", "level", "module_name" ], "start_line": 321, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "test", "long_name": "test( self , level = 1 , verbosity = 1 )", "filename": "testing.py", "nloc": 18, "complexity": 6, "token_count": 160, "parameters": [ "self", "level", "verbosity" ], "start_line": 347, "end_line": 370, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "testing.py", "nloc": 20, "complexity": 2, "token_count": 104, "parameters": [ "self" ], "start_line": 372, "end_line": 394, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "remove_ignored_patterns", "long_name": "remove_ignored_patterns( files , pattern )", "filename": "testing.py", "nloc": 7, "complexity": 3, "token_count": 37, "parameters": [ "files", "pattern" ], "start_line": 398, "end_line": 404, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "remove_ignored_files", "long_name": "remove_ignored_files( original , ignored_files , cur_dir )", "filename": "testing.py", "nloc": 12, "complexity": 3, "token_count": 93, "parameters": [ "original", "ignored_files", "cur_dir" ], "start_line": 406, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "harvest_modules", "long_name": "harvest_modules( package , ignore = None )", "filename": "testing.py", "nloc": 21, "complexity": 4, "token_count": 134, "parameters": [ "package", "ignore" ], "start_line": 428, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "harvest_packages", "long_name": "harvest_packages( package , ignore = None )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 148, "parameters": [ "package", "ignore" ], "start_line": 467, "end_line": 501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "harvest_modules_and_packages", "long_name": "harvest_modules_and_packages( package , ignore = None )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "package", "ignore" ], "start_line": 504, "end_line": 510, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "harvest_test_suites", "long_name": "harvest_test_suites( package , ignore = None , level = 10 )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 113, "parameters": [ "package", "ignore", "level" ], "start_line": 513, "end_line": 548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "module_test", "long_name": "module_test( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 10, "complexity": 1, "token_count": 98, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 551, "end_line": 578, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "module_test_suite", "long_name": "module_test_suite( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 12, "complexity": 1, "token_count": 103, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 581, "end_line": 603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "assert_equal", "long_name": "assert_equal( actual , desired , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 116, "parameters": [ "actual", "desired", "err_msg", "verbose" ], "start_line": 613, "end_line": 629, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_almost_equal", "long_name": "assert_almost_equal( actual , desired , decimal = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 132, "parameters": [ "actual", "desired", "decimal", "err_msg", "verbose" ], "start_line": 632, "end_line": 648, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_approx_equal", "long_name": "assert_approx_equal( actual , desired , significant = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 23, "complexity": 7, "token_count": 191, "parameters": [ "actual", "desired", "significant", "err_msg", "verbose" ], "start_line": 651, "end_line": 679, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "assert_array_equal", "long_name": "assert_array_equal( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 22, "complexity": 7, "token_count": 232, "parameters": [ "x", "y", "err_msg" ], "start_line": 683, "end_line": 704, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "assert_array_almost_equal", "long_name": "assert_array_almost_equal( x , y , decimal = 6 , err_msg = '' )", "filename": "testing.py", "nloc": 26, "complexity": 6, "token_count": 251, "parameters": [ "x", "y", "decimal", "err_msg" ], "start_line": 707, "end_line": 732, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "assert_array_less", "long_name": "assert_array_less( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 20, "complexity": 5, "token_count": 189, "parameters": [ "x", "y", "err_msg" ], "start_line": 735, "end_line": 754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "rand", "long_name": "rand( * args )", "filename": "testing.py", "nloc": 7, "complexity": 2, "token_count": 45, "parameters": [ "args" ], "start_line": 757, "end_line": 767, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "output_exception", "long_name": "output_exception( )", "filename": "testing.py", "nloc": 9, "complexity": 2, "token_count": 67, "parameters": [], "start_line": 769, "end_line": 779, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "methods_before": [ { "name": "set_package_path", "long_name": "set_package_path( level = 1 )", "filename": "testing.py", "nloc": 15, "complexity": 4, "token_count": 148, "parameters": [ "level" ], "start_line": 44, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "set_local_path", "long_name": "set_local_path( reldir = '' , level = 1 )", "filename": "testing.py", "nloc": 11, "complexity": 3, "token_count": 99, "parameters": [ "reldir", "level" ], "start_line": 78, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "testing.py", "nloc": 4, "complexity": 2, "token_count": 25, "parameters": [], "start_line": 97, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "jiffies", "long_name": "jiffies( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "_proc_pid_stat" ], "start_line": 104, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "_proc_pid_stat" ], "start_line": 116, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "jiffies", "long_name": "jiffies( _load_time = time . time ( )", "filename": "testing.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "_load_time" ], "start_line": 130, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [], "start_line": 135, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "measure", "long_name": "measure( self , code_str , times = 1 )", "filename": "testing.py", "nloc": 13, "complexity": 2, "token_count": 82, "parameters": [ "self", "code_str", "times" ], "start_line": 142, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , result = None )", "filename": "testing.py", "nloc": 24, "complexity": 6, "token_count": 224, "parameters": [ "self", "result" ], "start_line": 159, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , stream )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "self", "stream" ], "start_line": 186, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "write", "long_name": "write( self , message )", "filename": "testing.py", "nloc": 6, "complexity": 3, "token_count": 47, "parameters": [ "self", "message" ], "start_line": 189, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "writeln", "long_name": "writeln( self , message )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "message" ], "start_line": 195, "end_line": 196, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_get_all_method_names", "long_name": "_get_all_method_names( cls )", "filename": "testing.py", "nloc": 8, "complexity": 5, "token_count": 56, "parameters": [ "cls" ], "start_line": 204, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package = '__main__' )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "package" ], "start_line": 235, "end_line": 236, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_module_str", "long_name": "_module_str( self , module )", "filename": "testing.py", "nloc": 5, "complexity": 2, "token_count": 43, "parameters": [ "self", "module" ], "start_line": 238, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "_get_method_names", "long_name": "_get_method_names( self , clsobj , level )", "filename": "testing.py", "nloc": 22, "complexity": 11, "token_count": 142, "parameters": [ "self", "clsobj", "level" ], "start_line": 244, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level )", "filename": "testing.py", "nloc": 46, "complexity": 14, "token_count": 428, "parameters": [ "self", "module", "level" ], "start_line": 267, "end_line": 318, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 1 }, { "name": "_get_suite_list", "long_name": "_get_suite_list( self , test_module , level , module_name = '__main__' )", "filename": "testing.py", "nloc": 24, "complexity": 9, "token_count": 168, "parameters": [ "self", "test_module", "level", "module_name" ], "start_line": 320, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "test", "long_name": "test( self , level = 1 , verbosity = 1 )", "filename": "testing.py", "nloc": 18, "complexity": 6, "token_count": 160, "parameters": [ "self", "level", "verbosity" ], "start_line": 346, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "testing.py", "nloc": 20, "complexity": 2, "token_count": 104, "parameters": [ "self" ], "start_line": 371, "end_line": 393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "remove_ignored_patterns", "long_name": "remove_ignored_patterns( files , pattern )", "filename": "testing.py", "nloc": 7, "complexity": 3, "token_count": 37, "parameters": [ "files", "pattern" ], "start_line": 397, "end_line": 403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "remove_ignored_files", "long_name": "remove_ignored_files( original , ignored_files , cur_dir )", "filename": "testing.py", "nloc": 12, "complexity": 3, "token_count": 93, "parameters": [ "original", "ignored_files", "cur_dir" ], "start_line": 405, "end_line": 424, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "harvest_modules", "long_name": "harvest_modules( package , ignore = None )", "filename": "testing.py", "nloc": 21, "complexity": 4, "token_count": 134, "parameters": [ "package", "ignore" ], "start_line": 427, "end_line": 463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "harvest_packages", "long_name": "harvest_packages( package , ignore = None )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 148, "parameters": [ "package", "ignore" ], "start_line": 466, "end_line": 500, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "harvest_modules_and_packages", "long_name": "harvest_modules_and_packages( package , ignore = None )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "package", "ignore" ], "start_line": 503, "end_line": 509, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "harvest_test_suites", "long_name": "harvest_test_suites( package , ignore = None , level = 10 )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 113, "parameters": [ "package", "ignore", "level" ], "start_line": 512, "end_line": 547, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "module_test", "long_name": "module_test( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 10, "complexity": 1, "token_count": 98, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 550, "end_line": 577, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "module_test_suite", "long_name": "module_test_suite( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 12, "complexity": 1, "token_count": 103, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 580, "end_line": 602, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "assert_equal", "long_name": "assert_equal( actual , desired , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 116, "parameters": [ "actual", "desired", "err_msg", "verbose" ], "start_line": 612, "end_line": 628, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_almost_equal", "long_name": "assert_almost_equal( actual , desired , decimal = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 132, "parameters": [ "actual", "desired", "decimal", "err_msg", "verbose" ], "start_line": 631, "end_line": 647, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_approx_equal", "long_name": "assert_approx_equal( actual , desired , significant = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 23, "complexity": 7, "token_count": 191, "parameters": [ "actual", "desired", "significant", "err_msg", "verbose" ], "start_line": 650, "end_line": 678, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "assert_array_equal", "long_name": "assert_array_equal( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 22, "complexity": 7, "token_count": 232, "parameters": [ "x", "y", "err_msg" ], "start_line": 682, "end_line": 703, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "assert_array_almost_equal", "long_name": "assert_array_almost_equal( x , y , decimal = 6 , err_msg = '' )", "filename": "testing.py", "nloc": 26, "complexity": 6, "token_count": 251, "parameters": [ "x", "y", "decimal", "err_msg" ], "start_line": 706, "end_line": 731, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "assert_array_less", "long_name": "assert_array_less( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 20, "complexity": 5, "token_count": 189, "parameters": [ "x", "y", "err_msg" ], "start_line": 734, "end_line": 753, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "rand", "long_name": "rand( * args )", "filename": "testing.py", "nloc": 7, "complexity": 2, "token_count": 45, "parameters": [ "args" ], "start_line": 756, "end_line": 766, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "output_exception", "long_name": "output_exception( )", "filename": "testing.py", "nloc": 9, "complexity": 2, "token_count": 67, "parameters": [], "start_line": 768, "end_line": 778, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level )", "filename": "testing.py", "nloc": 47, "complexity": 14, "token_count": 430, "parameters": [ "self", "module", "level" ], "start_line": 267, "end_line": 319, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 } ], "nloc": 585, "complexity": 145, "token_count": 4181, "diff_parsed": { "added": [ " print test_file" ], "deleted": [] } } ] }, { "hash": "e3ba6c65315e036990a8c28fd8dd5a072c7dc635", "msg": "Fix buglet in set_numeric_ops", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T09:05:09+00:00", "author_timezone": 0, "committer_date": "2005-10-12T09:05:09+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "594ec3777ef54b23c89cc0b3d9c7563fbf88be62" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 11, "insertions": 12, "lines": 23, "files": 2, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/src/arrayobject.c", "new_path": "scipy/base/src/arrayobject.c", "filename": "arrayobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -1940,7 +1940,7 @@ typedef struct {\n *greater,\n *greater_equal,\n *floor_divide,\n- *TRUE_divide,\n+ *true_divide,\n \t\t*logical_or,\n \t\t*logical_and,\n \t\t*floor,\n@@ -1993,7 +1993,7 @@ PyArray_SetNumericOps(PyObject *dict)\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n- SET(TRUE_divide);\t\n+ SET(true_divide);\t\n \tSET(logical_or);\n \tSET(logical_and);\n \tSET(floor);\n@@ -2003,7 +2003,8 @@ PyArray_SetNumericOps(PyObject *dict)\n return 0;\n }\n \n-#define GET(op) if (PyDict_SetItemString(dict, #op, n_ops.op)==-1) \\\n+#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n+\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n \t\tgoto fail;\n \n static PyObject *\n@@ -2034,7 +2035,7 @@ PyArray_GetNumericOps(void)\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n- GET(TRUE_divide); \n+ GET(true_divide); \n \tGET(logical_or);\n \tGET(logical_and);\n \tGET(floor);\n@@ -2294,9 +2295,9 @@ array_floor_divide(PyArrayObject *m1, PyObject *m2)\n }\n \n static PyObject *\n-array_TRUE_divide(PyArrayObject *m1, PyObject *m2) \n+array_true_divide(PyArrayObject *m1, PyObject *m2) \n {\n- return PyArray_GenericBinaryFunction(m1, m2, n_ops.TRUE_divide);\n+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n }\n \n static PyObject *\n@@ -2307,10 +2308,10 @@ array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2)\n }\n \n static PyObject *\n-array_inplace_TRUE_divide(PyArrayObject *m1, PyObject *m2) \n+array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n {\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n-\t\t\t\t\t\t n_ops.TRUE_divide);\n+\t\t\t\t\t\t n_ops.true_divide);\n }\n \n /* Array evaluates as \"TRUE\" if any of the elements are non-zero */\n@@ -2533,9 +2534,9 @@ static PyNumberMethods array_as_number = {\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n \n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n- (binaryfunc)array_TRUE_divide,\t /*nb_TRUE_divide*/\n+ (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n- (binaryfunc)array_inplace_TRUE_divide, /*nb_inplace_TRUE_divide*/\n+ (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n \n };\n \n", "added_lines": 11, "deleted_lines": 10, "source_code": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tPyObject_Del(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyObject_Del(self);\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\tif (self->dimensions != NULL) \n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) PyErr_Clear();\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) free(dims.ptr);\n if (strides.ptr) free(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oi\", \n self, self->flags);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_data_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_New(arr->ob_type, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n\t\t\tPy_INCREF(arr);\n\t\t\tret = arr;\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_CastToType(arr, typecode);\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \"\\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr == NULL) {\n\t\tPy_INCREF(input);\n\t\tattr = input;\n\t}\n\t\n\tres = PyObject_AsWriteBuffer(attr, (void **)&data, &buffer_len);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_Check(op)) return op;\n\n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, 0);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY);\n}\n\n/* End of deprecated */\n\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, '\\0', sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyObject *r;\n intp size, strides;\n int nd;\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n\tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arraymapiter_next,\t/* tp_iternext */\n 0,\t \t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "source_code_before": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *TRUE_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(TRUE_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (PyDict_SetItemString(dict, #op, n_ops.op)==-1) \\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(TRUE_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_TRUE_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.TRUE_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_TRUE_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.TRUE_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_TRUE_divide,\t /*nb_TRUE_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_TRUE_divide, /*nb_inplace_TRUE_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tPyObject_Del(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyObject_Del(self);\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\tif (self->dimensions != NULL) \n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) PyErr_Clear();\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) free(dims.ptr);\n if (strides.ptr) free(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oi\", \n self, self->flags);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_data_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_New(arr->ob_type, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n\t\t\tPy_INCREF(arr);\n\t\t\tret = arr;\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_CastToType(arr, typecode);\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \"\\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr == NULL) {\n\t\tPy_INCREF(input);\n\t\tattr = input;\n\t}\n\t\n\tres = PyObject_AsWriteBuffer(attr, (void **)&data, &buffer_len);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_Check(op)) return op;\n\n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, 0);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY);\n}\n\n/* End of deprecated */\n\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, '\\0', sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyObject *r;\n intp size, strides;\n int nd;\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n\tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arraymapiter_next,\t/* tp_iternext */\n 0,\t \t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "methods": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1596, "end_line": 1655, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1676, "end_line": 1751, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1764, "end_line": 1816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1824, "end_line": 1827, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1846, "end_line": 1858, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1861, "end_line": 1876, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1880, "end_line": 1889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1892, "end_line": 1903, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1971, "end_line": 2004, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2011, "end_line": 2050, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2053, "end_line": 2072, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2076, "end_line": 2095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2099, "end_line": 2110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2113, "end_line": 2124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2127, "end_line": 2139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2142, "end_line": 2145, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2148, "end_line": 2151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2154, "end_line": 2157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2160, "end_line": 2163, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2166, "end_line": 2169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2172, "end_line": 2175, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2178, "end_line": 2181, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2184, "end_line": 2187, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2190, "end_line": 2193, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2196, "end_line": 2199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2202, "end_line": 2205, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2208, "end_line": 2211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2214, "end_line": 2217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2220, "end_line": 2223, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2226, "end_line": 2229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2232, "end_line": 2235, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2238, "end_line": 2241, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2244, "end_line": 2247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2250, "end_line": 2253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2256, "end_line": 2259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2262, "end_line": 2265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2268, "end_line": 2271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2274, "end_line": 2277, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2280, "end_line": 2283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2286, "end_line": 2289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2292, "end_line": 2295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2298, "end_line": 2301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2304, "end_line": 2308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2311, "end_line": 2315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2319, "end_line": 2337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2340, "end_line": 2355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2359, "end_line": 2385, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2388, "end_line": 2413, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2416, "end_line": 2438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2441, "end_line": 2463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2466, "end_line": 2488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2491, "end_line": 2495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2556, "end_line": 2594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2598, "end_line": 2619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2622, "end_line": 2627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2648, "end_line": 2695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2698, "end_line": 2734, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2740, "end_line": 2757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2760, "end_line": 2772, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2775, "end_line": 2787, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2791, "end_line": 2868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2871, "end_line": 2900, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2906, "end_line": 2922, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2927, "end_line": 2950, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2956, "end_line": 2972, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2976, "end_line": 2992, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2996, "end_line": 3012, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3015, "end_line": 3048, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3052, "end_line": 3074, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3081, "end_line": 3096, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3116, "end_line": 3140, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 112, "complexity": 28, "token_count": 672, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3144, "end_line": 3288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 145, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3293, "end_line": 3398, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3402, "end_line": 3419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3423, "end_line": 3538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3545, "end_line": 3548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 55, "parameters": [ "self" ], "start_line": 3551, "end_line": 3561, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3634, "end_line": 3637, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3641, "end_line": 3675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3679, "end_line": 3682, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3685, "end_line": 3718, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3722, "end_line": 3729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3732, "end_line": 3740, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3744, "end_line": 3758, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3761, "end_line": 3805, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3809, "end_line": 3812, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3815, "end_line": 3822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3826, "end_line": 3833, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3836, "end_line": 3856, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3859, "end_line": 3881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3884, "end_line": 3887, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3891, "end_line": 3894, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3906, "end_line": 3964, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3969, "end_line": 3979, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3983, "end_line": 4008, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4012, "end_line": 4044, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4047, "end_line": 4082, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4085, "end_line": 4122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4125, "end_line": 4128, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4131, "end_line": 4185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4364, "end_line": 4389, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4392, "end_line": 4414, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4421, "end_line": 4447, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4450, "end_line": 4470, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4473, "end_line": 4614, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4617, "end_line": 4640, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4644, "end_line": 4667, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4671, "end_line": 4728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4732, "end_line": 4739, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4745, "end_line": 4835, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4841, "end_line": 4852, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4855, "end_line": 4890, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4897, "end_line": 4943, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 80, "complexity": 26, "token_count": 522, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4946, "end_line": 5040, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5044, "end_line": 5149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 83, "complexity": 18, "token_count": 543, "parameters": [ "input", "intype", "flags" ], "start_line": 5152, "end_line": 5247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5250, "end_line": 5271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5275, "end_line": 5337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5340, "end_line": 5345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5348, "end_line": 5354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5408, "end_line": 5438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 82, "parameters": [ "op" ], "start_line": 5448, "end_line": 5464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5470, "end_line": 5476, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5479, "end_line": 5486, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5489, "end_line": 5496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 99, "complexity": 43, "token_count": 578, "parameters": [ "fromtype", "totype" ], "start_line": 5502, "end_line": 5603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 102, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5606, "end_line": 5630, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5640, "end_line": 5677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5682, "end_line": 5692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5695, "end_line": 5700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5703, "end_line": 5708, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5712, "end_line": 5715, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5719, "end_line": 5767, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5770, "end_line": 5823, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5827, "end_line": 5946, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5950, "end_line": 5982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5985, "end_line": 6027, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6031, "end_line": 6153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6166, "end_line": 6208, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6213, "end_line": 6217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6282, "end_line": 6343, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6351, "end_line": 6366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6372, "end_line": 6441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6445, "end_line": 6481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6487, "end_line": 6531, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6549, "end_line": 6685, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6691, "end_line": 6760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6763, "end_line": 6896, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6902, "end_line": 6932, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_next", "long_name": "arraymapiter_next( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 12, "complexity": 4, "token_count": 70, "parameters": [ "mit" ], "start_line": 6938, "end_line": 6949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 6952, "end_line": 6961, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 6964, "end_line": 6982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1596, "end_line": 1655, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1676, "end_line": 1751, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1764, "end_line": 1816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1824, "end_line": 1827, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1846, "end_line": 1858, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1861, "end_line": 1876, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1880, "end_line": 1889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1892, "end_line": 1903, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1971, "end_line": 2004, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2010, "end_line": 2049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2052, "end_line": 2071, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2075, "end_line": 2094, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2098, "end_line": 2109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2112, "end_line": 2123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2126, "end_line": 2138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2141, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2147, "end_line": 2150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2153, "end_line": 2156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2159, "end_line": 2162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2165, "end_line": 2168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2171, "end_line": 2174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2177, "end_line": 2180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2183, "end_line": 2186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2189, "end_line": 2192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2195, "end_line": 2198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2201, "end_line": 2204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2207, "end_line": 2210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2213, "end_line": 2216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2219, "end_line": 2222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2225, "end_line": 2228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2231, "end_line": 2234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2237, "end_line": 2240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2243, "end_line": 2246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2249, "end_line": 2252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2255, "end_line": 2258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2261, "end_line": 2264, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2267, "end_line": 2270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2273, "end_line": 2276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2279, "end_line": 2282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2285, "end_line": 2288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2291, "end_line": 2294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_TRUE_divide", "long_name": "array_TRUE_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2297, "end_line": 2300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2303, "end_line": 2307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_TRUE_divide", "long_name": "array_inplace_TRUE_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2310, "end_line": 2314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2318, "end_line": 2336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2339, "end_line": 2354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2358, "end_line": 2384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2387, "end_line": 2412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2415, "end_line": 2437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2440, "end_line": 2462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2465, "end_line": 2487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2490, "end_line": 2494, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2555, "end_line": 2593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2597, "end_line": 2618, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2621, "end_line": 2626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2647, "end_line": 2694, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2697, "end_line": 2733, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2739, "end_line": 2756, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2759, "end_line": 2771, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2774, "end_line": 2786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2790, "end_line": 2867, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2870, "end_line": 2899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2905, "end_line": 2921, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2926, "end_line": 2949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2955, "end_line": 2971, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2975, "end_line": 2991, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2995, "end_line": 3011, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3014, "end_line": 3047, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3051, "end_line": 3073, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3080, "end_line": 3095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3115, "end_line": 3139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 112, "complexity": 28, "token_count": 672, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3287, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 145, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3292, "end_line": 3397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3401, "end_line": 3418, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3422, "end_line": 3537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3544, "end_line": 3547, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 55, "parameters": [ "self" ], "start_line": 3550, "end_line": 3560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3633, "end_line": 3636, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3640, "end_line": 3674, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3678, "end_line": 3681, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3684, "end_line": 3717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3721, "end_line": 3728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3731, "end_line": 3739, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3743, "end_line": 3757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3760, "end_line": 3804, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3808, "end_line": 3811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3814, "end_line": 3821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3825, "end_line": 3832, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3835, "end_line": 3855, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3858, "end_line": 3880, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3883, "end_line": 3886, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3890, "end_line": 3893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3905, "end_line": 3963, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3968, "end_line": 3978, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3982, "end_line": 4007, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4011, "end_line": 4043, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4046, "end_line": 4081, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4084, "end_line": 4121, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4124, "end_line": 4127, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4130, "end_line": 4184, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4363, "end_line": 4388, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4391, "end_line": 4413, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4420, "end_line": 4446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4449, "end_line": 4469, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4472, "end_line": 4613, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4616, "end_line": 4639, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4643, "end_line": 4666, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4670, "end_line": 4727, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4731, "end_line": 4738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4744, "end_line": 4834, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4840, "end_line": 4851, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4854, "end_line": 4889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4896, "end_line": 4942, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 80, "complexity": 26, "token_count": 522, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4945, "end_line": 5039, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5043, "end_line": 5148, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 83, "complexity": 18, "token_count": 543, "parameters": [ "input", "intype", "flags" ], "start_line": 5151, "end_line": 5246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5249, "end_line": 5270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5274, "end_line": 5336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5339, "end_line": 5344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5347, "end_line": 5353, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5407, "end_line": 5437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 82, "parameters": [ "op" ], "start_line": 5447, "end_line": 5463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5469, "end_line": 5475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5478, "end_line": 5485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5488, "end_line": 5495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 99, "complexity": 43, "token_count": 578, "parameters": [ "fromtype", "totype" ], "start_line": 5501, "end_line": 5602, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 102, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5605, "end_line": 5629, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5639, "end_line": 5676, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5681, "end_line": 5691, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5694, "end_line": 5699, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5702, "end_line": 5707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5711, "end_line": 5714, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5718, "end_line": 5766, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5769, "end_line": 5822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5826, "end_line": 5945, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5949, "end_line": 5981, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5984, "end_line": 6026, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6030, "end_line": 6152, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6165, "end_line": 6207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6212, "end_line": 6216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6281, "end_line": 6342, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6350, "end_line": 6365, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6371, "end_line": 6440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6444, "end_line": 6480, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6486, "end_line": 6530, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6548, "end_line": 6684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6690, "end_line": 6759, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6762, "end_line": 6895, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6901, "end_line": 6931, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_next", "long_name": "arraymapiter_next( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 12, "complexity": 4, "token_count": 70, "parameters": [ "mit" ], "start_line": 6937, "end_line": 6948, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 6951, "end_line": 6960, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 6963, "end_line": 6981, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "array_inplace_TRUE_divide", "long_name": "array_inplace_TRUE_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2310, "end_line": 2314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2011, "end_line": 2050, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2298, "end_line": 2301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2311, "end_line": 2315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1971, "end_line": 2004, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_TRUE_divide", "long_name": "array_TRUE_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2297, "end_line": 2300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 } ], "nloc": 5531, "complexity": 1215, "token_count": 33083, "diff_parsed": { "added": [ " *true_divide,", " SET(true_divide);", "#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\", "\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\", " GET(true_divide);", "array_true_divide(PyArrayObject *m1, PyObject *m2)", " return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);", "array_inplace_true_divide(PyArrayObject *m1, PyObject *m2)", "\t\t\t\t\t\t n_ops.true_divide);", " (binaryfunc)array_true_divide,\t /*nb_true_divide*/", " (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/" ], "deleted": [ " *TRUE_divide,", " SET(TRUE_divide);", "#define GET(op) if (PyDict_SetItemString(dict, #op, n_ops.op)==-1) \\", " GET(TRUE_divide);", "array_TRUE_divide(PyArrayObject *m1, PyObject *m2)", " return PyArray_GenericBinaryFunction(m1, m2, n_ops.TRUE_divide);", "array_inplace_TRUE_divide(PyArrayObject *m1, PyObject *m2)", "\t\t\t\t\t\t n_ops.TRUE_divide);", " (binaryfunc)array_TRUE_divide,\t /*nb_TRUE_divide*/", " (binaryfunc)array_inplace_TRUE_divide, /*nb_inplace_TRUE_divide*/" ] } }, { "old_path": "scipy/core_version.py", "new_path": "scipy/core_version.py", "filename": "core_version.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -1,4 +1,4 @@\n-version='0.4.2'\n+version='0.4.3'\n \n try:\n import base.__svn_version__ as svn\n", "added_lines": 1, "deleted_lines": 1, "source_code": "version='0.4.3'\n\ntry:\n import base.__svn_version__ as svn\n version += '.'+svn.version\nexcept ImportError:\n pass\n\n", "source_code_before": "version='0.4.2'\n\ntry:\n import base.__svn_version__ as svn\n version += '.'+svn.version\nexcept ImportError:\n pass\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 6, "complexity": 0, "token_count": 22, "diff_parsed": { "added": [ "version='0.4.3'" ], "deleted": [ "version='0.4.2'" ] } } ] }, { "hash": "33e2d21b6e75d11572dbadb7a8a0038cd02206eb", "msg": "Fixed remainder to behaved like Python.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T09:50:38+00:00", "author_timezone": 0, "committer_date": "2005-10-12T09:50:38+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e3ba6c65315e036990a8c28fd8dd5a072c7dc635" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 49, "insertions": 80, "lines": 129, "files": 8, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.6666666666666666, "modified_files": [ { "old_path": "scipy/base/_internal.py", "new_path": "scipy/base/_internal.py", "filename": "_internal.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -21,12 +21,13 @@\n _fnum = _flagdict['FORTRAN']\n \n class flagsobj(dict):\n- def __init__(self, arr, flags):\n+ def __init__(self, arr, flags, scalar):\n self._arr = arr\n self._flagnum = flags\n for k in _defflags:\n num = _flagdict[k]\n dict.__setitem__(self, k, flags & num == num)\n+ self.scalar = scalar\n \n def __getitem__(self, key):\n if not isinstance(key, str):\n@@ -68,6 +69,8 @@ def __getitem__(self, key):\n raise KeyError, \"Unknown flag: %s\" % key\n \n def __setitem__(self, item, val):\n+ if self.scalar:\n+ raise ValueError, \"Cannot set flags on array scalars.\"\n val = not not val # convert to boolean\n if item not in _setable:\n raise KeyError, \"Cannot set flag\", item\n", "added_lines": 4, "deleted_lines": 1, "source_code": "\nfrom multiarray import _flagdict\n\n_defflags = _flagdict.keys()\n\n_setable = ['WRITEABLE', 'NOTSWAPPED', 'SWAPPED', 'UPDATEIFCOPY', 'ALIGNED',\n 'W','N','S','U','A']\n_setable2 = ['write','swap','swap','uic','align']*2\n_firstltr = {'W':'WRITEABLE',\n 'N':'NOTSWAPPED',\n 'A':'ALIGNED',\n 'C':'CONTIGUOUS',\n 'F':'FORTRAN',\n 'O':'OWNDATA',\n 'U':'UPDATEIFCOPY'}\n\n_anum = _flagdict['ALIGNED']\n_nnum = _flagdict['NOTSWAPPED']\n_wnum = _flagdict['WRITEABLE']\n_cnum = _flagdict['CONTIGUOUS']\n_fnum = _flagdict['FORTRAN']\n\nclass flagsobj(dict):\n def __init__(self, arr, flags, scalar):\n self._arr = arr\n self._flagnum = flags\n for k in _defflags:\n num = _flagdict[k]\n dict.__setitem__(self, k, flags & num == num)\n self.scalar = scalar\n\n def __getitem__(self, key):\n if not isinstance(key, str):\n raise KeyError, \"Unknown flag %s\" % key\n if len(key) == 1:\n try:\n return dict.__getitem__(self, _firstltr[key])\n except:\n if (key == 'B'):\n num = _anum + _nnum + _wnum\n return self._flagnum & num == num\n elif (key == 'S'):\n return not (self._flagnum & _nnum == _nnum)\n else:\n try:\n return dict.__getitem__(self, key)\n except: # special cases\n if (key == 'FNC'):\n return (self._flagnum & _fnum == _fnum) and not \\\n (self._flagnum & _cnum == _cnum)\n\t if (key == 'FORC'):\n\t\t return (self._flagnum & _fnum == _fnum) or \\\n (self._flagnum & _cnum == _cnum)\n if (key == 'SWAPPED'):\n return not (self._flagnum & _nnum == _nnum)\n if (key == 'BEHAVED'):\n num = _anum + _nnum + _wnum\n return self._flagnum & num == num\n if (key in ['BEHAVED_RO', 'BRO']):\n num = _anum + _nnum\n return self._flagnum & num == num\n if (key in ['CARRAY','CA']):\n num = _anum + _nnum + _wnum + _cnum\n return self._flagnum & num == num\n if (key in ['FARRAY','FA']):\n num = _anum + _nnum + _wnum + _fnum\n return (self._flagnum & num == num) and not \\\n (self._flagnum & _cnum == _cnum)\n raise KeyError, \"Unknown flag: %s\" % key\n \n def __setitem__(self, item, val):\n if self.scalar:\n raise ValueError, \"Cannot set flags on array scalars.\"\n val = not not val # convert to boolean\n if item not in _setable:\n raise KeyError, \"Cannot set flag\", item\n dict.__setitem__(self, item, val) # Does this matter?\n\n kwds = {}\n for k, name in enumerate(_setable):\n if item == name:\n kwds[_setable2[k]] = val\n if (item == 'NOTSWAPPED' or item == 'N'):\n kwds['swap'] = not val\n\n # now actually update array flags\n self._arr.setflags(**kwds)\n \n", "source_code_before": "\nfrom multiarray import _flagdict\n\n_defflags = _flagdict.keys()\n\n_setable = ['WRITEABLE', 'NOTSWAPPED', 'SWAPPED', 'UPDATEIFCOPY', 'ALIGNED',\n 'W','N','S','U','A']\n_setable2 = ['write','swap','swap','uic','align']*2\n_firstltr = {'W':'WRITEABLE',\n 'N':'NOTSWAPPED',\n 'A':'ALIGNED',\n 'C':'CONTIGUOUS',\n 'F':'FORTRAN',\n 'O':'OWNDATA',\n 'U':'UPDATEIFCOPY'}\n\n_anum = _flagdict['ALIGNED']\n_nnum = _flagdict['NOTSWAPPED']\n_wnum = _flagdict['WRITEABLE']\n_cnum = _flagdict['CONTIGUOUS']\n_fnum = _flagdict['FORTRAN']\n\nclass flagsobj(dict):\n def __init__(self, arr, flags):\n self._arr = arr\n self._flagnum = flags\n for k in _defflags:\n num = _flagdict[k]\n dict.__setitem__(self, k, flags & num == num)\n\n def __getitem__(self, key):\n if not isinstance(key, str):\n raise KeyError, \"Unknown flag %s\" % key\n if len(key) == 1:\n try:\n return dict.__getitem__(self, _firstltr[key])\n except:\n if (key == 'B'):\n num = _anum + _nnum + _wnum\n return self._flagnum & num == num\n elif (key == 'S'):\n return not (self._flagnum & _nnum == _nnum)\n else:\n try:\n return dict.__getitem__(self, key)\n except: # special cases\n if (key == 'FNC'):\n return (self._flagnum & _fnum == _fnum) and not \\\n (self._flagnum & _cnum == _cnum)\n\t if (key == 'FORC'):\n\t\t return (self._flagnum & _fnum == _fnum) or \\\n (self._flagnum & _cnum == _cnum)\n if (key == 'SWAPPED'):\n return not (self._flagnum & _nnum == _nnum)\n if (key == 'BEHAVED'):\n num = _anum + _nnum + _wnum\n return self._flagnum & num == num\n if (key in ['BEHAVED_RO', 'BRO']):\n num = _anum + _nnum\n return self._flagnum & num == num\n if (key in ['CARRAY','CA']):\n num = _anum + _nnum + _wnum + _cnum\n return self._flagnum & num == num\n if (key in ['FARRAY','FA']):\n num = _anum + _nnum + _wnum + _fnum\n return (self._flagnum & num == num) and not \\\n (self._flagnum & _cnum == _cnum)\n raise KeyError, \"Unknown flag: %s\" % key\n \n def __setitem__(self, item, val):\n val = not not val # convert to boolean\n if item not in _setable:\n raise KeyError, \"Cannot set flag\", item\n dict.__setitem__(self, item, val) # Does this matter?\n\n kwds = {}\n for k, name in enumerate(_setable):\n if item == name:\n kwds[_setable2[k]] = val\n if (item == 'NOTSWAPPED' or item == 'N'):\n kwds['swap'] = not val\n\n # now actually update array flags\n self._arr.setflags(**kwds)\n \n", "methods": [ { "name": "__init__", "long_name": "__init__( self , arr , flags , scalar )", "filename": "_internal.py", "nloc": 7, "complexity": 2, "token_count": 51, "parameters": [ "self", "arr", "flags", "scalar" ], "start_line": 24, "end_line": 30, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "_internal.py", "nloc": 38, "complexity": 17, "token_count": 298, "parameters": [ "self", "key" ], "start_line": 32, "end_line": 69, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "__setitem__", "long_name": "__setitem__( self , item , val )", "filename": "_internal.py", "nloc": 14, "complexity": 7, "token_count": 100, "parameters": [ "self", "item", "val" ], "start_line": 71, "end_line": 87, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 } ], "methods_before": [ { "name": "__init__", "long_name": "__init__( self , arr , flags )", "filename": "_internal.py", "nloc": 6, "complexity": 2, "token_count": 44, "parameters": [ "self", "arr", "flags" ], "start_line": 24, "end_line": 29, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "_internal.py", "nloc": 38, "complexity": 17, "token_count": 298, "parameters": [ "self", "key" ], "start_line": 31, "end_line": 68, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "__setitem__", "long_name": "__setitem__( self , item , val )", "filename": "_internal.py", "nloc": 12, "complexity": 6, "token_count": 91, "parameters": [ "self", "item", "val" ], "start_line": 70, "end_line": 84, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "__setitem__", "long_name": "__setitem__( self , item , val )", "filename": "_internal.py", "nloc": 14, "complexity": 7, "token_count": 100, "parameters": [ "self", "item", "val" ], "start_line": 71, "end_line": 87, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , arr , flags , scalar )", "filename": "_internal.py", "nloc": 7, "complexity": 2, "token_count": 51, "parameters": [ "self", "arr", "flags", "scalar" ], "start_line": 24, "end_line": 30, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , arr , flags )", "filename": "_internal.py", "nloc": 6, "complexity": 2, "token_count": 44, "parameters": [ "self", "arr", "flags" ], "start_line": 24, "end_line": 29, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 } ], "nloc": 77, "complexity": 26, "token_count": 568, "diff_parsed": { "added": [ " def __init__(self, arr, flags, scalar):", " self.scalar = scalar", " if self.scalar:", " raise ValueError, \"Cannot set flags on array scalars.\"" ], "deleted": [ " def __init__(self, arr, flags):" ] } }, { "old_path": "scipy/base/code_generators/generate_umath.py", "new_path": "scipy/base/code_generators/generate_umath.py", "filename": "generate_umath.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -73,11 +73,12 @@\n (1,1), None,\n \"takes the conjugate of x elementwise.\"\n ],\n-'remainder' : [intflt,fltsO,\n- (\"fmod,\"*3, \"PyNumber_Remainder\"),\n- (2,1), Zero,\n- \"computes x1 % x2 elementwise.\"\n- ],\n+\n+'fmod' : [intflt,fltsM,\n+ (\"fmod,\"*3, \"fmod\"),\n+ (2,1), Zero,\n+ \"computes (C-like) x1 % x2 elementwise.\"\n+ ],\n 'power' : [nobool,noint,\n (\"pow,\"*6,\n \"PyNumber_Power\"),\n@@ -266,10 +267,12 @@\n (2,1), None,\n \"a safe and correct arctan(x1/x2)\"\n ],\n-'fmod' : [fltsM, fltsM,\n- (\"fmod,\"*3,'\"fmod\"'),\n- (2,1), None,\n- \"computes x1-n*x2 where n is the quotient of x1 / x2\"],\n+\n+'remainder' : [intflt, 'O',\n+ (\"PyObject_Remainder\"),\n+ (2,1), None,\n+ \"computes x1-n*x2 where n is floor(x1 / x2)\"],\n+\n 'hypot' : [fltsM, fltsM,\n (\"hypot,\"*3, '\"hypot\"'),\n (2,1), None,\n", "added_lines": 12, "deleted_lines": 9, "source_code": "\nimport string\nimport re\n\nZero = \"PyUFunc_Zero\"\nOne = \"PyUFunc_One\"\nNone_ = \"PyUFunc_None\"\n#each entry in defdict is \n\n#name: [string of chars for which it is defined,\n#\tstring of characters using func interface,\n#\ttuple of strings giving funcs for data,\n# (in, out), or (instr, outstr) giving the signature as character codes,\n# identity,\n#\tdocstring,\n# output specification (optional)\n# ]\n\nall = '?bBhHiIlLqQfdgFDGO'\nints = 'bBhHiIlLqQ'\nintsO = ints + 'O'\nbintsO = '?'+ints+'O'\nflts = 'fdg'\nfltsO = flts+'O'\nfltsM = flts+'M'\ncmplx = 'FDG'\ncmplxO = cmplx+'O'\ncmplxM = cmplx+'M'\nnoint = flts+cmplx+'O'\nnointM = flts+cmplx+'M'\nall = '?'+ints+flts+cmplxO\nnobool = all[1:]\nnobool_or_obj = all[1:-1]\nintflt = ints+flts\nnocmplx = '?'+ints+flts\nnocmplxO = nocmplx+'O'\nnocmplxM = nocmplx+'M'\nnoobj = all[:-1]\n\ndefdict = {\n'add': [all,'O',(\"PyNumber_Add\",),\n (2,1), Zero,\n \"addd the arguments elementwise.\"\n ],\n'subtract' : [all,'O',(\"PyNumber_Subtract\",),\n (2,1), Zero,\n \"subtracts the arguments elementwise.\"\n ],\n'multiply' : [all,cmplxO,\n (\"prod,\"*3,\"PyNumber_Multiply\",),\n (2,1), One,\n \"multiplies the arguments elementwise.\"\n ],\n'divide' : [nobool,cmplxO,\n (\"quot,\"*3,\"PyNumber_Divide\",),\n (2,1), One,\n \"divides the arguments elementwise.\"\n ],\n'floor_divide' : [nobool, cmplxO,\n (\"floor_quot,\"*3,\n \"PyNumber_FloorDivide\"),\n (2,1), One,\n \"floor divides the arguments elementwise.\"\n ],\n'true_divide' : [nobool, cmplxO,\n (\"quot,\"*3,\"PyNumber_TrueDivide\"),\n (2,1), One,\n \"true divides the arguments elementwise.\",\n 'f'*4+'d'*6+flts+cmplxO\n ],\n'conjugate' : [nobool_or_obj, 'M',\n ('\"conjugate\"',),\n (1,1), None,\n \"takes the conjugate of x elementwise.\"\n ],\n\n'fmod' : [intflt,fltsM,\n (\"fmod,\"*3, \"fmod\"),\n (2,1), Zero,\n \"computes (C-like) x1 % x2 elementwise.\"\n ],\n'power' : [nobool,noint,\n (\"pow,\"*6,\n \"PyNumber_Power\"),\n (2,1), One,\n \"computes x1**x2 elementwise.\"\n ],\n'absolute' : [all,'O',\n (\"PyNumber_Absolute\",),\n (1,1), None,\n \"takes |x| elementwise.\",\n nocmplx+fltsO\n ],\n'negative' : [all,cmplxO,\n (\"neg,\"*3,\"PyNumber_Negative\"),\n (1,1), None,\n \"determines -x elementwise\",\n ],\n'greater' : [all,'',(),(2,1), None,\n \"returns elementwise x1 > x2 in a bool array.\",\n '?'*len(all)\n ],\n'greater_equal' : [all,'',(),(2,1), None,\n \"returns elementwise x1 >= x2 in a bool array.\",\n '?'*len(all)\n ],\n'less' : [all,'',(),(2,1), None,\n \"returns elementwise x1 < x2 in a bool array.\",\n '?'*len(all)\n ],\n'less_equal' : [all,'',(),(2,1), None,\n \"returns elementwise x1 <= x2 in a bool array\",\n '?'*len(all)\n ],\n'equal' : [all, '', (), (2,1), None,\n \"returns elementwise x1 == x2 in a bool array\",\n '?'*len(all)\n ],\n'not_equal' : [all, '', (), (2,1), None,\n \"returns elementwise x1 |= x2\",\n '?'*len(all)\n ],\n'logical_and': [nocmplxM,'M',('\"logical_and\"',),\n (2,1), One,\n \"returns x1 and x2 elementwise.\",\n '?'*len(nocmplxM)\n ],\n'logical_or': [nocmplxM,'M',('\"logical_or\"',),\n (2,1), Zero, \n \"returns x1 or x2 elementwise.\",\n '?'*len(nocmplxM)\n ],\n'logical_xor': [nocmplxM, 'M', ('\"logical_xor\"',),\n (2,1), None,\n \"returns x1 xor x2 elementwise.\",\n '?'*len(nocmplxM)\n ],\n'logical_not' : [nocmplxM, 'M', ('\"logical_not\"',),\n (1,1), None,\n \"returns not x elementwise.\",\n '?'*len(nocmplxM)\n ],\n'maximum' : [noobj,'',(),\n (2,1), None,\n \"returns maximum (if x1 > x2: x1; else: x2) elementwise.\"],\n'minimum' : [noobj,'',(),\n (2,1), None,\n \"returns minimum (if x1 < x2: x1; else: x2) elementwise\"],\n'bitwise_and' : [bintsO,'O',(\"PyNumber_And\",),\n (2,1), One,\n \"computes x1 & x2 elementwise.\"],\n'bitwise_or' : [bintsO, 'O', (\"PyNumber_Or\",),\n (2,1), Zero,\n \"computes x1 | x2 elementwise.\"],\n'bitwise_xor' : [bintsO, 'O', (\"PyNumber_Xor\",),\n (2,1), None,\n \"computes x1 ^ x2 elementwise.\"],\n'invert' : [bintsO,'O', (\"PyNumber_Invert\",),\n (1,1), None,\n \"computes ~x (bit inversion) elementwise.\"\n ],\n'left_shift' : [intsO, 'O', (\"PyNumber_Lshift\",),\n (2,1), None,\n \"computes x1 << x2 (x1 shifted to left by x2 bits) elementwise.\"\n ],\n'right_shift' : [intsO, 'O', (\"PyNumber_Rshift\",),\n (2,1), None,\n \"computes x1 >> x2 (x1 shifted to right by x2 bits) elementwise.\"\n ],\n'arccos' : [nointM, nointM,\n (\"acos,\"*6, '\"arccos\"'),\n (1, 1), None,\n \"inverse cosine elementwise.\"\n ],\n'arcsin': [nointM, nointM,\n (\"asin,\"*6, '\"arcsin\"'),\n (1, 1), None,\n \"inverse sine elementwise.\"\n ],\n'arctan': [nointM, nointM,\n (\"atan,\"*6, '\"arctan\"'),\n (1, 1), None,\n \"inverse tangent elementwise.\"\n ],\n'arccosh' : [nointM, nointM,\n (\"acosh,\"*6, '\"arccosh\"'),\n (1, 1), None,\n \"inverse hyperbolic cosine elementwise.\"\n ],\n'arcsinh': [nointM, nointM,\n (\"asinh,\"*6, '\"arcsinh\"'),\n (1, 1), None,\n \"inverse hyperbolic sine elementwise.\"\n ],\n'arctanh': [nointM, nointM,\n (\"atanh,\"*6, '\"arctanh\"'),\n (1, 1), None,\n \"inverse hyperbolic tangent elementwise.\"\n ],\n'cos': [nointM, nointM,\n (\"cos,\"*6, '\"cos\"'),\n (1, 1), None,\n \"cosine elementwise.\"\n ],\n'sin': [nointM, nointM,\n (\"sin,\"*6, '\"sin\"'),\n (1, 1), None,\n \"sine elementwise.\"\n ],\n'tan': [nointM, nointM,\n (\"tan,\"*6, '\"tan\"'),\n (1, 1), None,\n \"tangent elementwise.\"\n ],\n'cosh': [nointM, nointM,\n (\"cosh,\"*6, '\"cosh\"'),\n (1, 1), None,\n \"hyperbolic cosine elementwise.\"\n ],\n'sinh': [nointM, nointM,\n (\"sinh,\"*6, '\"sinh\"'),\n (1, 1), None,\n \"hyperbolic sine elementwise.\"\n ],\n'tanh': [nointM, nointM,\n (\"tanh,\"*6, '\"tanh\"'),\n (1, 1), None,\n \"hyperbolic tangent elementwise.\"\n ],\n'exp' : [nointM, nointM,\n (\"exp,\"*6, '\"exp\"'),\n (1, 1), None,\n \"e**x elementwise.\"\n ],\n'log' : [nointM, nointM,\n (\"log,\"*6, '\"log\"'),\n (1, 1), None,\n \"logarithm base e elementwise.\"\n ],\n'log10' : [nointM, nointM,\n (\"log10,\"*6, '\"log10\"'),\n (1, 1), None,\n \"logarithm base 10 elementwise.\"\n ],\n'sqrt' : [nointM, nointM,\n (\"sqrt,\"*6, '\"sqrt\"'),\n (1,1), None,\n \"square-root elementwise.\"\n ],\n'ceil' : [fltsM, fltsM,\n (\"ceil,\"*3, '\"ceil\"'),\n (1,1), None,\n \"elementwise smallest integer >= x.\"\n ],\n'fabs' : [fltsM, fltsM,\n (\"fabs,\"*3, '\"fabs\"'),\n (1,1), None,\n \"absolute values.\"\n ],\n'floor' : [fltsM, fltsM,\n (\"floor,\"*3, '\"floor\"'),\n (1,1), None,\n \"elementwise largest integer <= x\"\n ],\n'arctan2' : [fltsM, fltsM,\n (\"atan2,\"*3, '\"arctan2\"'),\n (2,1), None,\n \"a safe and correct arctan(x1/x2)\"\n ],\n\n'remainder' : [intflt, 'O',\n (\"PyObject_Remainder\"),\n (2,1), None,\n \"computes x1-n*x2 where n is floor(x1 / x2)\"],\n\n'hypot' : [fltsM, fltsM,\n (\"hypot,\"*3, '\"hypot\"'),\n (2,1), None,\n \"sqrt(x1**2 + x2**2) elementwise\"\n ],\n\n'isnan' : [flts+cmplx, '',\n (), (1,1), None,\n \"returns True where x is Not-A-Number\",\n '?'*len(flts+cmplx)\n ],\n\n'isinf' : [flts+cmplx, '',\n (), (1,1), None,\n \"returns True where x is +inf or -inf\",\n '?'*len(flts+cmplx)\n ],\n\n'isfinite' : [flts+cmplx, '',\n (), (1,1), None,\n \"returns True where x is finite\",\n '?'*len(flts+cmplx)\n ],\n\n'signbit' : [flts,'',\n (),(1,1),None,\n \"returns True where signbit of x is set (x<0).\",\n '?'*len(flts)\n ],\n\n'modf' : [flts,'',\n (),(1,2),None,\n \"breaks x into fractional (y1) and integral (y2) parts.\\\\n\\\\n Each output has the same sign as the input.\"\n ]\n}\n\n\ndef indent(st,spaces):\n indention = ' '*spaces\n indented = indention + string.replace(st,'\\n','\\n'+indention)\n # trim off any trailing spaces\n indented = re.sub(r' +$',r'',indented)\n return indented\n\nchartoname = {'?': 'bool',\n 'b': 'byte',\n 'B': 'ubyte',\n 'h': 'short',\n 'H': 'ushort',\n 'i': 'int',\n 'I': 'uint',\n 'l': 'long',\n 'L': 'ulong',\n 'q': 'longlong',\n 'Q': 'ulonglong',\n 'f': 'float',\n 'd': 'double',\n 'g': 'longdouble',\n 'F': 'cfloat',\n 'D': 'cdouble',\n 'G': 'clongdouble',\n 'O': 'OBJECT',\n 'M': 'OBJECT',\n }\n\nchartotype1 = {'f': 'f_f',\n 'd': 'd_d',\n 'g': 'g_g',\n 'F': 'F_F',\n 'D': 'D_D',\n 'G': 'G_G',\n 'O': 'O_O',\n 'M': 'O_O_method'}\n\nchartotype2 = {'f': 'ff_f',\n 'd': 'dd_d',\n 'g': 'gg_g',\n 'F': 'FF_F',\n 'D': 'DD_D',\n 'G': 'GG_G',\n 'O': 'OO_O',\n 'M': 'O_O_method'}\n#for each name\n# 1) create functions, data, and signature\n# 2) fill in functions and data in InitOperators\n# 3) add function. \n\ndef make_arrays(funcdict):\n # functions array contains an entry for every type implemented\n # NULL should be placed where PyUfunc_ style function will be filled in later\n #\n code1list = []\n code2list = []\n for name, vals in funcdict.iteritems():\n funclist = []\n datalist = []\n siglist = []\n k=0;\n sub=0;\n numin, numout = vals[3]\n\n if numin > 1:\n thedict = chartotype2 # two inputs and one output\n else: \n thedict = chartotype1 # one input and one output\n\n instr = ''.join([x*numin for x in list(vals[0])])\n if len(vals) > 6:\n if isinstance(vals[6],type('')):\n outstr = vals[6]\n else: # a tuple specifying input signature, output signature\n instr, outstr = vals[6]\n else:\n outstr = ''.join([x*numout for x in list(vals[0])])\n\n _valslen = len(vals[0])\n assert _valslen*numout == len(outstr), \"input/output signature doesn't match\"\n assert len(instr) == _valslen*numin, \"input/output signature doesn't match\"\n\n for char in vals[0]:\n if char in vals[1]: # use generic function-based interface\n funclist.append('NULL')\n astr = '%s_functions[%d] = PyUFunc_%s;' % \\\n (name, k, thedict[char])\n code2list.append(astr)\n thisfunc = vals[2][sub] \n if len(thisfunc) > 8 and thisfunc[:8] == \"PyNumber\": \n astr = '%s_data[%d] = (void *) %s;' % \\\n (name, k, thisfunc)\n code2list.append(astr)\n datalist.append('(void *)NULL');\n else:\n datalist.append('(void *)%s' % thisfunc)\n sub += 1\n else: # individual wrapper interface\n datalist.append('(void *)NULL'); \n funclist.append('%s_%s' % (chartoname[char].upper(), name))\n\n insubstr = instr[numin*k:numin*(k+1)]\n outsubstr = outstr[numout*k:numout*(k+1)]\n siglist.extend(['PyArray_%s' % chartoname[x].upper() for x in insubstr])\n siglist.extend(['PyArray_%s' % chartoname[x].upper() for x in outsubstr])\n k += 1\n funcnames = ', '.join(funclist)\n signames = ', '.join(siglist)\n datanames = ', '.join(datalist)\n code1list.append(\"static PyUFuncGenericFunction %s_functions[] = { %s };\" \\\n % (name, funcnames))\n code1list.append(\"static void * %s_data[] = { %s };\" \\\n % (name, datanames))\n code1list.append(\"static char %s_signatures[] = { %s };\" \\\n % (name, signames)) \n return \"\\n\".join(code1list),\"\\n\".join(code2list)\n\ndef make_ufuncs(funcdict):\n code3list = []\n for name, vals in funcdict.items():\n mlist = []\n mlist.append(\\\nr\"\"\"f = PyUFunc_FromFuncAndData(%s_functions, %s_data, %s_signatures, %d,\n %d, %d, %s, \"%s\",\n \"%s\", 0);\"\"\" % (name,name,name,len(vals[0]),\n vals[3][0], vals[3][1], vals[4],\n name, vals[5]))\n mlist.append(r\"\"\"PyDict_SetItemString(dictionary, \"%s\", f);\"\"\"%name)\n mlist.append(r\"\"\"Py_DECREF(f);\"\"\")\n code3list.append('\\n'.join(mlist)) \n return '\\n'.join(code3list)\n \n\ndef convert_vals(funcdict):\n for name, vals in funcdict.iteritems():\n if vals[4] is None:\n vals[4] = None_\n vals2 = vals[2]\n if len(vals2) > 0:\n alist = vals2[0].split(',')\n if len(alist) == 4:\n a = alist[0]\n if 'f' in vals[1]:\n newlist = [ a+'f', a, a+'l']\n else:\n newlist = ['nc_'+a+'f', 'nc_'+a, 'nc_'+a+'l']\n elif len(alist) == 7:\n a = alist[0]\n newlist = [a+'f', a, a+'l','nc_'+a+'f', 'nc_'+a, 'nc_'+a+'l']\n else:\n newlist = alist\n newlist = newlist + list(vals2[1:])\n vals[2] = tuple(newlist)\n funcdict[name] = vals\n\n\ndef make_code(funcdict,filename):\n convert_vals(funcdict)\n code1, code2 = make_arrays(funcdict)\n code3 = make_ufuncs(funcdict)\n code2 = indent(code2,4)\n code3 = indent(code3,4)\n code = r\"\"\"\n\n/** Warning this file is autogenerated!!!\n\n Please make changes to the code generator program (%s)\n**/\n\n%s\n\nstatic void\nInitOperators(PyObject *dictionary) {\n PyObject *f;\n\n%s\n%s\n}\n\"\"\" % (filename, code1, code2, code3)\n return code;\n\n\nif __name__ == \"__main__\":\n filename = __file__\n fid = open('__umath_generated.c','w')\n code = make_code(defdict, filename)\n fid.write(code)\n fid.close()\n \n\n\n\n\n\n\n\n\n\n\n", "source_code_before": "\nimport string\nimport re\n\nZero = \"PyUFunc_Zero\"\nOne = \"PyUFunc_One\"\nNone_ = \"PyUFunc_None\"\n#each entry in defdict is \n\n#name: [string of chars for which it is defined,\n#\tstring of characters using func interface,\n#\ttuple of strings giving funcs for data,\n# (in, out), or (instr, outstr) giving the signature as character codes,\n# identity,\n#\tdocstring,\n# output specification (optional)\n# ]\n\nall = '?bBhHiIlLqQfdgFDGO'\nints = 'bBhHiIlLqQ'\nintsO = ints + 'O'\nbintsO = '?'+ints+'O'\nflts = 'fdg'\nfltsO = flts+'O'\nfltsM = flts+'M'\ncmplx = 'FDG'\ncmplxO = cmplx+'O'\ncmplxM = cmplx+'M'\nnoint = flts+cmplx+'O'\nnointM = flts+cmplx+'M'\nall = '?'+ints+flts+cmplxO\nnobool = all[1:]\nnobool_or_obj = all[1:-1]\nintflt = ints+flts\nnocmplx = '?'+ints+flts\nnocmplxO = nocmplx+'O'\nnocmplxM = nocmplx+'M'\nnoobj = all[:-1]\n\ndefdict = {\n'add': [all,'O',(\"PyNumber_Add\",),\n (2,1), Zero,\n \"addd the arguments elementwise.\"\n ],\n'subtract' : [all,'O',(\"PyNumber_Subtract\",),\n (2,1), Zero,\n \"subtracts the arguments elementwise.\"\n ],\n'multiply' : [all,cmplxO,\n (\"prod,\"*3,\"PyNumber_Multiply\",),\n (2,1), One,\n \"multiplies the arguments elementwise.\"\n ],\n'divide' : [nobool,cmplxO,\n (\"quot,\"*3,\"PyNumber_Divide\",),\n (2,1), One,\n \"divides the arguments elementwise.\"\n ],\n'floor_divide' : [nobool, cmplxO,\n (\"floor_quot,\"*3,\n \"PyNumber_FloorDivide\"),\n (2,1), One,\n \"floor divides the arguments elementwise.\"\n ],\n'true_divide' : [nobool, cmplxO,\n (\"quot,\"*3,\"PyNumber_TrueDivide\"),\n (2,1), One,\n \"true divides the arguments elementwise.\",\n 'f'*4+'d'*6+flts+cmplxO\n ],\n'conjugate' : [nobool_or_obj, 'M',\n ('\"conjugate\"',),\n (1,1), None,\n \"takes the conjugate of x elementwise.\"\n ],\n'remainder' : [intflt,fltsO,\n (\"fmod,\"*3, \"PyNumber_Remainder\"),\n (2,1), Zero,\n \"computes x1 % x2 elementwise.\"\n ],\n'power' : [nobool,noint,\n (\"pow,\"*6,\n \"PyNumber_Power\"),\n (2,1), One,\n \"computes x1**x2 elementwise.\"\n ],\n'absolute' : [all,'O',\n (\"PyNumber_Absolute\",),\n (1,1), None,\n \"takes |x| elementwise.\",\n nocmplx+fltsO\n ],\n'negative' : [all,cmplxO,\n (\"neg,\"*3,\"PyNumber_Negative\"),\n (1,1), None,\n \"determines -x elementwise\",\n ],\n'greater' : [all,'',(),(2,1), None,\n \"returns elementwise x1 > x2 in a bool array.\",\n '?'*len(all)\n ],\n'greater_equal' : [all,'',(),(2,1), None,\n \"returns elementwise x1 >= x2 in a bool array.\",\n '?'*len(all)\n ],\n'less' : [all,'',(),(2,1), None,\n \"returns elementwise x1 < x2 in a bool array.\",\n '?'*len(all)\n ],\n'less_equal' : [all,'',(),(2,1), None,\n \"returns elementwise x1 <= x2 in a bool array\",\n '?'*len(all)\n ],\n'equal' : [all, '', (), (2,1), None,\n \"returns elementwise x1 == x2 in a bool array\",\n '?'*len(all)\n ],\n'not_equal' : [all, '', (), (2,1), None,\n \"returns elementwise x1 |= x2\",\n '?'*len(all)\n ],\n'logical_and': [nocmplxM,'M',('\"logical_and\"',),\n (2,1), One,\n \"returns x1 and x2 elementwise.\",\n '?'*len(nocmplxM)\n ],\n'logical_or': [nocmplxM,'M',('\"logical_or\"',),\n (2,1), Zero, \n \"returns x1 or x2 elementwise.\",\n '?'*len(nocmplxM)\n ],\n'logical_xor': [nocmplxM, 'M', ('\"logical_xor\"',),\n (2,1), None,\n \"returns x1 xor x2 elementwise.\",\n '?'*len(nocmplxM)\n ],\n'logical_not' : [nocmplxM, 'M', ('\"logical_not\"',),\n (1,1), None,\n \"returns not x elementwise.\",\n '?'*len(nocmplxM)\n ],\n'maximum' : [noobj,'',(),\n (2,1), None,\n \"returns maximum (if x1 > x2: x1; else: x2) elementwise.\"],\n'minimum' : [noobj,'',(),\n (2,1), None,\n \"returns minimum (if x1 < x2: x1; else: x2) elementwise\"],\n'bitwise_and' : [bintsO,'O',(\"PyNumber_And\",),\n (2,1), One,\n \"computes x1 & x2 elementwise.\"],\n'bitwise_or' : [bintsO, 'O', (\"PyNumber_Or\",),\n (2,1), Zero,\n \"computes x1 | x2 elementwise.\"],\n'bitwise_xor' : [bintsO, 'O', (\"PyNumber_Xor\",),\n (2,1), None,\n \"computes x1 ^ x2 elementwise.\"],\n'invert' : [bintsO,'O', (\"PyNumber_Invert\",),\n (1,1), None,\n \"computes ~x (bit inversion) elementwise.\"\n ],\n'left_shift' : [intsO, 'O', (\"PyNumber_Lshift\",),\n (2,1), None,\n \"computes x1 << x2 (x1 shifted to left by x2 bits) elementwise.\"\n ],\n'right_shift' : [intsO, 'O', (\"PyNumber_Rshift\",),\n (2,1), None,\n \"computes x1 >> x2 (x1 shifted to right by x2 bits) elementwise.\"\n ],\n'arccos' : [nointM, nointM,\n (\"acos,\"*6, '\"arccos\"'),\n (1, 1), None,\n \"inverse cosine elementwise.\"\n ],\n'arcsin': [nointM, nointM,\n (\"asin,\"*6, '\"arcsin\"'),\n (1, 1), None,\n \"inverse sine elementwise.\"\n ],\n'arctan': [nointM, nointM,\n (\"atan,\"*6, '\"arctan\"'),\n (1, 1), None,\n \"inverse tangent elementwise.\"\n ],\n'arccosh' : [nointM, nointM,\n (\"acosh,\"*6, '\"arccosh\"'),\n (1, 1), None,\n \"inverse hyperbolic cosine elementwise.\"\n ],\n'arcsinh': [nointM, nointM,\n (\"asinh,\"*6, '\"arcsinh\"'),\n (1, 1), None,\n \"inverse hyperbolic sine elementwise.\"\n ],\n'arctanh': [nointM, nointM,\n (\"atanh,\"*6, '\"arctanh\"'),\n (1, 1), None,\n \"inverse hyperbolic tangent elementwise.\"\n ],\n'cos': [nointM, nointM,\n (\"cos,\"*6, '\"cos\"'),\n (1, 1), None,\n \"cosine elementwise.\"\n ],\n'sin': [nointM, nointM,\n (\"sin,\"*6, '\"sin\"'),\n (1, 1), None,\n \"sine elementwise.\"\n ],\n'tan': [nointM, nointM,\n (\"tan,\"*6, '\"tan\"'),\n (1, 1), None,\n \"tangent elementwise.\"\n ],\n'cosh': [nointM, nointM,\n (\"cosh,\"*6, '\"cosh\"'),\n (1, 1), None,\n \"hyperbolic cosine elementwise.\"\n ],\n'sinh': [nointM, nointM,\n (\"sinh,\"*6, '\"sinh\"'),\n (1, 1), None,\n \"hyperbolic sine elementwise.\"\n ],\n'tanh': [nointM, nointM,\n (\"tanh,\"*6, '\"tanh\"'),\n (1, 1), None,\n \"hyperbolic tangent elementwise.\"\n ],\n'exp' : [nointM, nointM,\n (\"exp,\"*6, '\"exp\"'),\n (1, 1), None,\n \"e**x elementwise.\"\n ],\n'log' : [nointM, nointM,\n (\"log,\"*6, '\"log\"'),\n (1, 1), None,\n \"logarithm base e elementwise.\"\n ],\n'log10' : [nointM, nointM,\n (\"log10,\"*6, '\"log10\"'),\n (1, 1), None,\n \"logarithm base 10 elementwise.\"\n ],\n'sqrt' : [nointM, nointM,\n (\"sqrt,\"*6, '\"sqrt\"'),\n (1,1), None,\n \"square-root elementwise.\"\n ],\n'ceil' : [fltsM, fltsM,\n (\"ceil,\"*3, '\"ceil\"'),\n (1,1), None,\n \"elementwise smallest integer >= x.\"\n ],\n'fabs' : [fltsM, fltsM,\n (\"fabs,\"*3, '\"fabs\"'),\n (1,1), None,\n \"absolute values.\"\n ],\n'floor' : [fltsM, fltsM,\n (\"floor,\"*3, '\"floor\"'),\n (1,1), None,\n \"elementwise largest integer <= x\"\n ],\n'arctan2' : [fltsM, fltsM,\n (\"atan2,\"*3, '\"arctan2\"'),\n (2,1), None,\n \"a safe and correct arctan(x1/x2)\"\n ],\n'fmod' : [fltsM, fltsM,\n (\"fmod,\"*3,'\"fmod\"'),\n (2,1), None,\n \"computes x1-n*x2 where n is the quotient of x1 / x2\"],\n'hypot' : [fltsM, fltsM,\n (\"hypot,\"*3, '\"hypot\"'),\n (2,1), None,\n \"sqrt(x1**2 + x2**2) elementwise\"\n ],\n\n'isnan' : [flts+cmplx, '',\n (), (1,1), None,\n \"returns True where x is Not-A-Number\",\n '?'*len(flts+cmplx)\n ],\n\n'isinf' : [flts+cmplx, '',\n (), (1,1), None,\n \"returns True where x is +inf or -inf\",\n '?'*len(flts+cmplx)\n ],\n\n'isfinite' : [flts+cmplx, '',\n (), (1,1), None,\n \"returns True where x is finite\",\n '?'*len(flts+cmplx)\n ],\n\n'signbit' : [flts,'',\n (),(1,1),None,\n \"returns True where signbit of x is set (x<0).\",\n '?'*len(flts)\n ],\n\n'modf' : [flts,'',\n (),(1,2),None,\n \"breaks x into fractional (y1) and integral (y2) parts.\\\\n\\\\n Each output has the same sign as the input.\"\n ]\n}\n\n\ndef indent(st,spaces):\n indention = ' '*spaces\n indented = indention + string.replace(st,'\\n','\\n'+indention)\n # trim off any trailing spaces\n indented = re.sub(r' +$',r'',indented)\n return indented\n\nchartoname = {'?': 'bool',\n 'b': 'byte',\n 'B': 'ubyte',\n 'h': 'short',\n 'H': 'ushort',\n 'i': 'int',\n 'I': 'uint',\n 'l': 'long',\n 'L': 'ulong',\n 'q': 'longlong',\n 'Q': 'ulonglong',\n 'f': 'float',\n 'd': 'double',\n 'g': 'longdouble',\n 'F': 'cfloat',\n 'D': 'cdouble',\n 'G': 'clongdouble',\n 'O': 'OBJECT',\n 'M': 'OBJECT',\n }\n\nchartotype1 = {'f': 'f_f',\n 'd': 'd_d',\n 'g': 'g_g',\n 'F': 'F_F',\n 'D': 'D_D',\n 'G': 'G_G',\n 'O': 'O_O',\n 'M': 'O_O_method'}\n\nchartotype2 = {'f': 'ff_f',\n 'd': 'dd_d',\n 'g': 'gg_g',\n 'F': 'FF_F',\n 'D': 'DD_D',\n 'G': 'GG_G',\n 'O': 'OO_O',\n 'M': 'O_O_method'}\n#for each name\n# 1) create functions, data, and signature\n# 2) fill in functions and data in InitOperators\n# 3) add function. \n\ndef make_arrays(funcdict):\n # functions array contains an entry for every type implemented\n # NULL should be placed where PyUfunc_ style function will be filled in later\n #\n code1list = []\n code2list = []\n for name, vals in funcdict.iteritems():\n funclist = []\n datalist = []\n siglist = []\n k=0;\n sub=0;\n numin, numout = vals[3]\n\n if numin > 1:\n thedict = chartotype2 # two inputs and one output\n else: \n thedict = chartotype1 # one input and one output\n\n instr = ''.join([x*numin for x in list(vals[0])])\n if len(vals) > 6:\n if isinstance(vals[6],type('')):\n outstr = vals[6]\n else: # a tuple specifying input signature, output signature\n instr, outstr = vals[6]\n else:\n outstr = ''.join([x*numout for x in list(vals[0])])\n\n _valslen = len(vals[0])\n assert _valslen*numout == len(outstr), \"input/output signature doesn't match\"\n assert len(instr) == _valslen*numin, \"input/output signature doesn't match\"\n\n for char in vals[0]:\n if char in vals[1]: # use generic function-based interface\n funclist.append('NULL')\n astr = '%s_functions[%d] = PyUFunc_%s;' % \\\n (name, k, thedict[char])\n code2list.append(astr)\n thisfunc = vals[2][sub] \n if len(thisfunc) > 8 and thisfunc[:8] == \"PyNumber\": \n astr = '%s_data[%d] = (void *) %s;' % \\\n (name, k, thisfunc)\n code2list.append(astr)\n datalist.append('(void *)NULL');\n else:\n datalist.append('(void *)%s' % thisfunc)\n sub += 1\n else: # individual wrapper interface\n datalist.append('(void *)NULL'); \n funclist.append('%s_%s' % (chartoname[char].upper(), name))\n\n insubstr = instr[numin*k:numin*(k+1)]\n outsubstr = outstr[numout*k:numout*(k+1)]\n siglist.extend(['PyArray_%s' % chartoname[x].upper() for x in insubstr])\n siglist.extend(['PyArray_%s' % chartoname[x].upper() for x in outsubstr])\n k += 1\n funcnames = ', '.join(funclist)\n signames = ', '.join(siglist)\n datanames = ', '.join(datalist)\n code1list.append(\"static PyUFuncGenericFunction %s_functions[] = { %s };\" \\\n % (name, funcnames))\n code1list.append(\"static void * %s_data[] = { %s };\" \\\n % (name, datanames))\n code1list.append(\"static char %s_signatures[] = { %s };\" \\\n % (name, signames)) \n return \"\\n\".join(code1list),\"\\n\".join(code2list)\n\ndef make_ufuncs(funcdict):\n code3list = []\n for name, vals in funcdict.items():\n mlist = []\n mlist.append(\\\nr\"\"\"f = PyUFunc_FromFuncAndData(%s_functions, %s_data, %s_signatures, %d,\n %d, %d, %s, \"%s\",\n \"%s\", 0);\"\"\" % (name,name,name,len(vals[0]),\n vals[3][0], vals[3][1], vals[4],\n name, vals[5]))\n mlist.append(r\"\"\"PyDict_SetItemString(dictionary, \"%s\", f);\"\"\"%name)\n mlist.append(r\"\"\"Py_DECREF(f);\"\"\")\n code3list.append('\\n'.join(mlist)) \n return '\\n'.join(code3list)\n \n\ndef convert_vals(funcdict):\n for name, vals in funcdict.iteritems():\n if vals[4] is None:\n vals[4] = None_\n vals2 = vals[2]\n if len(vals2) > 0:\n alist = vals2[0].split(',')\n if len(alist) == 4:\n a = alist[0]\n if 'f' in vals[1]:\n newlist = [ a+'f', a, a+'l']\n else:\n newlist = ['nc_'+a+'f', 'nc_'+a, 'nc_'+a+'l']\n elif len(alist) == 7:\n a = alist[0]\n newlist = [a+'f', a, a+'l','nc_'+a+'f', 'nc_'+a, 'nc_'+a+'l']\n else:\n newlist = alist\n newlist = newlist + list(vals2[1:])\n vals[2] = tuple(newlist)\n funcdict[name] = vals\n\n\ndef make_code(funcdict,filename):\n convert_vals(funcdict)\n code1, code2 = make_arrays(funcdict)\n code3 = make_ufuncs(funcdict)\n code2 = indent(code2,4)\n code3 = indent(code3,4)\n code = r\"\"\"\n\n/** Warning this file is autogenerated!!!\n\n Please make changes to the code generator program (%s)\n**/\n\n%s\n\nstatic void\nInitOperators(PyObject *dictionary) {\n PyObject *f;\n\n%s\n%s\n}\n\"\"\" % (filename, code1, code2, code3)\n return code;\n\n\nif __name__ == \"__main__\":\n filename = __file__\n fid = open('__umath_generated.c','w')\n code = make_code(defdict, filename)\n fid.write(code)\n fid.close()\n \n\n\n\n\n\n\n\n\n\n\n", "methods": [ { "name": "indent", "long_name": "indent( st , spaces )", "filename": "generate_umath.py", "nloc": 5, "complexity": 1, "token_count": 44, "parameters": [ "st", "spaces" ], "start_line": 313, "end_line": 318, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "make_arrays", "long_name": "make_arrays( funcdict )", "filename": "generate_umath.py", "nloc": 58, "complexity": 13, "token_count": 468, "parameters": [ "funcdict" ], "start_line": 363, "end_line": 428, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 66, "top_nesting_level": 0 }, { "name": "make_ufuncs", "long_name": "make_ufuncs( funcdict )", "filename": "generate_umath.py", "nloc": 14, "complexity": 2, "token_count": 110, "parameters": [ "funcdict" ], "start_line": 430, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "convert_vals", "long_name": "convert_vals( funcdict )", "filename": "generate_umath.py", "nloc": 21, "complexity": 7, "token_count": 186, "parameters": [ "funcdict" ], "start_line": 446, "end_line": 466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "make_code", "long_name": "make_code( funcdict , filename )", "filename": "generate_umath.py", "nloc": 24, "complexity": 1, "token_count": 58, "parameters": [ "funcdict", "filename" ], "start_line": 469, "end_line": 492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "methods_before": [ { "name": "indent", "long_name": "indent( st , spaces )", "filename": "generate_umath.py", "nloc": 5, "complexity": 1, "token_count": 44, "parameters": [ "st", "spaces" ], "start_line": 310, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "make_arrays", "long_name": "make_arrays( funcdict )", "filename": "generate_umath.py", "nloc": 58, "complexity": 13, "token_count": 468, "parameters": [ "funcdict" ], "start_line": 360, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 66, "top_nesting_level": 0 }, { "name": "make_ufuncs", "long_name": "make_ufuncs( funcdict )", "filename": "generate_umath.py", "nloc": 14, "complexity": 2, "token_count": 110, "parameters": [ "funcdict" ], "start_line": 427, "end_line": 440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "convert_vals", "long_name": "convert_vals( funcdict )", "filename": "generate_umath.py", "nloc": 21, "complexity": 7, "token_count": 186, "parameters": [ "funcdict" ], "start_line": 443, "end_line": 463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "make_code", "long_name": "make_code( funcdict , filename )", "filename": "generate_umath.py", "nloc": 24, "complexity": 1, "token_count": 58, "parameters": [ "funcdict", "filename" ], "start_line": 466, "end_line": 489, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 452, "complexity": 24, "token_count": 2659, "diff_parsed": { "added": [ "", "'fmod' : [intflt,fltsM,", " (\"fmod,\"*3, \"fmod\"),", " (2,1), Zero,", " \"computes (C-like) x1 % x2 elementwise.\"", " ],", "", "'remainder' : [intflt, 'O',", " (\"PyObject_Remainder\"),", " (2,1), None,", " \"computes x1-n*x2 where n is floor(x1 / x2)\"],", "" ], "deleted": [ "'remainder' : [intflt,fltsO,", " (\"fmod,\"*3, \"PyNumber_Remainder\"),", " (2,1), Zero,", " \"computes x1 % x2 elementwise.\"", " ],", "'fmod' : [fltsM, fltsM,", " (\"fmod,\"*3,'\"fmod\"'),", " (2,1), None,", " \"computes x1-n*x2 where n is the quotient of x1 / x2\"]," ] } }, { "old_path": "scipy/base/numeric.py", "new_path": "scipy/base/numeric.py", "filename": "numeric.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -68,8 +68,7 @@ def zeros_like(a):\n use empty_like(), which is faster as it only allocates memory.\"\"\"\n \n a = asarray(a)\n- return a.__array_wrap__(zeros(a.shape,a.dtype,\n- a.flags['FORTRAN'] and a.ndim > 1))\n+ return zeros(a.shape,a.dtype, a.flags['FNC'])\n \n def empty_like(a):\n \"\"\"Return an empty (uninitialized) array of the shape and typecode of a.\n@@ -78,9 +77,8 @@ def empty_like(a):\n your array to be initialized, you should use zeros_like().\n \n \"\"\"\n- asarray(a)\n- return a.__array_wrap__(empty(a.shape,a.dtype,\n- a.flags['FORTRAN'] and a.ndim > 1))\n+ a = asarray(a)\n+ return empty(a.shape,a.dtype, a.flags['FNC'])\n \n # end Fernando's utilities\n \n", "added_lines": 3, "deleted_lines": 5, "source_code": "\nimport sys\nimport types, math\n\nimport multiarray\nimport umath\nfrom umath import *\nfrom numerictypes import *\nfrom _compiled_base import _insert\n\nnewaxis = None\n\nndarray = multiarray.ndarray\nbigndarray = multiarray.bigndarray\nufunc = type(sin)\n\narange = multiarray.arange\narray = multiarray.array\nzeros = multiarray.zeros\nempty = multiarray.empty\nfromstring = multiarray.fromstring\nfromfile = multiarray.fromfile\nfrombuffer = multiarray.frombuffer\nwhere = multiarray.where\nconcatenate = multiarray.concatenate\nfastCopyAndTranspose = multiarray._fastCopyAndTranspose\nregister_dtype = multiarray.register_dtype\ncan_cast = multiarray.can_cast\n\n\ndef asarray(a, dtype=None):\n \"\"\"asarray(a,dtype=None) returns a as an array. Unlike array(),\n no copy is performed if a is already an array. Will return a subclass\n of array. \n \"\"\"\n return array(a, dtype, copy=0)\n\ndef asndarray(a, dtype=None):\n \"\"\"asndarray(a, dtype=None) always returns an actual ndarray object.\n No copy is performed if a is already an array.\n Meant primarily for debugging. \n \"\"\"\n dtype = obj2dtype(dtype)\n # exact check\n while 1:\n if type(a) is ndarray:\n if dtype is None or a.dtype is dtype:\n return a\n else:\n return a.astype(dtype)\n try:\n if dtype is None:\n return a.__array__()\n else:\n return a.__array__(dtype)\n except AttributeError:\n a = array(a,dtype) # copy irrelevant\n dtype = None\n\ndef isfortran(a):\n return a.flags['FNC']\n\n# from Fernando Perez's IPython\ndef zeros_like(a):\n \"\"\"Return an array of zeros of the shape and typecode of a.\n\n If you don't explicitly need the array to be zeroed, you should instead\n use empty_like(), which is faster as it only allocates memory.\"\"\"\n\n a = asarray(a)\n return zeros(a.shape,a.dtype, a.flags['FNC'])\n\ndef empty_like(a):\n \"\"\"Return an empty (uninitialized) array of the shape and typecode of a.\n\n Note that this does NOT initialize the returned array. If you require\n your array to be initialized, you should use zeros_like().\n\n \"\"\"\n a = asarray(a)\n return empty(a.shape,a.dtype, a.flags['FNC'])\n\n# end Fernando's utilities\n\n_mode_from_name_dict = {'v': 0,\n 's' : 1,\n 'f' : 2}\n\ndef _mode_from_name(mode):\n if isinstance(mode, type(\"\")):\n return _mode_from_name_dict[mode.lower()[0]]\n return mode\n \ndef correlate(a,v,mode='valid'):\n mode = _mode_from_name(mode)\n return multiarray.correlate(a,v,mode)\n\n\ndef convolve(a,v,mode='full'):\n \"\"\"Returns the discrete, linear convolution of 1-D\n sequences a and v; mode can be 0 (valid), 1 (same), or 2 (full)\n to specify size of the resulting sequence.\n \"\"\"\n if (len(v) > len(a)):\n a, v = v, a\n mode = _mode_from_name(mode)\n return correlate(a,asarray(v)[::-1],mode)\n\n\ninner = multiarray.inner\ndot = multiarray.dot\n\ndef outer(a,b):\n \"\"\"outer(a,b) returns the outer product of two vectors.\n result(i,j) = a(i)*b(j) when a and b are vectors\n Will accept any arguments that can be made into vectors.\n \"\"\"\n a = asndarray(a)\n b = asndarray(b)\n return a.ravel()[:,newaxis]*b.ravel()[newaxis,:]\n\ndef vdot(a, b):\n \"\"\"Returns the dot product of 2 vectors (or anything that can be made into\n a vector). NB: this is not the same as `dot`, as it takes the conjugate\n of its first argument if complex and always returns a scalar.\"\"\"\n return dot(asarray(a).ravel().conj(), asarray(b).ravel())\n\n# try to import blas optimized dot if available\ntry:\n # importing this changes the dot function for basic 4 types\n # to blas-optimized versions.\n from scipy.lib._dotblas import dot, vdot, inner, alterdot, restoredot\nexcept ImportError:\n def alterdot():\n pass\n def restoredot():\n pass\n\n\ndef _move_axis_to_0(a, axis):\n if axis == 0:\n return a\n n = a.ndim\n if axis < 0:\n axis += n\n axes = range(1, axis+1) + [0,] + range(axis+1, n)\n return a.transpose(axes)\n\ndef cross(a, b, axisa=-1, axisb=-1, axisc=-1):\n \"\"\"Return the cross product of two (arrays of) vectors.\n\n The cross product is performed over the last axis of a and b by default,\n and can handle axes with dimensions 2 and 3. For a dimension of 2,\n the z-component of the equivalent three-dimensional cross product is\n returned.\n \"\"\"\n a = _move_axis_to_0(asndarray(a), axisa)\n b = _move_axis_to_0(asndarray(b), axisb)\n msg = \"incompatible dimensions for cross product\\n\"\\\n \"(dimension must be 2 or 3)\"\n if (a.shape[0] not in [2,3]) or (b.shape[0] not in [2,3]):\n raise ValueError(msg)\n if a.shape[0] == 2:\n if (b.shape[0] == 2):\n cp = a[0]*b[1] - a[1]*b[0]\n if cp.ndim == 0:\n return cp\n else:\n return cp.swapaxes(0,axisc)\n else:\n x = a[1]*b[2]\n y = -a[0]*b[2]\n z = a[0]*b[1] - a[1]*b[0]\n elif a.shape[0] == 3:\n if (b.shape[0] == 3):\n x = a[1]*b[2] - a[2]*b[1]\n y = a[2]*b[0] - a[0]*b[2]\n z = a[0]*b[1] - a[1]*b[0]\n else:\n x = -a[2]*b[1]\n y = a[2]*b[0]\n z = a[0]*b[1] - a[1]*b[0]\n cp = array([x,y,z])\n if cp.ndim == 1:\n return cp\n else:\n return cp.swapaxes(0,axisc)\n \n\n#Use numarray's printing function\nfrom arrayprint import array2string, get_printoptions, set_printoptions\n\n_typelessdata = [int_, float_, complex_]\nif issubclass(intc, int):\n _typelessdata.append(intc)\n\nif issubclass(longlong, int):\n _typelessdata.append(longlong)\n\ndef array_repr(arr, max_line_width=None, precision=None, suppress_small=None):\n if arr.size > 0 or arr.shape==(0,):\n lst = array2string(arr, max_line_width, precision, suppress_small,\n ', ', \"array(\")\n else: # show zero-length shape unless it is (0,)\n lst = \"[], shape=%s\" % (repr(arr.shape),)\n typeless = arr.dtype in _typelessdata\n\n if arr.__class__ is not ndarray:\n cName= arr.__class__.__name__\n else:\n cName = \"array\"\n if typeless and arr.size:\n return cName + \"(%s)\" % lst\n else:\n typename=arr.dtype.__name__[:-8]\n return cName + \"(%s, dtype=%s)\" % (lst, typename)\n\ndef array_str(a, max_line_width = None, precision = None, suppress_small = None):\n return array2string(a, max_line_width, precision, suppress_small, ' ', \"\")\n\nset_string_function = multiarray.set_string_function\nset_string_function(array_str, 0)\nset_string_function(array_repr, 1)\n\n\nlittle_endian = (sys.byteorder == 'little')\n\ndef indices(dimensions, dtype=int_):\n \"\"\"indices(dimensions,dtype=int_) returns an array representing a grid\n of indices with row-only, and column-only variation.\n \"\"\"\n tmp = ones(dimensions, dtype)\n lst = []\n for i in range(len(dimensions)):\n lst.append( add.accumulate(tmp, i, )-1 )\n return array(lst)\n\ndef fromfunction(function, dimensions, **kwargs):\n \"\"\"fromfunction(function, dimensions) returns an array constructed by\n calling function on a tuple of number grids. The function should\n accept as many arguments as there are dimensions which is a list of\n numbers indicating the length of the desired output for each axis.\n\n The function can also accept keyword arguments which will be\n passed in as well. \n \"\"\"\n args = indices(dimensions)\n return function(*args,**kwargs)\n \n\nfrom cPickle import load, loads\n_cload = load\n_file = file\n\ndef load(file):\n if isinstance(file, type(\"\")):\n file = _file(file,\"rb\")\n return _cload(file)\n\n\n# These are all essentially abbreviations\n# These might wind up in a special abbreviations module\n\ndef ones(shape, dtype=int_, fortran=0):\n \"\"\"ones(shape, dtype=int_) returns an array of the given\n dimensions which is initialized to all ones. \n \"\"\"\n a=zeros(shape, dtype, fortran)\n a+=1\n ### a[...]=1 -- slower?\n return a\n \ndef identity(n,dtype=int_):\n \"\"\"identity(n) returns the identity matrix of shape n x n.\n \"\"\"\n a = array([1]+n*[0],dtype=dtype)\n b = empty((n,n),dtype=dtype)\n b.flat = a\n return b\n\ndef allclose (a, b, rtol=1.e-5, atol=1.e-8):\n \"\"\" allclose(a,b,rtol=1.e-5,atol=1.e-8)\n Returns true if all components of a and b are equal\n subject to given tolerances.\n The relative error rtol must be positive and << 1.0\n The absolute error atol comes into play for those elements\n of y that are very small or zero; it says how small x must be also.\n \"\"\"\n x = array(a, copy=0)\n y = array(b, copy=0)\n d = less(absolute(x-y), atol + rtol * absolute(y))\n return alltrue(ravel(d))\n \n\n_errdict = {\"ignore\":ERR_IGNORE,\n \"warn\":ERR_WARN,\n \"raise\":ERR_RAISE,\n \"call\":ERR_CALL}\n\n_errdict_rev = {}\nfor key in _errdict.keys():\n _errdict_rev[_errdict[key]] = key\ndel key\n\ndef seterr(divide=\"ignore\", over=\"ignore\", under=\"ignore\", invalid=\"ignore\", where=0):\n maskvalue = (_errdict[divide] << SHIFT_DIVIDEBYZERO) + \\\n (_errdict[over] << SHIFT_OVERFLOW ) + \\\n (_errdict[under] << SHIFT_UNDERFLOW) + \\\n (_errdict[invalid] << SHIFT_INVALID)\n frame = sys._getframe().f_back\n try:\n wh = where.lower()[0]\n except (AttributeError, TypeError, IndexError):\n wh = None\n if where==0 or wh == 'l':\n frame.f_locals[UFUNC_ERRMASK_NAME] = maskvalue\n elif where == 1 or wh == 'g':\n frame.f_globals[UFUNC_ERRMASK_NAME] = maskvalue\n elif where == 2 or wh == 'b':\n frame.f_builtins[UFUNC_ERRMASK_NAME] = maskvalue\n return\n\n frame.f_locals[UFUNC_ERRMASK_NAME] = maskvalue\n return\n\nseterr()\n\ndef geterr():\n frame = sys._getframe().f_back\n try:\n maskvalue = frame.f_locals[UFUNC_ERRMASK_NAME]\n except KeyError:\n maskvalue = ERR_DEFAULT\n\n mask = 3\n res = {}\n val = (maskvalue >> SHIFT_DIVIDEBYZERO) & mask\n res['divide'] = _errdict_rev[val]\n val = (maskvalue >> SHIFT_OVERFLOW) & mask\n res['over'] = _errdict_rev[val]\n val = (maskvalue >> SHIFT_UNDERFLOW) & mask\n res['under'] = _errdict_rev[val]\n val = (maskvalue >> SHIFT_INVALID) & mask\n res['invalid'] = _errdict_rev[val]\n return res\n\ndef setbufsize(size, where=0):\n if size > 10e6:\n raise ValueError, \"Very big buffers.. %s\" % size\n frame = sys._getframe().f_back\n try:\n wh = where.lower()[0]\n except (AttributeError, TypeError, IndexError):\n wh = None\n if where == 0 or wh == 'l':\n frame.f_locals[UFUNC_BUFSIZE_NAME] = size\n elif where == 1 or wh == 'g':\n frame.f_globals[UFUNC_BUFSIZE_NAME] = size\n elif where == 2 or wh == 'b':\n frame.f_builtins[UFUNC_BUFSIZE_NAME] = size\n return\n\nsetbufsize(10000, 1)\n\ndef getbufsize(size):\n frame = sys._getframe().f_back\n try:\n retval = frame.f_locals[UFUNC_BUFSIZE_NAME]\n except KeyError:\n retval = frame.f_globals[UFUNC_BUFSIZE_NAME]\n except KeyError:\n retval = frame.f_builtins[UFUNC_BUFSIZE_NAME]\n except KeyError:\n retvalue = UFUNC_BUFSIZE_DEFAULT\n\n return retval\n\n\n# Set the UFUNC_BUFSIZE_NAME to something\n# Set the UFUNC_ERRMASK_NAME to something\nseterr(where='builtin')\nsetbufsize(UFUNC_BUFSIZE_DEFAULT,where='builtin')\n\nInf = inf = infty = Infinity = PINF\nnan = NaN = NAN\nfrom oldnumeric import *\n\n\n", "source_code_before": "\nimport sys\nimport types, math\n\nimport multiarray\nimport umath\nfrom umath import *\nfrom numerictypes import *\nfrom _compiled_base import _insert\n\nnewaxis = None\n\nndarray = multiarray.ndarray\nbigndarray = multiarray.bigndarray\nufunc = type(sin)\n\narange = multiarray.arange\narray = multiarray.array\nzeros = multiarray.zeros\nempty = multiarray.empty\nfromstring = multiarray.fromstring\nfromfile = multiarray.fromfile\nfrombuffer = multiarray.frombuffer\nwhere = multiarray.where\nconcatenate = multiarray.concatenate\nfastCopyAndTranspose = multiarray._fastCopyAndTranspose\nregister_dtype = multiarray.register_dtype\ncan_cast = multiarray.can_cast\n\n\ndef asarray(a, dtype=None):\n \"\"\"asarray(a,dtype=None) returns a as an array. Unlike array(),\n no copy is performed if a is already an array. Will return a subclass\n of array. \n \"\"\"\n return array(a, dtype, copy=0)\n\ndef asndarray(a, dtype=None):\n \"\"\"asndarray(a, dtype=None) always returns an actual ndarray object.\n No copy is performed if a is already an array.\n Meant primarily for debugging. \n \"\"\"\n dtype = obj2dtype(dtype)\n # exact check\n while 1:\n if type(a) is ndarray:\n if dtype is None or a.dtype is dtype:\n return a\n else:\n return a.astype(dtype)\n try:\n if dtype is None:\n return a.__array__()\n else:\n return a.__array__(dtype)\n except AttributeError:\n a = array(a,dtype) # copy irrelevant\n dtype = None\n\ndef isfortran(a):\n return a.flags['FNC']\n\n# from Fernando Perez's IPython\ndef zeros_like(a):\n \"\"\"Return an array of zeros of the shape and typecode of a.\n\n If you don't explicitly need the array to be zeroed, you should instead\n use empty_like(), which is faster as it only allocates memory.\"\"\"\n\n a = asarray(a)\n return a.__array_wrap__(zeros(a.shape,a.dtype,\n a.flags['FORTRAN'] and a.ndim > 1))\n\ndef empty_like(a):\n \"\"\"Return an empty (uninitialized) array of the shape and typecode of a.\n\n Note that this does NOT initialize the returned array. If you require\n your array to be initialized, you should use zeros_like().\n\n \"\"\"\n asarray(a)\n return a.__array_wrap__(empty(a.shape,a.dtype,\n a.flags['FORTRAN'] and a.ndim > 1))\n\n# end Fernando's utilities\n\n_mode_from_name_dict = {'v': 0,\n 's' : 1,\n 'f' : 2}\n\ndef _mode_from_name(mode):\n if isinstance(mode, type(\"\")):\n return _mode_from_name_dict[mode.lower()[0]]\n return mode\n \ndef correlate(a,v,mode='valid'):\n mode = _mode_from_name(mode)\n return multiarray.correlate(a,v,mode)\n\n\ndef convolve(a,v,mode='full'):\n \"\"\"Returns the discrete, linear convolution of 1-D\n sequences a and v; mode can be 0 (valid), 1 (same), or 2 (full)\n to specify size of the resulting sequence.\n \"\"\"\n if (len(v) > len(a)):\n a, v = v, a\n mode = _mode_from_name(mode)\n return correlate(a,asarray(v)[::-1],mode)\n\n\ninner = multiarray.inner\ndot = multiarray.dot\n\ndef outer(a,b):\n \"\"\"outer(a,b) returns the outer product of two vectors.\n result(i,j) = a(i)*b(j) when a and b are vectors\n Will accept any arguments that can be made into vectors.\n \"\"\"\n a = asndarray(a)\n b = asndarray(b)\n return a.ravel()[:,newaxis]*b.ravel()[newaxis,:]\n\ndef vdot(a, b):\n \"\"\"Returns the dot product of 2 vectors (or anything that can be made into\n a vector). NB: this is not the same as `dot`, as it takes the conjugate\n of its first argument if complex and always returns a scalar.\"\"\"\n return dot(asarray(a).ravel().conj(), asarray(b).ravel())\n\n# try to import blas optimized dot if available\ntry:\n # importing this changes the dot function for basic 4 types\n # to blas-optimized versions.\n from scipy.lib._dotblas import dot, vdot, inner, alterdot, restoredot\nexcept ImportError:\n def alterdot():\n pass\n def restoredot():\n pass\n\n\ndef _move_axis_to_0(a, axis):\n if axis == 0:\n return a\n n = a.ndim\n if axis < 0:\n axis += n\n axes = range(1, axis+1) + [0,] + range(axis+1, n)\n return a.transpose(axes)\n\ndef cross(a, b, axisa=-1, axisb=-1, axisc=-1):\n \"\"\"Return the cross product of two (arrays of) vectors.\n\n The cross product is performed over the last axis of a and b by default,\n and can handle axes with dimensions 2 and 3. For a dimension of 2,\n the z-component of the equivalent three-dimensional cross product is\n returned.\n \"\"\"\n a = _move_axis_to_0(asndarray(a), axisa)\n b = _move_axis_to_0(asndarray(b), axisb)\n msg = \"incompatible dimensions for cross product\\n\"\\\n \"(dimension must be 2 or 3)\"\n if (a.shape[0] not in [2,3]) or (b.shape[0] not in [2,3]):\n raise ValueError(msg)\n if a.shape[0] == 2:\n if (b.shape[0] == 2):\n cp = a[0]*b[1] - a[1]*b[0]\n if cp.ndim == 0:\n return cp\n else:\n return cp.swapaxes(0,axisc)\n else:\n x = a[1]*b[2]\n y = -a[0]*b[2]\n z = a[0]*b[1] - a[1]*b[0]\n elif a.shape[0] == 3:\n if (b.shape[0] == 3):\n x = a[1]*b[2] - a[2]*b[1]\n y = a[2]*b[0] - a[0]*b[2]\n z = a[0]*b[1] - a[1]*b[0]\n else:\n x = -a[2]*b[1]\n y = a[2]*b[0]\n z = a[0]*b[1] - a[1]*b[0]\n cp = array([x,y,z])\n if cp.ndim == 1:\n return cp\n else:\n return cp.swapaxes(0,axisc)\n \n\n#Use numarray's printing function\nfrom arrayprint import array2string, get_printoptions, set_printoptions\n\n_typelessdata = [int_, float_, complex_]\nif issubclass(intc, int):\n _typelessdata.append(intc)\n\nif issubclass(longlong, int):\n _typelessdata.append(longlong)\n\ndef array_repr(arr, max_line_width=None, precision=None, suppress_small=None):\n if arr.size > 0 or arr.shape==(0,):\n lst = array2string(arr, max_line_width, precision, suppress_small,\n ', ', \"array(\")\n else: # show zero-length shape unless it is (0,)\n lst = \"[], shape=%s\" % (repr(arr.shape),)\n typeless = arr.dtype in _typelessdata\n\n if arr.__class__ is not ndarray:\n cName= arr.__class__.__name__\n else:\n cName = \"array\"\n if typeless and arr.size:\n return cName + \"(%s)\" % lst\n else:\n typename=arr.dtype.__name__[:-8]\n return cName + \"(%s, dtype=%s)\" % (lst, typename)\n\ndef array_str(a, max_line_width = None, precision = None, suppress_small = None):\n return array2string(a, max_line_width, precision, suppress_small, ' ', \"\")\n\nset_string_function = multiarray.set_string_function\nset_string_function(array_str, 0)\nset_string_function(array_repr, 1)\n\n\nlittle_endian = (sys.byteorder == 'little')\n\ndef indices(dimensions, dtype=int_):\n \"\"\"indices(dimensions,dtype=int_) returns an array representing a grid\n of indices with row-only, and column-only variation.\n \"\"\"\n tmp = ones(dimensions, dtype)\n lst = []\n for i in range(len(dimensions)):\n lst.append( add.accumulate(tmp, i, )-1 )\n return array(lst)\n\ndef fromfunction(function, dimensions, **kwargs):\n \"\"\"fromfunction(function, dimensions) returns an array constructed by\n calling function on a tuple of number grids. The function should\n accept as many arguments as there are dimensions which is a list of\n numbers indicating the length of the desired output for each axis.\n\n The function can also accept keyword arguments which will be\n passed in as well. \n \"\"\"\n args = indices(dimensions)\n return function(*args,**kwargs)\n \n\nfrom cPickle import load, loads\n_cload = load\n_file = file\n\ndef load(file):\n if isinstance(file, type(\"\")):\n file = _file(file,\"rb\")\n return _cload(file)\n\n\n# These are all essentially abbreviations\n# These might wind up in a special abbreviations module\n\ndef ones(shape, dtype=int_, fortran=0):\n \"\"\"ones(shape, dtype=int_) returns an array of the given\n dimensions which is initialized to all ones. \n \"\"\"\n a=zeros(shape, dtype, fortran)\n a+=1\n ### a[...]=1 -- slower?\n return a\n \ndef identity(n,dtype=int_):\n \"\"\"identity(n) returns the identity matrix of shape n x n.\n \"\"\"\n a = array([1]+n*[0],dtype=dtype)\n b = empty((n,n),dtype=dtype)\n b.flat = a\n return b\n\ndef allclose (a, b, rtol=1.e-5, atol=1.e-8):\n \"\"\" allclose(a,b,rtol=1.e-5,atol=1.e-8)\n Returns true if all components of a and b are equal\n subject to given tolerances.\n The relative error rtol must be positive and << 1.0\n The absolute error atol comes into play for those elements\n of y that are very small or zero; it says how small x must be also.\n \"\"\"\n x = array(a, copy=0)\n y = array(b, copy=0)\n d = less(absolute(x-y), atol + rtol * absolute(y))\n return alltrue(ravel(d))\n \n\n_errdict = {\"ignore\":ERR_IGNORE,\n \"warn\":ERR_WARN,\n \"raise\":ERR_RAISE,\n \"call\":ERR_CALL}\n\n_errdict_rev = {}\nfor key in _errdict.keys():\n _errdict_rev[_errdict[key]] = key\ndel key\n\ndef seterr(divide=\"ignore\", over=\"ignore\", under=\"ignore\", invalid=\"ignore\", where=0):\n maskvalue = (_errdict[divide] << SHIFT_DIVIDEBYZERO) + \\\n (_errdict[over] << SHIFT_OVERFLOW ) + \\\n (_errdict[under] << SHIFT_UNDERFLOW) + \\\n (_errdict[invalid] << SHIFT_INVALID)\n frame = sys._getframe().f_back\n try:\n wh = where.lower()[0]\n except (AttributeError, TypeError, IndexError):\n wh = None\n if where==0 or wh == 'l':\n frame.f_locals[UFUNC_ERRMASK_NAME] = maskvalue\n elif where == 1 or wh == 'g':\n frame.f_globals[UFUNC_ERRMASK_NAME] = maskvalue\n elif where == 2 or wh == 'b':\n frame.f_builtins[UFUNC_ERRMASK_NAME] = maskvalue\n return\n\n frame.f_locals[UFUNC_ERRMASK_NAME] = maskvalue\n return\n\nseterr()\n\ndef geterr():\n frame = sys._getframe().f_back\n try:\n maskvalue = frame.f_locals[UFUNC_ERRMASK_NAME]\n except KeyError:\n maskvalue = ERR_DEFAULT\n\n mask = 3\n res = {}\n val = (maskvalue >> SHIFT_DIVIDEBYZERO) & mask\n res['divide'] = _errdict_rev[val]\n val = (maskvalue >> SHIFT_OVERFLOW) & mask\n res['over'] = _errdict_rev[val]\n val = (maskvalue >> SHIFT_UNDERFLOW) & mask\n res['under'] = _errdict_rev[val]\n val = (maskvalue >> SHIFT_INVALID) & mask\n res['invalid'] = _errdict_rev[val]\n return res\n\ndef setbufsize(size, where=0):\n if size > 10e6:\n raise ValueError, \"Very big buffers.. %s\" % size\n frame = sys._getframe().f_back\n try:\n wh = where.lower()[0]\n except (AttributeError, TypeError, IndexError):\n wh = None\n if where == 0 or wh == 'l':\n frame.f_locals[UFUNC_BUFSIZE_NAME] = size\n elif where == 1 or wh == 'g':\n frame.f_globals[UFUNC_BUFSIZE_NAME] = size\n elif where == 2 or wh == 'b':\n frame.f_builtins[UFUNC_BUFSIZE_NAME] = size\n return\n\nsetbufsize(10000, 1)\n\ndef getbufsize(size):\n frame = sys._getframe().f_back\n try:\n retval = frame.f_locals[UFUNC_BUFSIZE_NAME]\n except KeyError:\n retval = frame.f_globals[UFUNC_BUFSIZE_NAME]\n except KeyError:\n retval = frame.f_builtins[UFUNC_BUFSIZE_NAME]\n except KeyError:\n retvalue = UFUNC_BUFSIZE_DEFAULT\n\n return retval\n\n\n# Set the UFUNC_BUFSIZE_NAME to something\n# Set the UFUNC_ERRMASK_NAME to something\nseterr(where='builtin')\nsetbufsize(UFUNC_BUFSIZE_DEFAULT,where='builtin')\n\nInf = inf = infty = Infinity = PINF\nnan = NaN = NAN\nfrom oldnumeric import *\n\n\n", "methods": [ { "name": "asarray", "long_name": "asarray( a , dtype = None )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "a", "dtype" ], "start_line": 31, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "asndarray", "long_name": "asndarray( a , dtype = None )", "filename": "numeric.py", "nloc": 16, "complexity": 7, "token_count": 85, "parameters": [ "a", "dtype" ], "start_line": 38, "end_line": 58, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "isfortran", "long_name": "isfortran( a )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "a" ], "start_line": 60, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "zeros_like", "long_name": "zeros_like( a )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "a" ], "start_line": 64, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "empty_like", "long_name": "empty_like( a )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "a" ], "start_line": 73, "end_line": 81, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "_mode_from_name", "long_name": "_mode_from_name( mode )", "filename": "numeric.py", "nloc": 4, "complexity": 2, "token_count": 30, "parameters": [ "mode" ], "start_line": 89, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "correlate", "long_name": "correlate( a , v , mode = 'valid' )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "v", "mode" ], "start_line": 94, "end_line": 96, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "convolve", "long_name": "convolve( a , v , mode = 'full' )", "filename": "numeric.py", "nloc": 5, "complexity": 2, "token_count": 55, "parameters": [ "a", "v", "mode" ], "start_line": 99, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "outer", "long_name": "outer( a , b )", "filename": "numeric.py", "nloc": 4, "complexity": 1, "token_count": 42, "parameters": [ "a", "b" ], "start_line": 113, "end_line": 120, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "vdot", "long_name": "vdot( a , b )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 33, "parameters": [ "a", "b" ], "start_line": 122, "end_line": 126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "alterdot", "long_name": "alterdot( )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 5, "parameters": [], "start_line": 134, "end_line": 135, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "restoredot", "long_name": "restoredot( )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 5, "parameters": [], "start_line": 136, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_move_axis_to_0", "long_name": "_move_axis_to_0( a , axis )", "filename": "numeric.py", "nloc": 8, "complexity": 3, "token_count": 58, "parameters": [ "a", "axis" ], "start_line": 140, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "cross", "long_name": "cross( a , b , axisa = - 1 , axisb = - 1 , axisc = - 1 )", "filename": "numeric.py", "nloc": 32, "complexity": 9, "token_count": 360, "parameters": [ "a", "b", "axisa", "axisb", "axisc" ], "start_line": 149, "end_line": 187, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( arr , max_line_width = None , precision = None , suppress_small = None )", "filename": "numeric.py", "nloc": 16, "complexity": 6, "token_count": 128, "parameters": [ "arr", "max_line_width", "precision", "suppress_small" ], "start_line": 200, "end_line": 216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( a , max_line_width = None , precision = None , suppress_small = None )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 32, "parameters": [ "a", "max_line_width", "precision", "suppress_small" ], "start_line": 218, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "indices", "long_name": "indices( dimensions , dtype = int_ )", "filename": "numeric.py", "nloc": 6, "complexity": 2, "token_count": 54, "parameters": [ "dimensions", "dtype" ], "start_line": 228, "end_line": 236, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "fromfunction", "long_name": "fromfunction( function , dimensions , ** kwargs )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "function", "dimensions", "kwargs" ], "start_line": 238, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "load", "long_name": "load( file )", "filename": "numeric.py", "nloc": 4, "complexity": 2, "token_count": 29, "parameters": [ "file" ], "start_line": 255, "end_line": 258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "ones", "long_name": "ones( shape , dtype = int_ , fortran = 0 )", "filename": "numeric.py", "nloc": 4, "complexity": 1, "token_count": 29, "parameters": [ "shape", "dtype", "fortran" ], "start_line": 264, "end_line": 271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "identity", "long_name": "identity( n , dtype = int_ )", "filename": "numeric.py", "nloc": 5, "complexity": 1, "token_count": 49, "parameters": [ "n", "dtype" ], "start_line": 273, "end_line": 279, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "allclose", "long_name": "allclose( a , b , rtol = 1 . e - 5 , atol = 1 . e - 8 )", "filename": "numeric.py", "nloc": 5, "complexity": 1, "token_count": 72, "parameters": [ "a", "b", "rtol", "atol" ], "start_line": 281, "end_line": 292, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "seterr", "long_name": "seterr( divide = \"ignore\" , over = \"ignore\" , under = \"ignore\" , invalid = \"ignore\" , where = 0 )", "filename": "numeric.py", "nloc": 19, "complexity": 8, "token_count": 161, "parameters": [ "divide", "over", "under", "invalid", "where" ], "start_line": 305, "end_line": 324, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "geterr", "long_name": "geterr( )", "filename": "numeric.py", "nloc": 17, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 328, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "setbufsize", "long_name": "setbufsize( size , where = 0 )", "filename": "numeric.py", "nloc": 15, "complexity": 9, "token_count": 105, "parameters": [ "size", "where" ], "start_line": 347, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "getbufsize", "long_name": "getbufsize( size )", "filename": "numeric.py", "nloc": 11, "complexity": 4, "token_count": 54, "parameters": [ "size" ], "start_line": 365, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "asarray", "long_name": "asarray( a , dtype = None )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "a", "dtype" ], "start_line": 31, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "asndarray", "long_name": "asndarray( a , dtype = None )", "filename": "numeric.py", "nloc": 16, "complexity": 7, "token_count": 85, "parameters": [ "a", "dtype" ], "start_line": 38, "end_line": 58, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "isfortran", "long_name": "isfortran( a )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "a" ], "start_line": 60, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "zeros_like", "long_name": "zeros_like( a )", "filename": "numeric.py", "nloc": 4, "complexity": 2, "token_count": 41, "parameters": [ "a" ], "start_line": 64, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "empty_like", "long_name": "empty_like( a )", "filename": "numeric.py", "nloc": 4, "complexity": 2, "token_count": 39, "parameters": [ "a" ], "start_line": 74, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_mode_from_name", "long_name": "_mode_from_name( mode )", "filename": "numeric.py", "nloc": 4, "complexity": 2, "token_count": 30, "parameters": [ "mode" ], "start_line": 91, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "correlate", "long_name": "correlate( a , v , mode = 'valid' )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "v", "mode" ], "start_line": 96, "end_line": 98, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "convolve", "long_name": "convolve( a , v , mode = 'full' )", "filename": "numeric.py", "nloc": 5, "complexity": 2, "token_count": 55, "parameters": [ "a", "v", "mode" ], "start_line": 101, "end_line": 109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "outer", "long_name": "outer( a , b )", "filename": "numeric.py", "nloc": 4, "complexity": 1, "token_count": 42, "parameters": [ "a", "b" ], "start_line": 115, "end_line": 122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "vdot", "long_name": "vdot( a , b )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 33, "parameters": [ "a", "b" ], "start_line": 124, "end_line": 128, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "alterdot", "long_name": "alterdot( )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 5, "parameters": [], "start_line": 136, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "restoredot", "long_name": "restoredot( )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 5, "parameters": [], "start_line": 138, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_move_axis_to_0", "long_name": "_move_axis_to_0( a , axis )", "filename": "numeric.py", "nloc": 8, "complexity": 3, "token_count": 58, "parameters": [ "a", "axis" ], "start_line": 142, "end_line": 149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "cross", "long_name": "cross( a , b , axisa = - 1 , axisb = - 1 , axisc = - 1 )", "filename": "numeric.py", "nloc": 32, "complexity": 9, "token_count": 360, "parameters": [ "a", "b", "axisa", "axisb", "axisc" ], "start_line": 151, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( arr , max_line_width = None , precision = None , suppress_small = None )", "filename": "numeric.py", "nloc": 16, "complexity": 6, "token_count": 128, "parameters": [ "arr", "max_line_width", "precision", "suppress_small" ], "start_line": 202, "end_line": 218, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( a , max_line_width = None , precision = None , suppress_small = None )", "filename": "numeric.py", "nloc": 2, "complexity": 1, "token_count": 32, "parameters": [ "a", "max_line_width", "precision", "suppress_small" ], "start_line": 220, "end_line": 221, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "indices", "long_name": "indices( dimensions , dtype = int_ )", "filename": "numeric.py", "nloc": 6, "complexity": 2, "token_count": 54, "parameters": [ "dimensions", "dtype" ], "start_line": 230, "end_line": 238, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "fromfunction", "long_name": "fromfunction( function , dimensions , ** kwargs )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "function", "dimensions", "kwargs" ], "start_line": 240, "end_line": 250, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "load", "long_name": "load( file )", "filename": "numeric.py", "nloc": 4, "complexity": 2, "token_count": 29, "parameters": [ "file" ], "start_line": 257, "end_line": 260, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "ones", "long_name": "ones( shape , dtype = int_ , fortran = 0 )", "filename": "numeric.py", "nloc": 4, "complexity": 1, "token_count": 29, "parameters": [ "shape", "dtype", "fortran" ], "start_line": 266, "end_line": 273, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "identity", "long_name": "identity( n , dtype = int_ )", "filename": "numeric.py", "nloc": 5, "complexity": 1, "token_count": 49, "parameters": [ "n", "dtype" ], "start_line": 275, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "allclose", "long_name": "allclose( a , b , rtol = 1 . e - 5 , atol = 1 . e - 8 )", "filename": "numeric.py", "nloc": 5, "complexity": 1, "token_count": 72, "parameters": [ "a", "b", "rtol", "atol" ], "start_line": 283, "end_line": 294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "seterr", "long_name": "seterr( divide = \"ignore\" , over = \"ignore\" , under = \"ignore\" , invalid = \"ignore\" , where = 0 )", "filename": "numeric.py", "nloc": 19, "complexity": 8, "token_count": 161, "parameters": [ "divide", "over", "under", "invalid", "where" ], "start_line": 307, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "geterr", "long_name": "geterr( )", "filename": "numeric.py", "nloc": 17, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 330, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "setbufsize", "long_name": "setbufsize( size , where = 0 )", "filename": "numeric.py", "nloc": 15, "complexity": 9, "token_count": 105, "parameters": [ "size", "where" ], "start_line": 349, "end_line": 363, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "getbufsize", "long_name": "getbufsize( size )", "filename": "numeric.py", "nloc": 11, "complexity": 4, "token_count": 54, "parameters": [ "size" ], "start_line": 367, "end_line": 378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "zeros_like", "long_name": "zeros_like( a )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "a" ], "start_line": 64, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "empty_like", "long_name": "empty_like( a )", "filename": "numeric.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "a" ], "start_line": 73, "end_line": 81, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 } ], "nloc": 254, "complexity": 70, "token_count": 1987, "diff_parsed": { "added": [ " return zeros(a.shape,a.dtype, a.flags['FNC'])", " a = asarray(a)", " return empty(a.shape,a.dtype, a.flags['FNC'])" ], "deleted": [ " return a.__array_wrap__(zeros(a.shape,a.dtype,", " a.flags['FORTRAN'] and a.ndim > 1))", " asarray(a)", " return a.__array_wrap__(empty(a.shape,a.dtype,", " a.flags['FORTRAN'] and a.ndim > 1))" ] } }, { "old_path": "scipy/base/src/arrayobject.c", "new_path": "scipy/base/src/arrayobject.c", "filename": "arrayobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -2341,7 +2341,7 @@ array_divmod(PyArrayObject *op1, PyObject *op2)\n {\n PyObject *divp, *modp, *result;\n \n- divp = array_divide(op1, op2);\n+ divp = array_floor_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n@@ -3556,8 +3556,8 @@ array_flags_get(PyArrayObject *self)\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n- return PyObject_CallMethod(module, \"flagsobj\", \"Oi\", \n- self, self->flags);\n+ return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n+ self, self->flags, 0);\n }\n \n /*\n", "added_lines": 3, "deleted_lines": 3, "source_code": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_floor_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tPyObject_Del(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyObject_Del(self);\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\tif (self->dimensions != NULL) \n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) PyErr_Clear();\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) free(dims.ptr);\n if (strides.ptr) free(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, self->flags, 0);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_data_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_New(arr->ob_type, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n\t\t\tPy_INCREF(arr);\n\t\t\tret = arr;\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_CastToType(arr, typecode);\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \"\\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr == NULL) {\n\t\tPy_INCREF(input);\n\t\tattr = input;\n\t}\n\t\n\tres = PyObject_AsWriteBuffer(attr, (void **)&data, &buffer_len);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_Check(op)) return op;\n\n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, 0);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY);\n}\n\n/* End of deprecated */\n\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, '\\0', sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyObject *r;\n intp size, strides;\n int nd;\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n\tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arraymapiter_next,\t/* tp_iternext */\n 0,\t \t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "source_code_before": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tPyObject_Del(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyObject_Del(self);\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyObject_Del(self);\n\t\t\tif (self->dimensions != NULL) \n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) PyErr_Clear();\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) free(dims.ptr);\n if (strides.ptr) free(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oi\", \n self, self->flags);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_data_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_New(arr->ob_type, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n\t\t\tPy_INCREF(arr);\n\t\t\tret = arr;\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n\t\t\tret = (PyArrayObject *)\\\n\t\t\t\tPyArray_CastToType(arr, typecode);\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \"\\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr == NULL) {\n\t\tPy_INCREF(input);\n\t\tattr = input;\n\t}\n\t\n\tres = PyObject_AsWriteBuffer(attr, (void **)&data, &buffer_len);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_Check(op)) return op;\n\n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, 0);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY);\n}\n\n/* End of deprecated */\n\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize > from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) > from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n\t\t\treturn (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, '\\0', sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyObject *r;\n intp size, strides;\n int nd;\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n\tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arraymapiter_next,\t/* tp_iternext */\n 0,\t \t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "methods": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1596, "end_line": 1655, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1676, "end_line": 1751, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1764, "end_line": 1816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1824, "end_line": 1827, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1846, "end_line": 1858, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1861, "end_line": 1876, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1880, "end_line": 1889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1892, "end_line": 1903, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1971, "end_line": 2004, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2011, "end_line": 2050, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2053, "end_line": 2072, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2076, "end_line": 2095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2099, "end_line": 2110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2113, "end_line": 2124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2127, "end_line": 2139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2142, "end_line": 2145, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2148, "end_line": 2151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2154, "end_line": 2157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2160, "end_line": 2163, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2166, "end_line": 2169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2172, "end_line": 2175, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2178, "end_line": 2181, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2184, "end_line": 2187, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2190, "end_line": 2193, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2196, "end_line": 2199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2202, "end_line": 2205, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2208, "end_line": 2211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2214, "end_line": 2217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2220, "end_line": 2223, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2226, "end_line": 2229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2232, "end_line": 2235, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2238, "end_line": 2241, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2244, "end_line": 2247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2250, "end_line": 2253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2256, "end_line": 2259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2262, "end_line": 2265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2268, "end_line": 2271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2274, "end_line": 2277, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2280, "end_line": 2283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2286, "end_line": 2289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2292, "end_line": 2295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2298, "end_line": 2301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2304, "end_line": 2308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2311, "end_line": 2315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2319, "end_line": 2337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2340, "end_line": 2355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2359, "end_line": 2385, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2388, "end_line": 2413, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2416, "end_line": 2438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2441, "end_line": 2463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2466, "end_line": 2488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2491, "end_line": 2495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2556, "end_line": 2594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2598, "end_line": 2619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2622, "end_line": 2627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2648, "end_line": 2695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2698, "end_line": 2734, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2740, "end_line": 2757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2760, "end_line": 2772, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2775, "end_line": 2787, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2791, "end_line": 2868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2871, "end_line": 2900, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2906, "end_line": 2922, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2927, "end_line": 2950, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2956, "end_line": 2972, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2976, "end_line": 2992, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2996, "end_line": 3012, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3015, "end_line": 3048, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3052, "end_line": 3074, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3081, "end_line": 3096, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3116, "end_line": 3140, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 112, "complexity": 28, "token_count": 672, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3144, "end_line": 3288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 145, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3293, "end_line": 3398, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3402, "end_line": 3419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3423, "end_line": 3538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3545, "end_line": 3548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "self" ], "start_line": 3551, "end_line": 3561, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3634, "end_line": 3637, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3641, "end_line": 3675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3679, "end_line": 3682, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3685, "end_line": 3718, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3722, "end_line": 3729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3732, "end_line": 3740, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3744, "end_line": 3758, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3761, "end_line": 3805, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3809, "end_line": 3812, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3815, "end_line": 3822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3826, "end_line": 3833, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3836, "end_line": 3856, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3859, "end_line": 3881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3884, "end_line": 3887, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3891, "end_line": 3894, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3906, "end_line": 3964, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3969, "end_line": 3979, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3983, "end_line": 4008, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4012, "end_line": 4044, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4047, "end_line": 4082, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4085, "end_line": 4122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4125, "end_line": 4128, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4131, "end_line": 4185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4364, "end_line": 4389, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4392, "end_line": 4414, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4421, "end_line": 4447, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4450, "end_line": 4470, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4473, "end_line": 4614, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4617, "end_line": 4640, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4644, "end_line": 4667, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4671, "end_line": 4728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4732, "end_line": 4739, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4745, "end_line": 4835, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4841, "end_line": 4852, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4855, "end_line": 4890, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4897, "end_line": 4943, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 80, "complexity": 26, "token_count": 522, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4946, "end_line": 5040, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5044, "end_line": 5149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 83, "complexity": 18, "token_count": 543, "parameters": [ "input", "intype", "flags" ], "start_line": 5152, "end_line": 5247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5250, "end_line": 5271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5275, "end_line": 5337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5340, "end_line": 5345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5348, "end_line": 5354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5408, "end_line": 5438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 82, "parameters": [ "op" ], "start_line": 5448, "end_line": 5464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5470, "end_line": 5476, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5479, "end_line": 5486, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5489, "end_line": 5496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 99, "complexity": 43, "token_count": 578, "parameters": [ "fromtype", "totype" ], "start_line": 5502, "end_line": 5603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 102, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5606, "end_line": 5630, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5640, "end_line": 5677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5682, "end_line": 5692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5695, "end_line": 5700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5703, "end_line": 5708, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5712, "end_line": 5715, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5719, "end_line": 5767, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5770, "end_line": 5823, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5827, "end_line": 5946, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5950, "end_line": 5982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5985, "end_line": 6027, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6031, "end_line": 6153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6166, "end_line": 6208, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6213, "end_line": 6217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6282, "end_line": 6343, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6351, "end_line": 6366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6372, "end_line": 6441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6445, "end_line": 6481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6487, "end_line": 6531, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6549, "end_line": 6685, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6691, "end_line": 6760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6763, "end_line": 6896, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6902, "end_line": 6932, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_next", "long_name": "arraymapiter_next( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 12, "complexity": 4, "token_count": 70, "parameters": [ "mit" ], "start_line": 6938, "end_line": 6949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 6952, "end_line": 6961, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 6964, "end_line": 6982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1596, "end_line": 1655, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1676, "end_line": 1751, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1764, "end_line": 1816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1824, "end_line": 1827, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1846, "end_line": 1858, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1861, "end_line": 1876, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1880, "end_line": 1889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1892, "end_line": 1903, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1971, "end_line": 2004, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2011, "end_line": 2050, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2053, "end_line": 2072, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2076, "end_line": 2095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2099, "end_line": 2110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2113, "end_line": 2124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2127, "end_line": 2139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2142, "end_line": 2145, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2148, "end_line": 2151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2154, "end_line": 2157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2160, "end_line": 2163, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2166, "end_line": 2169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2172, "end_line": 2175, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2178, "end_line": 2181, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2184, "end_line": 2187, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2190, "end_line": 2193, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2196, "end_line": 2199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2202, "end_line": 2205, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2208, "end_line": 2211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2214, "end_line": 2217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2220, "end_line": 2223, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2226, "end_line": 2229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2232, "end_line": 2235, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2238, "end_line": 2241, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2244, "end_line": 2247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2250, "end_line": 2253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2256, "end_line": 2259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2262, "end_line": 2265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2268, "end_line": 2271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2274, "end_line": 2277, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2280, "end_line": 2283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2286, "end_line": 2289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2292, "end_line": 2295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2298, "end_line": 2301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2304, "end_line": 2308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2311, "end_line": 2315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2319, "end_line": 2337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2340, "end_line": 2355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2359, "end_line": 2385, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2388, "end_line": 2413, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2416, "end_line": 2438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2441, "end_line": 2463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2466, "end_line": 2488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2491, "end_line": 2495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2556, "end_line": 2594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2598, "end_line": 2619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2622, "end_line": 2627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2648, "end_line": 2695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2698, "end_line": 2734, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2740, "end_line": 2757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2760, "end_line": 2772, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2775, "end_line": 2787, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2791, "end_line": 2868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2871, "end_line": 2900, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2906, "end_line": 2922, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2927, "end_line": 2950, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2956, "end_line": 2972, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2976, "end_line": 2992, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2996, "end_line": 3012, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3015, "end_line": 3048, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3052, "end_line": 3074, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3081, "end_line": 3096, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3116, "end_line": 3140, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 112, "complexity": 28, "token_count": 672, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3144, "end_line": 3288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 145, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3293, "end_line": 3398, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3402, "end_line": 3419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3423, "end_line": 3538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3545, "end_line": 3548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 55, "parameters": [ "self" ], "start_line": 3551, "end_line": 3561, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3634, "end_line": 3637, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3641, "end_line": 3675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3679, "end_line": 3682, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3685, "end_line": 3718, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3722, "end_line": 3729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3732, "end_line": 3740, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3744, "end_line": 3758, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3761, "end_line": 3805, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3809, "end_line": 3812, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3815, "end_line": 3822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3826, "end_line": 3833, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3836, "end_line": 3856, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3859, "end_line": 3881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3884, "end_line": 3887, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3891, "end_line": 3894, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3906, "end_line": 3964, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3969, "end_line": 3979, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3983, "end_line": 4008, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4012, "end_line": 4044, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4047, "end_line": 4082, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4085, "end_line": 4122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4125, "end_line": 4128, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4131, "end_line": 4185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4364, "end_line": 4389, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4392, "end_line": 4414, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4421, "end_line": 4447, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4450, "end_line": 4470, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4473, "end_line": 4614, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4617, "end_line": 4640, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4644, "end_line": 4667, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4671, "end_line": 4728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4732, "end_line": 4739, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4745, "end_line": 4835, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4841, "end_line": 4852, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4855, "end_line": 4890, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4897, "end_line": 4943, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 80, "complexity": 26, "token_count": 522, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4946, "end_line": 5040, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5044, "end_line": 5149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 83, "complexity": 18, "token_count": 543, "parameters": [ "input", "intype", "flags" ], "start_line": 5152, "end_line": 5247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5250, "end_line": 5271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5275, "end_line": 5337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5340, "end_line": 5345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5348, "end_line": 5354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5408, "end_line": 5438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 82, "parameters": [ "op" ], "start_line": 5448, "end_line": 5464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5470, "end_line": 5476, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5479, "end_line": 5486, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5489, "end_line": 5496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 99, "complexity": 43, "token_count": 578, "parameters": [ "fromtype", "totype" ], "start_line": 5502, "end_line": 5603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 102, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5606, "end_line": 5630, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5640, "end_line": 5677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5682, "end_line": 5692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5695, "end_line": 5700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5703, "end_line": 5708, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5712, "end_line": 5715, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5719, "end_line": 5767, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5770, "end_line": 5823, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5827, "end_line": 5946, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5950, "end_line": 5982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5985, "end_line": 6027, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6031, "end_line": 6153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6166, "end_line": 6208, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6213, "end_line": 6217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6282, "end_line": 6343, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6351, "end_line": 6366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6372, "end_line": 6441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6445, "end_line": 6481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6487, "end_line": 6531, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6549, "end_line": 6685, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6691, "end_line": 6760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6763, "end_line": 6896, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6902, "end_line": 6932, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_next", "long_name": "arraymapiter_next( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 12, "complexity": 4, "token_count": 70, "parameters": [ "mit" ], "start_line": 6938, "end_line": 6949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 6952, "end_line": 6961, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 6964, "end_line": 6982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "self" ], "start_line": 3551, "end_line": 3561, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2340, "end_line": 2355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 } ], "nloc": 5531, "complexity": 1215, "token_count": 33085, "diff_parsed": { "added": [ " divp = array_floor_divide(op1, op2);", " return PyObject_CallMethod(module, \"flagsobj\", \"Oii\",", " self, self->flags, 0);" ], "deleted": [ " divp = array_divide(op1, op2);", " return PyObject_CallMethod(module, \"flagsobj\", \"Oi\",", " self, self->flags);" ] } }, { "old_path": "scipy/base/src/multiarraymodule.c", "new_path": "scipy/base/src/multiarraymodule.c", "filename": "multiarraymodule.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -3727,7 +3727,6 @@ array_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n \treturn retobj;\n }\n \n-\n static struct PyMethodDef array_module_methods[] = {\n \t{\"set_string_function\", (PyCFunction)array_set_string_function, \n \t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n", "added_lines": 0, "deleted_lines": 1, "source_code": "\n/*\n Python Multiarray Module -- A useful collection of functions for creating and\n using ndarrays\n\n Original file \n Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\n Modified for scipy_core in 2005 \n\n Travis E. Oliphant\n Assistant Professor at\n Brigham Young University\n \n*/\n\n/* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */\n\n#include \"Python.h\"\n#include \"structmember.h\"\n/*#include \n#include \n*/\n\n#define _MULTIARRAYMODULE\n#include \"scipy/arrayobject.h\"\n\n#define PyAO PyArrayObject\n\nstatic PyObject *typeDict=NULL; /* Must be explicitly loaded */\n\n/* Including this file is the only way I know how to declare functions\n static in each file, and store the pointers from functions in both\n arrayobject.c and multiarraymodule.c for the C-API \n\n Declarying an external pointer-containing variable in arrayobject.c\n and trying to copy it to PyArray_API, did not work.\n\n Think about two modules with a common api that import each other...\n\n This file would just be the module calls. \n*/\n\n#include \"arrayobject.c\"\n\n\n/* An Error object -- rarely used? */\nstatic PyObject *MultiArrayError;\n\nstatic int\nPyArray_MultiplyIntList(register int *l1, register int n) \n{\n\tregister int s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\nstatic intp \nPyArray_MultiplyList(register intp *l1, register int n) \n{\n\tregister intp s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\n\nstatic int \nPyArray_AxisConverter(PyObject *obj, int *axis)\n{\n\tif (obj == Py_None) {\n\t\t*axis = MAX_DIMS;\n\t}\n\telse {\n\t\t*axis = (int) PyInt_AsLong(obj);\n\t\tif (PyErr_Occurred()) {\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n\treturn PY_SUCCEED;\n}\n\nstatic int \nPyArray_CompareLists(intp *l1, intp *l2, int n) \n{\n int i;\n for(i=0;itype_num;\n\t}\n\n\tnew = PyArray_New(self->ob_type,\n\t\t\t self->nd, self->dimensions,\n\t\t\t self->descr->type_num,\n\t\t\t self->strides,\n\t\t\t self->data,\n\t\t\t self->itemsize,\n\t\t\t self->flags, (PyObject *)self);\n\n\tif (new==NULL) return NULL;\n\t\n Py_INCREF(self);\n PyArray_BASE(new) = (PyObject *)self;\n if ((type_num != PyArray_NOTYPE) && \\\n (type_num != self->descr->type_num)) {\n if (!PyTypeNum_ISFLEXIBLE(type_num)) {\n v = PyArray_TypeObjectFromType(type_num);\n }\n else {\n PyArray_Descr *descr;\n int itemsize = type->itemsize;\n descr = PyArray_DescrFromType(type_num);\n if (type_num == PyArray_UNICODE) \n itemsize /= sizeof(Py_UNICODE);\n /* construct a string representation */\n v = PyString_FromFormat(\"%c%d\", descr->type, \n itemsize);\n }\n if (v == NULL) goto fail;\n /* set attribute new.dtype = newtype */\n if (PyObject_SetAttrString(new, \"dtype\", v) < 0) goto fail;\n Py_DECREF(v);\n }\n\treturn new;\t\n\n fail:\n Py_XDECREF(v);\n Py_XDECREF(new);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Ravel(PyArrayObject *a, int fortran)\n{\n\tPyArray_Dims newdim = {NULL,1};\n\tintp val[1] = {-1};\n\n if (a->nd == 1) {\n Py_INCREF(a);\n return (PyObject *)a;\n }\n\tnewdim.ptr = val;\n\tif (!fortran && PyArray_ISCONTIGUOUS(a)) \n\t\treturn PyArray_Newshape(a, &newdim);\n\telse\n\t return PyArray_Flatten(a, fortran);\n}\n\nstatic PyObject *\nPyArray_Flatten(PyArrayObject *a, int fortran)\n{\n\tPyObject *ret, *new;\n\tintp size;\n\n\tsize = PyArray_SIZE(a);\n\tret = PyArray_New(a->ob_type,\n\t\t\t 1, &size,\n\t\t\t a->descr->type_num,\n\t\t\t NULL,\n NULL,\n\t\t\t a->itemsize,\n\t\t\t 0, (PyObject *)a);\n\n\tif (ret== NULL) return NULL;\n\tif (fortran) {\n\t\tnew = PyArray_Transpose(a, NULL);\n\t\tif (new == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tPy_INCREF(a);\n\t\tnew = (PyObject *)a;\n\t}\n\tif (PyArray_CopyInto((PyArrayObject *)ret, (PyArrayObject *)new) < 0) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(new);\n\t\treturn NULL;\n\t}\n\tPy_DECREF(new);\n\treturn ret;\n}\n\n\n/* For back-ward compatability *\n\n/ * Not recommended */\n\nstatic PyObject *\nPyArray_Reshape(PyArrayObject *self, PyObject *shape) \n{\n PyObject *ret;\n PyArray_Dims newdims;\n\n if (!PyArray_IntpConverter(shape, &newdims)) return NULL;\n ret = PyArray_Newshape(self, &newdims);\n PyDimMem_FREE(newdims.ptr);\n return ret;\n}\n\n/* Returns a new array \n with the a new shape from the data\n in the old array\n*/\n\nstatic PyObject * \nPyArray_Newshape(PyArrayObject *self, PyArray_Dims *newdims)\n{\n intp i, s_original, i_unknown, s_known;\n intp *dimensions = newdims->ptr;\n PyArrayObject *ret;\n\tchar msg[] = \"total size of new array must be unchanged\";\n\tint n = newdims->len;\n Bool same;\n\n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n same = TRUE;\n i=0;\n while(same && i= 0) {\n if ((s_known == 0) || (s_original % s_known != 0)) {\n PyErr_SetString(PyExc_ValueError, msg);\n goto fail;\n }\n dimensions[i_unknown] = s_original/s_known;\n } else {\n if (s_original != s_known) {\n PyErr_SetString(PyExc_ValueError, msg);\n goto fail;\n }\n }\n \n\tret = (PyAO *)PyArray_New(self->ob_type,\n\t\t\t\t n, dimensions,\n\t\t\t\t self->descr->type_num,\n\t\t\t\t NULL,\n\t\t\t\t self->data,\n\t\t\t\t self->itemsize,\n\t\t\t\t self->flags, (PyObject *)self);\n\n\tif (ret== NULL)\n goto fail;\n\t\n Py_INCREF(self);\n ret->base = (PyObject *)self;\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n return (PyObject *)ret;\n\t\n fail:\n return NULL;\n}\n\n/* return a new view of the array object with all of its unit-length \n dimensions squeezed out if needed, otherwise\n return the same array.\n */\n\nstatic PyObject *\nPyArray_Squeeze(PyArrayObject *self)\n{\n\tint nd = self->nd;\n\tint newnd = nd;\n\tintp dimensions[MAX_DIMS];\n\tintp strides[MAX_DIMS];\n\tint i,j;\n\tPyObject *ret;\n\n\tif (nd == 0) {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\tfor (j=0, i=0; idimensions[i] == 1) {\n\t\t\tnewnd -= 1;\n\t\t}\n\t\telse {\n\t\t\tdimensions[j] = self->dimensions[i];\n\t\t\tstrides[j++] = self->strides[i];\n\t\t}\n\t}\n\t\n\tret = PyArray_New(self->ob_type, newnd, dimensions, \n\t\t\t self->descr->type_num, strides,\n\t\t\t self->data, self->itemsize, self->flags,\n\t\t\t (PyObject *)self);\n\tself->flags &= ~OWN_DATA;\n\tself->base = (PyObject *)self;\n\tPy_INCREF(self);\n\treturn (PyObject *)ret;\n}\n\n\nstatic PyObject *\nPyArray_Mean(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL;\n\tPyObject *new, *ret;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\n\tobj1 = PyArray_GenericReduceFunction((PyAO *)new, n_ops.add, axis,\n\t\t\t\t\t rtype);\n\tobj2 = PyFloat_FromDouble((double) PyArray_DIM(new,axis));\n Py_DECREF(new);\n\tif (obj1 == NULL || obj2 == NULL) {\n\t\tPy_XDECREF(obj1);\n\t\tPy_XDECREF(obj2);\n\t\treturn NULL;\n\t}\n\n\tret = PyNumber_Divide(obj1, obj2);\n\tPy_DECREF(obj1);\n\tPy_DECREF(obj2);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Std(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL, *new=NULL;\n\tPyObject *ret=NULL, *newshape=NULL;\n\tint i, n;\n\tintp val;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\t\n\t/* Compute and reshape mean */\n\tobj1 = PyArray_EnsureArray(PyArray_Mean((PyAO *)new, axis, rtype));\n\tif (obj1 == NULL) {Py_DECREF(new); return NULL;} \n\tn = PyArray_NDIM(new);\n\tnewshape = PyTuple_New(n);\n\tif (newshape == NULL) {Py_DECREF(obj1); Py_DECREF(new); return NULL;}\n\tfor (i=0; ind != 1) {\n Py_DECREF(cond);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Condition must be 1-d array.\");\n return NULL;\n }\n\n res = PyArray_Nonzero(cond);\n Py_DECREF(cond);\n\tret = PyArray_Take(self, res, axis);\n\tPy_DECREF(res);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Nonzero(PyArrayObject *self)\n{\n int n=self->nd, j;\n\tintp count=0, i, size;\n\tPyArrayIterObject *it=NULL;\n\tPyObject *ret=NULL, *item;\n\tintp *dptr[MAX_DIMS];\n\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (it==NULL) return NULL;\n\n\tsize = it->size;\n\tfor (i=0; idescr->nonzero(it->dataptr, self)) count++;\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\n\tPyArray_ITER_RESET(it);\n\tif (n==1) {\n\t\tret = PyArray_New(self->ob_type, 1, &count, PyArray_INTP, \n\t\t\t\t NULL, NULL, 0, 0, (PyObject *)self);\n\t\tif (ret == NULL) goto fail;\n\t\tdptr[0] = (intp *)PyArray_DATA(ret);\n\t\t\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\t*(dptr[0])++ = i;\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t}\n\telse {\n\t\tret = PyTuple_New(n);\n\t\tfor (j=0; job_type, 1, &count, \n\t\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0,\n\t\t\t\t\t (PyObject *)self);\n\t\t\tPyTuple_SET_ITEM(ret, j, item);\n\t\t\tif (item == NULL) goto fail;\n\t\t\tdptr[j] = (intp *)PyArray_DATA(item);\n\t\t}\n\t\t\n\t\t/* reset contiguous so that coordinates gets updated */\n\t\tit->contiguous = 0;\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\tfor (j=0; jcoordinates[j];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\n\t}\n\n\treturn ret;\n\n fail:\n\tPy_XDECREF(ret);\n\tPy_XDECREF(it);\n\treturn NULL;\n \n}\n\nstatic PyObject *\nPyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max)\n{\n\tPyObject *selector=NULL, *newtup=NULL, *ret=NULL;\n\tPyObject *res1=NULL, *res2=NULL, *res3=NULL;\n\tPyObject *two;\n\n\ttwo = PyInt_FromLong((long)2);\n\tres1 = PyArray_GenericBinaryFunction(self, max, n_ops.greater);\n\tres2 = PyArray_GenericBinaryFunction(self, min, n_ops.less);\n\tif ((res1 == NULL) || (res2 == NULL)) goto fail;\n\tres3 = PyNumber_Multiply(two, res1);\n\tPy_DECREF(two);\n\tPy_DECREF(res1);\n\tif (res3 == NULL) return NULL;\n\n\tselector = PyArray_EnsureArray(PyNumber_Add(res2, res3));\n\tPy_DECREF(res2);\n\tPy_DECREF(res3);\n\tif (selector == NULL) return NULL;\n\n\tnewtup = Py_BuildValue(\"(OOO)\", (PyObject *)self, min, max);\n\tif (newtup == NULL) goto fail;\n\tret = PyArray_Choose((PyAO *)selector, newtup);\n\tPy_DECREF(selector);\n\tPy_DECREF(newtup);\n\treturn ret;\n\n fail:\n\tPy_XDECREF(res1);\n\tPy_XDECREF(res2);\n\tPy_XDECREF(two);\n\tPy_XDECREF(selector);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Conjugate(PyArrayObject *self)\n{\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyObject *new;\n\t\tintp size, i;\n\t\t/* Make a copy */\n\t\tnew = PyArray_Copy(self);\n\t\tif (new==NULL) return NULL;\n\t\tsize = PyArray_SIZE(new);\n\t\tif (self->descr->type_num == PyArray_CFLOAT) {\n\t\t\tcfloat *dptr = (cfloat *) PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CDOUBLE) {\n\t\t\tcdouble *dptr = (cdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CLONGDOUBLE) {\n\t\t\tclongdouble *dptr = (clongdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t\treturn new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *) self;\n\t}\n}\n\nstatic PyObject *\nPyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, \nint rtype)\n{\n\tPyObject *diag=NULL, *ret=NULL;\n\n\tdiag = PyArray_Diagonal(self, offset, axis1, axis2);\n\tif (diag == NULL) return NULL;\n\tret = PyArray_GenericReduceFunction((PyAO *)diag, n_ops.add, -1, rtype);\n\tPy_DECREF(diag);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Diagonal(PyArrayObject *self, int offset, int axis1, int axis2)\n{\n\tint n = self->nd;\n\tPyObject *new;\n\tPyObject *newaxes;\n\tint i, pos;\t\n\n\tif (n < 2) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"array.ndim must be >= 2\");\n\t\treturn NULL;\n\t}\n\tif (axis1 < 0) axis1 += n;\n\tif (axis2 < 0) axis2 += n;\n\tif ((axis1 == axis2) || (axis1 < 0) || (axis1 >= n) ||\t\\\n\t (axis2 < 0) || (axis2 >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \"axis1(=%d) and axis2(=%d) \"\\\n\t\t\t \"must be different and within range (nd=%d)\",\n\t\t\t axis1, axis2, n);\n\t\treturn NULL;\n\t}\n \n\tnewaxes = PyTuple_New(n);\n\tif (newaxes==NULL) return NULL;\n\t/* insert at the end */\n\tPyTuple_SET_ITEM(newaxes, n-2, PyInt_FromLong((long)axis1));\n\tPyTuple_SET_ITEM(newaxes, n-1, PyInt_FromLong((long)axis2));\n\tpos = 0;\n\tfor (i=0; idimensions[0];\n\t\tn2 = self->dimensions[1];\n\t\tstep = n2+1;\n\t\tif (offset < 0) {\n\t\t\tstart = -n2 * offset;\n\t\t\tstop = MIN(n2, n1+offset)*(n2+1) - n2*offset;\n\t\t}\n\t\telse {\n\t\t\tstart = offset;\n\t\t\tstop = MIN(n1, n2-offset)*(n2+1) + offset;\n\t\t}\n\t\t\n\t\t/* count = ceil((stop-start)/step) */\n\t\tcount = ((stop-start) / step) + (((stop-start) % step) != 0);\n\t\t\t\n\t\tindices = PyArray_New(&PyArray_Type, 1, &count, \n\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0, NULL);\n\t\tif (indices == NULL) {\n\t\t\tPy_DECREF(self); return NULL;\n\t\t}\n\t\tdptr = (intp *)PyArray_DATA(indices);\n\t\tfor (n1=start; n1descr->type_num;\n\t\ttypecode.itemsize = self->itemsize;\n\t\ttypecode.fortran = 0;\n\n\t\tmydiagonal = PyList_New(0);\n\t\tif (mydiagonal == NULL) {Py_DECREF(self); return NULL;}\n\t\tn1 = self->dimensions[0];\n\t\tfor (i=0; i 3)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"Only Carrays of 1-3 dimensions available.\");\n\t\treturn -1;\n\t}\n\tif ((ap = (PyArrayObject*)PyArray_FromAny(*op, &typecode, nd, nd,\n\t\t\t\t\t\t CARRAY_FLAGS)) == NULL)\n\t\treturn -1;\n\tswitch(nd) {\n\tcase 1:\n\t\t*((char **)ptr) = ap->data;\n\t\tbreak;\n\tcase 2:\n\t\tn = ap->dimensions[0];\n\t\tptr2 = (char **)malloc(n * sizeof(char *));\n\t\tif (!ptr2) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0];\n\t\t}\n\t\t*((char ***)ptr) = ptr2;\n\t\tbreak;\t\t\n\tcase 3:\n\t\tn = ap->dimensions[0];\n\t\tm = ap->dimensions[1];\n\t\tptr3 = (char ***)malloc(n*(m+1) * sizeof(char *));\n\t\tif (!ptr3) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0] + \\\n\t\t\t\t\tj*ap->strides[1];\n\t\t\t}\n\t\t}\n\t\t*((char ****)ptr) = ptr3;\n\t}\n\tmemcpy(dims, ap->dimensions, nd*sizeof(intp));\n\t*op = (PyObject *)ap;\n\treturn 0;\n\n fail:\n\tPyErr_SetString(PyExc_MemoryError, \"No memory.\");\n\treturn -1;\n}\n\n/* Deprecated --- Use PyArray_AsCArray instead */\n\nstatic int \nPyArray_As1D(PyObject **op, char **ptr, int *d1, int typecode) \n{\n\tintp newd1;\n\t\n\tif (PyArray_AsCArray(op, (void *)ptr, &newd1, 1, typecode) == -1)\n\t\treturn -1;\t\n\t*d1 = (int) newd1;\n\treturn 0;\n}\n\n\nstatic int \nPyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) \n{\n\tintp newdims[2];\n\n\tif (PyArray_AsCArray(op, (void *)ptr, newdims, 2, typecode) == -1)\n\t\treturn -1;\n\n\t*d1 = (int ) newdims[0];\n\t*d2 = (int ) newdims[1];\n return 0;\n}\n\n/* End Deprecated */\n\nstatic int \nPyArray_Free(PyObject *op, void *ptr) \n{\n PyArrayObject *ap = (PyArrayObject *)op;\n\t\n if ((ap->nd < 1) || (ap->nd > 3)) \n\t\treturn -1;\n if (ap->nd >= 2) {\n\t\tfree(ptr);\n }\n Py_DECREF(ap);\n return 0;\n}\n\n\nstatic PyObject *\n_swap_and_concat(PyObject *op, int axis, int n)\n{\n\tPyObject *newtup=NULL;\n\tPyObject *otmp, *arr;\n\tint i;\n\n\tnewtup = PyTuple_New(n);\n\tif (newtup==NULL) return NULL;\n\tfor (i=0; i= MAX_DIMS) {\n\t\t\totmp = PyArray_Ravel(mps[i],0);\n\t\t\tPy_DECREF(mps[i]);\n\t\t\tmps[i] = (PyArrayObject *)otmp;\n\t\t}\n\t\tprior2 = PyArray_GetPriority((PyObject *)(mps[i]), 0.0);\n\t\tif (prior2 > prior1) {\n\t\t\tprior1 = prior2;\n\t\t\tsubtype = mps[i]->ob_type;\n\t\t\tret = mps[i];\n\t\t}\n\t}\n\t\n\tnew_dim = 0;\n\tfor(i=0; ind;\n\t\telse {\n\t\t\tif (nd != mps[i]->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"arrays must have same \"\\\n\t\t\t\t\t\t\"number of dimensions\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (!PyArray_CompareLists(mps[0]->dimensions+1, \n\t\t\t\t\t\t mps[i]->dimensions+1, \n\t\t\t\t\t\t nd-1)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"array dimensions must \"\\\n\t\t\t\t\t\t\"agree except for d_0\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t\tif (nd == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"0d arrays can't be concatenated\");\n\t\t\tgoto fail;\n\t\t}\n\t\tnew_dim += mps[i]->dimensions[0];\n\t}\n\t\n\ttmp = mps[0]->dimensions[0];\n\tmps[0]->dimensions[0] = new_dim;\n\tret = (PyArrayObject *)PyArray_New(subtype, nd,\n\t\t\t\t\t mps[0]->dimensions, \n\t\t\t\t\t type_num, NULL, NULL, 0, 0,\n (PyObject *)ret);\n\tmps[0]->dimensions[0] = tmp;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tdata = ret->data;\n\tfor(i=0; idata, numbytes);\n\t\tdata += numbytes;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; ind;\n\tif (n <= 1) {\n\t\tPy_INCREF(ap);\n\t\treturn (PyObject *)ap;\n\t}\n\n\tif (a1 < 0) a1 += n;\n\tif (a2 < 0) a2 += n;\n\tif ((a1 < 0) || (a1 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis1 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tif ((a2 < 0) || (a2 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis2 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tnew_axes = PyTuple_New(n);\n\tfor (i=0; ind;\n\t\tpermutation = (intp *)malloc(n*sizeof(int));\n\t\tfor(i=0; ind+axis;\n\t\t\tif (axis < 0 || axis >= ap->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"invalid axis for this array\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tpermutation[i] = axis;\n\t\t}\n\t}\n\t\n\t/* this allocates memory for dimensions and strides (but fills them\n\t incorrectly), sets up descr, and points data at ap->data. */\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, n, permutation, \n\t\t\t\t\t ap->descr->type_num, NULL,\n\t\t\t\t\t ap->data, ap->itemsize, ap->flags,\n\t\t\t\t\t (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\t/* point at true owner of memory: */\n\tret->base = (PyObject *)ap;\n\tPy_INCREF(ap);\n\t\n\tfor(i=0; idimensions[i] = ap->dimensions[permutation[i]];\n\t\tret->strides[i] = ap->strides[permutation[i]];\n\t}\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n\tif (op && (op != Py_None))\n\t\tPyArray_Free(op, (char *)axes);\n\tfree(permutation);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ret);\n\tif (permutation != NULL) free(permutation);\n\tif (op != Py_None)\n\t\tPyArray_Free(op, (char *)axes);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis) {\n\tintp *counts;\n\tintp n, n_outer, i, j, k, chunk, total;\n\tintp tmp;\n\tint nd;\n\tPyArrayObject *repeats=NULL;\n\tPyObject *ap=NULL;\n\tPyArrayObject *ret=NULL;\n\tchar *new_data, *old_data;\n\n\trepeats = (PyAO *)PyArray_ContiguousFromObject(op, PyArray_INTP, 0, 1);\n\tif (repeats == NULL) return NULL;\n\tnd = repeats->nd;\n\tcounts = (intp *)repeats->data;\n\n\tif ((ap=_check_axis(aop, &axis, CARRAY_FLAGS))==NULL) {\n\t\tPy_DECREF(repeats);\n\t\treturn NULL;\n\t}\n\n\taop = (PyAO *)ap;\n\n\tif (nd == 1)\n\t\tn = repeats->dimensions[0];\n\telse /* nd == 0 */\n\t\tn = aop->dimensions[axis];\n\n\tif (aop->dimensions[axis] != n) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"a.shape[axis] != len(repeats)\");\n\t\tgoto fail;\n\t}\n\n\t\n\tif (nd == 0) \n\t\ttotal = counts[0]*n;\n\telse {\n\t\t\n\t\ttotal = 0;\n\t\tfor(j=0; jdimensions[axis] = total;\n\tret = (PyArrayObject *)PyArray_New(aop->ob_type, aop->nd,\n\t\t\t\t\t aop->dimensions, \n\t\t\t\t\t aop->descr->type_num,\n\t\t\t\t\t NULL, NULL, aop->itemsize, 0,\n\t\t\t\t\t (PyObject *)aop);\n\taop->dimensions[axis] = n;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tnew_data = ret->data;\n\told_data = aop->data;\n\t\n\tchunk = aop->itemsize;\n\tfor(i=axis+1; ind; i++) {\n\t\tchunk *= aop->dimensions[i];\n\t}\n\t\n\tn_outer = 1;\n\tfor(i=0; idimensions[i];\n\n\tfor(i=0; ind < mps[i]->nd) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"too many dimensions\");\n\t\t\tgoto fail;\n\t\t}\n\t\tif (!PyArray_CompareLists(ap->dimensions+(ap->nd-mps[i]->nd),\n\t\t\t\t mps[i]->dimensions, mps[i]->nd)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"array dimensions must agree\");\n\t\t\tgoto fail;\n\t\t}\n\t\tsizes[i] = PyArray_NBYTES(mps[i]);\n\t}\n\t\n\t/* why not ??? \n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tPyErr_SetString(PyExc_NotImplementedError, \n\t\t\t\t\"Not implemented for flexible sizes\");\n\t\treturn NULL;\n\t}\n\t*/\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\telsize = ret->itemsize;\n\tm = PyArray_SIZE(ret);\n\tself_data = (intp *)ap->data;\n\tret_data = ret->data;\n\t\n\tfor (i=0; i= n) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"invalid entry in choice array\");\n\t\t\tgoto fail;\n\t\t}\n\t\toffset = i*elsize;\n\t\tif (offset >= sizes[mi]) {offset = offset % sizes[mi]; }\n\t\tmemmove(ret_data, mps[mi]->data+offset, elsize);\n\t\tret_data += elsize; self_data++;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; idescr->compare(a,b,global_obj);\n}\n\n#define SWAPAXES(op, ap) {\t\t\t\t\t\t\\\n\t\torign = (ap)->nd-1;\t\t\t\t\t\\\n\t\tif (axis != orign) {\t\t\t\t\t\\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\n#define SWAPBACK(op, ap) { \\\n\t\tif (axis != orign) { \\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\nstatic PyObject *\nPyArray_Sort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap=NULL, *store_arr=NULL;\n\tchar *ip;\n\tint i, n, m, elsize, orign;\n\n\tif ((ap = (PyAO*) _check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_CopyFromObject((PyObject *)op, \n\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tPy_DECREF(ap);\n\t\treturn NULL;\n\t}\n\t\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\n\t/* Store global -- allows re-entry -- restore before leaving*/\n\tstore_arr = global_obj; \n\tglobal_obj = ap;\n\t\n\tfor (ip=ap->data, i=0; iitemsize;\n\tconst intp *ipa = ip1;\n\tconst intp *ipb = ip2;\t\n\treturn global_obj->descr->compare(global_data + (isize * *ipa),\n global_data + (isize * *ipb), \n\t\t\t\t\t global_obj);\n}\n\nstatic PyObject *\nPyArray_ArgSort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap, *ret, *store;\n\tintp *ip;\n\tintp i, j, n, m, orign;\n\tint argsort_elsize;\n\tchar *store_ptr;\n\n\tif ((ap = (PyAO *)_check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)op, \n\t\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tip = (intp *)ret->data;\n\targsort_elsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\tstore_ptr = global_data;\n\tglobal_data = ap->data;\n\tstore = global_obj;\n\tglobal_obj = ap;\n\tfor (i=0; idescr->compare;\n\tintp min_i, max_i, i, j;\n\tint location, elsize = ap1->itemsize;\n\tintp elements = ap1->dimensions[ap1->nd-1];\n\tintp n = PyArray_Size((PyObject *)ap2);\n\tintp *rp = (intp *)ret->data;\n\tchar *ip = ap2->data;\n\tchar *vp = ap1->data;\n\n\tfor (j=0; j 0) {\n\t\t\t\t\tif (compare(ip, vp+elsize*(--i), ap2) \\\n\t\t\t\t\t != 0) {\n\t\t\t\t\t\ti = i+1; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmin_i = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (location < 0) {\n\t\t\t\tmax_i = i;\n\t\t\t} else {\n\t\t\t\tmin_i = i+1;\n\t\t\t}\n\t\t}\n\t\t*rp = min_i;\n\t}\n}\n\nstatic PyObject *\nPyArray_SearchSorted(PyArrayObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tint typenum = 0;\n\n\t/* \n PyObject *args;\n args = Py_BuildValue(\"O\",op2);\n\tPy_DELEGATE_ARGS(((PyObject *)op1), searchsorted, args);\n Py_XDECREF(args);\n\t*/\n\n\ttypenum = PyArray_ObjectType((PyObject *)op1, 0);\n\ttypenum = PyArray_ObjectType(op2, typenum);\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)op1, \n\t\t\t\t\t\t\t typenum, \n\t\t\t\t\t\t\t 1, 1);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap2->ob_type, ap2->nd, \n\t\t\t\t\t ap2->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap2);\n\tif (ret == NULL) goto fail;\n\n\tif (ap2->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tlocal_where(ap1, ap2, ret); \n\t\n\tPy_DECREF(ap1);\n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ap1);\n\tPy_XDECREF(ap2);\n\tPy_XDECREF(ret);\n\treturn NULL;\n}\n\n\n\n/* Could perhaps be redone to not make contiguous arrays \n */\n\nstatic PyObject *\nPyArray_InnerProduct(PyObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tintp i, j, l, i1, i2, n1, n2;\n\tint typenum;\n\tintp is1, is2, os;\n\tchar *ip1, *ip2, *op;\n\tintp dimensions[MAX_DIMS], nd;\n\tPyArray_DotFunc *dot;\n\tPyTypeObject *subtype;\n double prior1, prior2;\n\t\n\ttypenum = PyArray_ObjectType(op1, 0); \n\ttypenum = PyArray_ObjectType(op2, typenum);\n\t\t\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tif (ap1->nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\n\n\t/* Need to choose an output array that can hold a sum \n\t -- use priority to determine which subtype.\n\t */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = (ret->descr->dotfunc);\n\t\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\n\t\n\tis1 = ap1->strides[ap1->nd-1]; \n\tis2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\tif (ap2->nd > 1) {\n\t\tmatchDim = ap2->nd - 2;\n\t\totherDim = ap2->nd - 1;\n\t}\n\telse {\n\t\tmatchDim = 0;\n\t\totherDim = 0;\n\t}\n\n\tif (ap2->dimensions[matchDim] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"objects are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-2; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\tif(ap2->nd > 1) {\n\t\tdimensions[j++] = ap2->dimensions[ap2->nd-1];\n\t}\n\t/*\n\tfprintf(stderr, \"nd=%d dimensions=\", nd);\n\t for(i=0; i prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\t\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[matchDim];\n\tif(ap1->nd > 1)\n\t\tis1r = ap1->strides[ap1->nd-2];\n\telse\n\t\tis1r = ap1->strides[ap1->nd-1];\n\tis2r = ap2->strides[otherDim];\n\n\top = ret->data; os = ret->itemsize;\n\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2ob_type, 2, dims, PyArray_TYPE(arr),\n\t\t\t NULL, NULL, elsize, 0, arr);\n\n\tif (ret == NULL) {\n\t\tPy_DECREF(arr);\n\t\treturn NULL;\n\t}\n\t/* do 2-d loop */\n\toptr = PyArray_DATA(ret);\n\tstr2 = elsize*dims[0];\n\tfor (i=0; idimensions[ap1->nd-1];\n\tn2 = ap2->dimensions[ap2->nd-1];\n\n\tif (n1 < n2) { \n\t\tret = ap1; ap1 = ap2; ap2 = ret; \n\t\tret = NULL; i = n1;n1=n2;n2=i;\n\t}\n\tlength = n1;\n\tn = n2;\n\tswitch(mode) {\n\tcase 0:\t\n\t\tlength = length-n+1;\n\t\tn_left = n_right = 0;\n\t\tbreak;\n\tcase 1:\n\t\tn_left = (int)(n/2);\n\t\tn_right = n-n_left-1;\n\t\tbreak;\n\tcase 2:\n\t\tn_right = n-1;\n\t\tn_left = n-1;\n\t\tlength = length+n-1;\n\t\tbreak;\n\tdefault:\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"mode must be 0,1, or 2\");\n\t\tgoto fail;\n\t}\n\t\n\tret = (PyArrayObject *)PyArray_New(ap1->ob_type, 1,\n\t\t\t\t\t &length, typenum, \n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap1);\n\tif (ret == NULL) goto fail;\n\n\t\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"function not available for this type\");\n\t\tgoto fail;\n\t}\n\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data; ip2 = ap2->data+n_left*is2;\n\tn = n-n_left;\n\tfor(i=0; idescr->argmax;\n\tif (arg_func == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"data type not ordered\");\n\t\tgoto fail;\n\t}\n\n\trp = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd-1,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap);\n\tif (rp == NULL) goto fail;\n\n\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) {\n\t\tPyErr_SetString(MultiArrayError, \n\t\t\t\t\"Attempt to get argmax/argmin \"\\\n\t\t\t\t\"of an empty sequence??\");\n\t\tgoto fail;\n\t}\n\tn = PyArray_SIZE(ap)/m;\n\trptr = (intp *)rp->data;\n\tfor (ip = ap->data, i=0; ind + indices->nd - 1;\n for (i=0; i< nd; i++) {\n if (i < axis) {\n shape[i] = self->dimensions[i];\n n *= shape[i];\n } else {\n if (i < axis+indices->nd) {\n shape[i] = indices->dimensions[i-axis];\n m *= shape[i];\n } else {\n shape[i] = self->dimensions[i-indices->nd+1];\n chunk *= shape[i];\n }\n }\n }\n ret = (PyArrayObject *)PyArray_New(self->ob_type, nd, shape, \n\t\t\t\t\t self->descr->type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)self);\n\t\n if (ret == NULL) goto fail;\n\t\n max_item = self->dimensions[axis];\n chunk = chunk * ret->itemsize;\n src = self->data;\n dest = ret->data;\n\t\n for(i=0; idata))[j];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"Index out of range for \"\\\n\t\t\t\t\t\t\"array\");\n goto fail;\n }\n memmove(dest, src+tmp*chunk, chunk);\n dest += chunk;\n }\n src += chunk*max_item;\n }\n\t\n PyArray_INCREF(ret);\n\n Py_XDECREF(indices);\n Py_XDECREF(self);\n\n return (PyObject *)ret;\n\t\n\t\n fail:\n Py_XDECREF(ret);\n Py_XDECREF(indices);\n Py_XDECREF(self);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Put(PyArrayObject *self, PyObject *indices0, PyObject* values0) \n{\n PyArrayObject *indices, *values;\n int i, chunk, ni, max_item, nv, tmp; \n char *src, *dest;\n\n indices = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be contiguous\");\n return NULL;\n }\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n indices = (PyArrayObject *)PyArray_ContiguousFromObject(indices0, PyArray_INTP, 0, 0);\n if (indices == NULL) goto fail;\n ni = PyArray_SIZE(indices);\n\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromObject(values0, self->descr->type_num, \n\t\t\t\t\t 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\n if (nv > 0) { /* nv == 0 for a null array */\n for(i=0; idata + chunk * (i % nv);\n tmp = ((intp *)(indices->data))[i];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \"Index out of range for array\");\n goto fail;\n }\n memmove(dest + tmp * chunk, src, chunk);\n }\n }\n\n Py_XDECREF(values);\n Py_XDECREF(indices);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(indices);\n Py_XDECREF(values);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_PutMask(PyArrayObject *self, PyObject *mask0, PyObject* values0) \n{\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv, tmp, thistype;\n char *src, *dest;\n\n mask = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must \"\\\n\t\t\t\t\"be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must be contiguous\");\n return NULL;\n }\n\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n mask = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromObject(mask0, PyArray_BOOL, 0, 0);\n if (mask == NULL) goto fail;\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: mask and data must be \"\\\n\t\t\t\t\"the same size.\");\n goto fail;\n }\n\n\tthistype = self->descr->type_num;\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromObject(values0, thistype, 0, 0);\n\tif (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\t /* zero if null array */\n if (nv > 0) {\n\t\tfor(i=0; idata + chunk * (i % nv);\n\t\t\ttmp = ((Bool *)(mask->data))[i];\n\t\t\tif (tmp) {\n\t\t\t\tmemmove(dest + i * chunk, src, chunk);\n\t\t\t\tif (thistype == PyArray_OBJECT)\n\t\t\t\t\tPy_INCREF(*((PyObject **)src));\n\t\t\t}\n\t\t}\n }\n\n Py_XDECREF(values);\n Py_XDECREF(mask);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(mask);\n Py_XDECREF(values);\n return NULL;\n}\n\n\n/* This conversion function can be used with the \"O&\" argument for\n PyArg_ParseTuple. It will immediately return an object of array type\n or will convert to a CARRAY any other object. \n\n If you use PyArray_Converter, you must DECREF the array when finished\n as you get a new reference to it.\n*/\n \nstatic int \nPyArray_Converter(PyObject *object, PyObject **address) \n{\n if (PyArray_Check(object)) {\n *address = object;\n\t\tPy_INCREF(object);\n return PY_SUCCEED;\n }\n else {\n\t\t*address = PyArray_FromAny(object, NULL, 0, 0, CARRAY_FLAGS);\n\t\tif (*address == NULL) return PY_FAIL;\n\t\treturn PY_SUCCEED;\n }\n}\n\nstatic int\nPyArray_BoolConverter(PyObject *object, Bool *val)\n{\n\tif (PyObject_IsTrue(object)) *val=TRUE;\n\telse *val=FALSE;\n\tif (PyErr_Occurred()) return PY_FAIL;\n\treturn PY_SUCCEED;\n}\n\n\nstatic int\nPyArray_TypestrConvert(int itemsize, int gentype)\n{\n\tregister int newtype = gentype;\n\t\n\tif (gentype == PyArray_SIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_INT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_INT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_INT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_INT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_INT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\n\t}\n\n\telse if (gentype == PyArray_UNSIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_UINT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_UINT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_UINT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_UINT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_UINT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (gentype == PyArray_FLOATINGLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 4:\n\t\t\tnewtype = PyArray_FLOAT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_FLOAT64;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 10:\n\t\t\tnewtype = PyArray_FLOAT80;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 12:\n\t\t\tnewtype = PyArray_FLOAT96;\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_FLOAT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\t\n\telse if (gentype == PyArray_COMPLEXLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 8:\n\t\t\tnewtype = PyArray_COMPLEX64;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\tnewtype = PyArray_COMPLEX128;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 20:\n\t\t\tnewtype = PyArray_COMPLEX160;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 24:\n\t\t\tnewtype = PyArray_COMPLEX192;\t\t\t\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 32:\n\t\t\tnewtype = PyArray_COMPLEX256;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\n\treturn newtype;\n}\n\n\n/* this function takes a Python object which exposes the (single-segment)\n buffer interface and returns a pointer to the data segment\n \n You should increment the reference count by one of buf->base\n if you will hang on to a reference\n\n You only get a borrowed reference to the object. Do not free the\n memory...\n*/\n\n\nstatic int\nPyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf)\n{\n int buflen;\n\n buf->ptr = NULL;\n buf->flags = WRITEABLE;\n buf->base = NULL;\n\n\tif (obj == Py_None)\n\t\treturn PY_SUCCEED;\n\n if (PyObject_AsWriteBuffer(obj, &(buf->ptr), &buflen) < 0) {\n PyErr_Clear();\n buf->flags &= ~WRITEABLE;\n if (PyObject_AsReadBuffer(obj, (const void **)&(buf->ptr), \n &buflen) < 0)\n return PY_FAIL;\n }\n buf->len = (intp) buflen;\n \n /* Point to the base of the buffer object if present */\n if (PyBuffer_Check(obj)) buf->base = ((PyArray_Chunk *)obj)->base;\n if (buf->base == NULL) buf->base = obj;\n \n return PY_SUCCEED; \n}\n\n\n\n/* This function takes a Python sequence object and allocates and\n fills in an intp array with the converted values.\n\n **Remember to free the pointer seq.ptr when done using\n PyDimMem_FREE(seq.ptr)**\n*/\n\nstatic int\nPyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)\n{\n int len;\n int nd;\n\n seq->ptr = NULL;\n if (obj == Py_None) return PY_SUCCEED;\n len = PySequence_Size(obj);\n if (len == -1) { /* Check to see if it is a number */\n if (PyNumber_Check(obj)) len = 1;\n }\n if (len < 0) {\n PyErr_SetString(PyExc_TypeError, \n \"Expected sequence object with len >= 0\");\n return PY_FAIL;\n }\n if (len > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError, \"Sequence too large, \" \\\n \"must be smaller than %d\", MAX_DIMS);\n return PY_FAIL;\n }\n\tif (len > 0) {\n\t\tseq->ptr = PyDimMem_NEW(len);\n\t\tif (seq->ptr == NULL) {\n\t\t\tPyErr_NoMemory();\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n seq->len = len;\n nd = PyArray_IntpFromSequence(obj, (intp *)seq->ptr, len);\n if (nd == -1 || nd != len) goto fail;\n return PY_SUCCEED;\n\n fail:\n\tPyDimMem_FREE(seq->ptr);\n\treturn PY_FAIL;\n}\n\n/* This function takes a Python object representing a type and converts it \n to a C type_num and an itemsize (elements of PyArray_Typecode structure)\n \n Many objects can be used to represent a type.\n */\n\nstatic int\nPyArray_TypecodeConverter(PyObject *obj, PyArray_Typecode *at)\n{\n char *type;\n PyArray_Descr *descr;\n int check_num=PyArray_NOTYPE+10;\n\tint len;\n\tPyObject *item, *attr=NULL;\n\n\tat->itemsize = 0;\n if (obj == Py_None) {\n at->type_num = PyArray_NOTYPE;\n return PY_SUCCEED;\n }\n\n if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, \n &PyGenericArrType_Type)) {\n PyArray_TypecodeFromTypeObject(obj, at);\n return PY_SUCCEED;\n }\n\n\n\t/* type object could be an array */\n\tif (PyArray_Check(obj)) {\n\t\tat->type_num = PyArray_TYPE(obj);\n\t\tat->itemsize = PyArray_ITEMSIZE(obj);\n\t\treturn PY_SUCCEED;\n\t}\n\n\t/* or an array scalar */\n if (PyArray_IsScalar(obj, Generic)) {\n PyArray_TypecodeFromScalar(obj, at);\n return PY_SUCCEED;\n }\n\n\t/* or a typecode string */\n\n\tif (PyString_Check(obj)) {\n\t\t/* Check for a string typecode. */\n\t\ttype = PyString_AS_STRING(obj);\n\t\tlen = PyString_GET_SIZE(obj);\t\t\n\t\tif (len > 0) {\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tif (len > 1) {\n\t\t\tat->itemsize = atoi(type+1);\n\t\t\t/* When specifying length of UNICODE\n\t\t\t the number of characters is given to match \n\t\t\t the STRING interface. Each character can be\n\t\t\t more than one byte and itemsize must be\n\t\t\t the number of bytes.\n\t\t\t*/\n\t\t\tif (check_num == PyArray_UNICODELTR ||\t\\\n\t\t\t check_num == PyArray_UNICODE) \n\t\t\t at->itemsize *= sizeof(Py_UNICODE);\n\n\t\t\t/* Support for generic processing */\n\t\t\telse if ((check_num != PyArray_STRINGLTR) &&\n\t\t\t\t (check_num != PyArray_VOIDLTR) &&\n\t\t\t\t (check_num != PyArray_STRING) &&\n\t\t\t\t (check_num != PyArray_VOID)) {\n\t\t\t\tcheck_num = \\\n\t\t\t\t\tPyArray_TypestrConvert(at->itemsize,\n\t\t\t\t\t\t\t check_num);\n\t\t\t at->itemsize = 0;\n\t\t\t\tif (check_num == PyArray_NOTYPE) goto fail;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Arbitray object with dtypenum and itemsize attributes. */\n\telse if (PyObject_HasAttrString(obj, \"dtypenum\") && \n\t PyObject_HasAttrString(obj, \"itemsize\")) {\n\t\tattr = PyObject_GetAttrString(obj, \"dtypenum\");\n\t\tcheck_num = PyInt_AsLong(attr);\n\t\tif (PyErr_Occurred()) { /* not an integer, try character */\n\t\t\tPyErr_Clear();\n\t\t\ttype = PyString_AsString(attr);\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tPy_XDECREF(attr);\n\t\tif (!PyErr_Occurred()) {\n\t\t\tattr = PyObject_GetAttrString(obj, \"itemsize\");\n\t\t\tat->itemsize = PyInt_AsLong(attr);\n\t\t\tPy_XDECREF(attr);\n\t\t}\t\t\t\n\t}\t\t\n\telse if (PyType_Check(obj)) {\n\t\tcheck_num = PyArray_OBJECT;\n\t\tif (obj == (PyObject *)(&PyInt_Type)) \n\t\t\tcheck_num = PyArray_LONG;\n\t\telse if (obj == (PyObject *)(&PyBool_Type))\n\t\t\tcheck_num = PyArray_BOOL;\n\t\telse if (obj == (PyObject *)(&PyFloat_Type)) \n\t\t\tcheck_num = PyArray_DOUBLE;\n\t\telse if (obj == (PyObject *)(&PyComplex_Type)) \n\t\t\tcheck_num = PyArray_CDOUBLE;\n else if (obj == (PyObject *)(&PyString_Type))\n check_num = PyArray_STRING;\n else if (obj == (PyObject *)(&PyUnicode_Type))\n check_num = PyArray_UNICODE;\n\t}\t\n else { /* Default -- try integer conversion */\n check_num = PyInt_AsLong(obj);\n\t}\n\n\tif (PyErr_Occurred()) goto fail;\n\n\t/*\n\tif (check_num == PyArray_NOTYPE) return PY_FAIL;\n\t*/\n\tif (check_num == PyArray_NOTYPE) {\n\t\tat->type_num = PyArray_NOTYPE;\n\t\tat->itemsize = 0;\n\t\treturn PY_SUCCEED;\n\t}\n\n if ((descr = PyArray_DescrFromType(check_num))==NULL) {\n\t\t/* Now check to see if the object is registered\n\t\t in typeDict */\n\t\tif (typeDict != NULL) {\n\t\t\titem = PyDict_GetItem(typeDict, obj);\n\t\t\tif (item) {\n\t\t\t\tPyArray_TypecodeFromTypeObject(obj, at);\n\t\t\t\tPyErr_Clear();\n\t\t\t\treturn PY_SUCCEED;\n\t\t\t}\n\t\t}\n return PY_FAIL;\n\t}\n\t\n at->type_num = descr->type_num;\n\tif (at->itemsize == 0) at->itemsize = descr->elsize;\n\t\n return PY_SUCCEED;\n fail:\n\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\"data type not understood\");\n\treturn PY_FAIL;\n}\t\n\n\n/* This function returns true if the two typecodes are \n equivalent (same basic kind and same itemsize).\n*/\n\nstatic Bool\nPyArray_EquivalentTypes(PyArray_Typecode *typ1, PyArray_Typecode *typ2)\n{\n\tregister int typenum1=typ1->type_num;\n\tregister int typenum2=typ2->type_num;\n\tregister int size1=typ1->itemsize;\n\tregister int size2=typ2->itemsize;\n\n\tif (size1 != size2) return FALSE;\n\tif (typenum1==typenum2) return TRUE;\n\n\t/* If we are here then size1 == size2 */\n\tif (typenum1 < PyArray_FLOAT) {\n\t\tif (PyTypeNum_ISBOOL(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISBOOL(typenum2));\n\t\telse if (PyTypeNum_ISUNSIGNED(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISUNSIGNED(typenum2));\n\t\telse \n\t\t\treturn (Bool)(PyTypeNum_ISSIGNED(typenum2));\n\t}\n\telse {\n\t\tif (PyTypeNum_ISFLOAT(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISFLOAT(typenum2));\n\t\telse if (PyTypeNum_ISCOMPLEX(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISCOMPLEX(typenum2));\n\t}\n\t/* Default size1 != size2 and typenum1 != typenum2 */\n\treturn FALSE;\t\n}\n\nstatic Bool \nPyArray_EquivArrTypes(PyArrayObject *a1, PyArrayObject *a2)\n{\n PyArray_Typecode type1={0,0,0};\n PyArray_Typecode type2={0,0,0};\n\n\ttype1.type_num = PyArray_TYPE(a1);\n\ttype2.type_num = PyArray_TYPE(a2);\n\ttype1.itemsize = PyArray_ITEMSIZE(a1);\n\ttype2.itemsize = PyArray_ITEMSIZE(a2);\n\t\t\t\n return PyArray_EquivalentTypes(&type1, &type2);\n}\n\n\n/*** END C-API FUNCTIONS **/\n\n\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\n\nstatic char doc_fromobject[] = \"array(object, dtype=None, copy=1, fortran=0) will return a new array formed from the given object type given. Object can anything with an __array__ method, or any (nested) sequence. If no type is given, then the type will be determined as the minimum type required to hold the objects in the sequence. If copy is zero and sequence is already an array with the right type, a reference will be returned. If the sequence is an array, type can be used only to upcast the array. For downcasting use .astype(t) method.\";\n\nstatic PyObject *\n_array_fromobject(PyObject *ignored, PyObject *args, PyObject *kws)\n{\n\tPyObject *op, *ret=NULL;\n\tstatic char *kwd[]= {\"object\", \"dtype\", \"copy\", \"fortran\", NULL};\n\tBool copy=TRUE;\n\tPyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_NOTYPE, 0, 0};\n\tint type_num;\n\tBool fortran=FALSE;\n\tint flags=0;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|O&O&O&\", kwd, &op, \n\t\t\t\t\tPyArray_TypecodeConverter,\n &type, \n\t\t\t\t\tPyArray_BoolConverter, ©, \n\t\t\t\t\tPyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\ttype_num = type.type_num;\n\n\t/* fast exit if simple call */\n\tif (PyArray_Check(op) && (copy==0) &&\t\t\t\\\n\t (fortran == PyArray_CHKFLAGS(op, FORTRAN))) {\n\t\tif (type_num == PyArray_NOTYPE) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t\t/* One more chance */\n\t\toldtype.type_num = PyArray_TYPE(op);\n\t\toldtype.itemsize = PyArray_ITEMSIZE(op);\n\t\tif (PyArray_EquivalentTypes(&oldtype, &type)) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t}\n\n\ttype.fortran = fortran; \n\tif (copy) {\n\t\tflags = ENSURECOPY;\n\t}\n\n\tif ((ret = PyArray_FromAny(op, &type, 0, 0, flags)) == NULL) \n\t\treturn NULL;\n\n\treturn _ARET(ret);\n}\n\nstatic PyObject *\nPyArray_Empty(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n \n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n PyArray_FillObjectArray(ret, Py_None);\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic char doc_empty[] = \"empty((d1,...,dn),dtype=intp,fortran=0) will return a new array\\n of shape (d1,...,dn) and given type with all its entries uninitialized. This can be faster than zeros.\";\n\nstatic PyObject *\narray_empty(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Empty(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_scalar[] = \"scalar(dtypestr,obj) will return a new scalar array of the given type initialized with obj. Mainly for pickle support. typestr must be a valid data typestr (complete with < > or |). If dtypestr is object, then obj can be any object, otherwise obj must be a string. If obj is not given it will be interpreted as None for object type and zeros for all other types.\";\n\nstatic PyObject *\narray_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"dtypestr\",\"obj\", NULL};\n\tPyArray_Typecode typecode;\n\tPyObject *obj=NULL;\n\tchar *typestr;\n\tint typestrlen;\n\tint swap, alloc=0;\n\tvoid *dptr;\n\tPyObject *ret;\n\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"z#|O\",\n\t\t\t\t\t kwlist, &typestr, &typestrlen,\n\t\t\t\t\t &obj)) \n\t\treturn NULL;\n\t\n\tif (_array_typecode_fromstr(typestr, &swap, &typecode) < 0) \n\t\treturn NULL;\n\t\n\tif (typecode.itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\t\t\\\n\t\t\t\t\"itemsize cannot be zero\");\n\t\treturn NULL;\n\t}\n\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (obj == NULL) obj = Py_None;\n\t\tdptr = &obj;\n\t\tswap = 0;\n\t}\n\telse {\n\t\tif (obj == NULL) {\n\t\t\tdptr = malloc(typecode.itemsize);\n\t\t\tif (dptr == NULL) {\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tmemset(dptr, '\\0', typecode.itemsize);\n\t\t\talloc = 1;\n\t\t}\n\t\telse {\n\t\t\tif (!PyString_Check(obj)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"initializing object must \"\\\n\t\t\t\t\t\t\"be a string.\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif (PyString_GET_SIZE(obj) < typecode.itemsize) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"initialization string is too\"\\\n\t\t\t\t\t\t\" small\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tdptr = PyString_AS_STRING(obj);\n\t\t}\n\t}\n\n\tret = PyArray_Scalar(dptr, typecode.type_num,\n\t\t\t typecode.itemsize, swap); \n\n\t/* free dptr which contains zeros */\n\tif (alloc) free(dptr);\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_Zeros(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n\t\tPyObject *zero = PyInt_FromLong(0);\n PyArray_FillObjectArray(ret, zero);\n Py_DECREF(zero);\n\t}\n\telse {\t\t\n\t\tmemset(ret->data, 0, n*(ret->itemsize));\n\t}\n\treturn (PyObject *)ret;\n\n}\n\nstatic char doc_zeros[] = \"zeros((d1,...,dn),dtype=intp,fortran=0) will return a new array of shape (d1,...,dn) and type typecode with all it's entries initialized to zero.\";\n\n\nstatic PyObject *\narray_zeros(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Zeros(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_set_typeDict[] = \"set_typeDict(dict) set the internal \"\\\n\t\"dictionary that can look up an array type using a registered \"\\\n\t\"code\";\n\nstatic PyObject *\narray_set_typeDict(PyObject *ignored, PyObject *args)\n{\n\tPyObject *dict;\n\tif (!PyArg_ParseTuple(args, \"O\", &dict)) return NULL;\n\tPy_XDECREF(typeDict); /* Decrement old reference (if any)*/\n\ttypeDict = dict;\n\tPy_INCREF(dict); /* Create an internal reference to it */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_fromString[] = \"fromstring(string, dtype=intp, count=-1, swap=False) returns a new 1d array initialized from the raw binary data in string. If count is positive, the new array will have count elements, otherwise it's size is determined by the size of string.\";\n\nstatic PyObject *\narray_fromString(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyArrayObject *ret; \n\tchar *data;\n\tlonglong nin=-1;\n\tintp s, n;\n\tstatic char *kwlist[] = {\"string\", \"dtype\", \"count\", \"swap\",NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint itemsize;\n\tint swapped=FALSE;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"s#|O&LO&\", kwlist, \n\t\t\t\t\t &data, &s, \n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &swapped)) {\n\t\treturn NULL;\n\t}\n\t\n\tn = (intp) nin;\n\n\titemsize = type.itemsize;\n\tif (itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \"zero-valued itemsize.\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype.type_num, NULL, \n\t\t\t\t\t\tNULL, itemsize, 0,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\t\n\tmemcpy(ret->data, data, n*ret->itemsize);\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPyArray_INCREF(ret);\n\treturn (PyObject *)ret;\n}\n\n\n/* This needs an open file object and reads it in directly. \n memory-mapped files handled differently through buffer interface.\n\nfile pointer number in resulting 1d array \n(can easily reshape later, -1 for to end of file)\ntype of array\nsep is a separator string for character-based data (or NULL for binary)\n \" \" means whitespace\n*/\n\n\nstatic int\n_fill_in_itemsize(PyArray_Typecode *typecode)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(typecode->type_num);\n\tif (descr==NULL) return -1;\n\ttypecode->itemsize = descr->elsize;\n\treturn 0;\n}\n\n\nstatic PyObject *\nPyArray_FromFile(FILE *fp, PyArray_Typecode *typecode, intp num, char *sep)\n{\n\tPyArrayObject *r;\n\tsize_t nread = 0;\n\tPyArray_ScanFunc *scan;\n\n\tif (typecode->itemsize == 0) {\n\t\tif (_fill_in_itemsize(typecode) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tif (num == -1 && sep == NULL) { /* Get size for binary file*/\n\t\tintp start, numbytes;\n\t\tstart = (intp )ftell(fp);\n\t\tfseek(fp, 0, SEEK_END);\n\t\tnumbytes = (intp )ftell(fp) - start;\n\t\tfseek(fp, (long) start, SEEK_SET);\n\t\tif (numbytes == -1) {\n\t\t\tPyErr_SetString(PyExc_IOError, \"Could not seek in file.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tif (typecode->itemsize == 0) {\n\t\t\ttypecode->itemsize = numbytes;\n\t\t\tnum = 1;\n\t\t}\n\t\telse {\n\t\t\tnum = numbytes / typecode->itemsize;\n\t\t}\n\t}\n\t\n\tif (sep==NULL) { /* binary data */\n\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &num, \n\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t typecode->itemsize, 0, NULL);\n\t\tif (r==NULL) return NULL;\n\t\tnread = fread(r->data, typecode->itemsize, num, fp);\n\t}\n\telse { /* character reading */\n\t\tintp i;\n\t\tchar *dptr;\n\t\tint done=0;\n\n\t\tscan = PyArray_DescrFromType(typecode->type_num)->scanfunc;\n\t\tif (scan == NULL) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Don't know how to read \"\t\\\n\t\t\t\t\t\"character files with that \"\t\\\n\t\t\t\t\t\"array type\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (num != -1) { /* number to read is known */\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &num, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\tdptr = r->data;\n\t\t\tfor (i=0; i < num; i++) {\n\t\t\t\tif (done) break;\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\t\t\t\tif (done < -2) break;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t\telse { /* we have to watch for the end of the file and \n\t\t\t reallocate at the end */\n#define _FILEBUFNUM 4096\n\t\t\tintp thisbuf=0;\n\t\t\tintp size = _FILEBUFNUM;\n\t\t\tintp bytes;\n\t\t\tintp totalbytes;\n\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &size, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\ttotalbytes = bytes = size * typecode->itemsize;\n\t\t\tdptr = r->data;\n\t\t\twhile (!done) {\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\n\t\t\t\t/* end of file reached trying to \n\t\t\t\t scan value. done is 1 or 2\n\t\t\t\t if end of file reached trying to\n\t\t\t\t scan separator. Still good value.\n\t\t\t\t*/\n\t\t\t\tif (done < -2) break;\n\t\t\t\tthisbuf += 1;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t\tif (!done && thisbuf == size) {\n\t\t\t\t\ttotalbytes += bytes;\n\t\t\t\t\tr->data = PyDataMem_RENEW(r->data, \n\t\t\t\t\t\t\t\t totalbytes);\n\t\t\t\t\tdptr = r->data + (totalbytes - bytes);\n\t\t\t\t\tthisbuf = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tr->data = PyDataMem_RENEW(r->data, nread*r->itemsize);\n\t\t\tPyArray_DIM(r,0) = nread;\n\t\t\tnum = nread;\n#undef _FILEBUFNUM\n\t\t}\n\t}\n\tif (nread < num) {\n\t\tfprintf(stderr, \"%ld items requested but only %ld read\\n\", \n\t\t\t(long) num, (long) nread);\n\t\tr->data = PyDataMem_RENEW(r->data, nread * r->itemsize);\n\t\tPyArray_DIM(r,0) = nread;\n\t}\n\treturn (PyObject *)r;\n}\n\nstatic char doc_fromfile[] = \\\n\t\"fromfile(file=, dtype=intp, count=-1, sep='')\\n\"\\\n\t\"\\n\"\\\n\t\" Return an array of the given data type from a \\n\"\\\n\t\" (text or binary) file. The file argument can be an open file\\n\"\\\n\t\" or a string with the name of a file to read from. If\\n\"\\\n\t\" count==-1, then the entire file is read, otherwise count is\\n\"\\\n\t\" the number of items of the given type read in. If sep is ''\\n\"\\\n\t\" then read a binary file, otherwise it gives the separator\\n\"\\\n\t\" between elements in a text file.\\n\"\\\n\t\"\\n\"\\\n\t\" WARNING: This function should be used sparingly, as it is not\\n\"\\\n\t\" a robust method of persistence. But it can be useful to\\n\"\\\n\t\" read in simply-formatted or binary data quickly.\";\n\nstatic PyObject *\narray_fromfile(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *file=NULL, *ret;\n\tFILE *fp;\n\tchar *sep=\"\";\n\tchar *mode=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"file\", \"dtype\", \"count\", \"sep\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Ls\", kwlist, \n\t\t\t\t\t &file,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &sep)) {\n\t\treturn NULL;\n\t}\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"rb\";\n\t\telse mode=\"r\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfp = PyFile_AsFile(file);\n\tif (fp == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be an open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_FromFile(fp, &type, (intp) nin, sep);\n\tPy_DECREF(file);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_FromBuffer(PyObject *buf, PyArray_Typecode *type, \n\t\t intp count, int swapped) \n{\n\tPyArrayObject *ret;\n\tchar *data;\n\tint ts;\n\tintp s, n;\n\tint itemsize;\n\tint write=1;\n\n\tif (type->type_num == PyArray_OBJECT) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Cannot create an OBJECT array from memory\"\\\n\t\t\t\t\" buffer.\");\n\t\treturn NULL;\n\t}\n\tif (type->itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Itemsize cannot be zero in type\");\n\t\treturn NULL;\n\t}\n\n\tif (PyObject_AsWriteBuffer(buf, (void *)&data, &ts)==-1) {\n\t\twrite = 0;\n\t\tPyErr_Clear();\n\t\tif (PyObject_AsReadBuffer(buf, (void *)&data, &ts)==-1) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\ts = (intp)ts;\t\n\tn = (intp)count;\n\titemsize = type->itemsize;\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype->type_num, NULL, \n\t\t\t\t\t\tdata, itemsize, DEFAULT_FLAGS,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\n\tif (!write) ret->flags &= ~WRITEABLE;\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPy_INCREF(buf);\n\t/* Store a reference for decref on deallocation */\n\tret->base = buf;\n\tPyArray_UpdateFlags(ret, ALIGNED);\n\treturn (PyObject *)ret; \t\n}\n\nstatic char doc_frombuffer[] = \\\n\t\"frombuffer(buffer=, dtype=intp, count=-1, swap=0)\\n\"\\\n\t\"\\n\"\t\t\t\t\t\t\t\t\\\n\t\" Returns a 1-d array of data type dtype from buffer. The buffer\\n\"\\\n\t\" argument must be an object that exposes the buffer interface.\\n\"\\\n\t\" If count is -1 then the entire buffer is used, otherwise, count\\n\"\\\n\t\" is the size of the output. If the buffer has data that is out\\n\" \\\n\t\" not in machine byte-order, than set swap=1. The data will not\\n\"\n\t\" be byteswapped, but the array will manage it in future\\n\"\\\n\t\" operations.\\n\";\n\nstatic PyObject *\narray_frombuffer(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *obj=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"buffer\", \"dtype\", \"count\", \n\t\t\t\t \"swap\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint swapped=0;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Li\", kwlist, \n\t\t\t\t\t &obj,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &swapped)) {\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_FromBuffer(obj, &type, (intp)nin, swapped);\n}\n\n\n\nstatic char doc_concatenate[] = \"concatenate((a1,a2,...),axis=None).\";\n\nstatic PyObject *\narray_concatenate(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *a0;\n\tint axis=0;\n\tstatic char *kwlist[] = {\"seq\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist,\n\t\t\t\t\t &a0,\n\t\t\t\t\t PyArray_AxisConverter, &axis))\n\t\treturn NULL;\n\treturn PyArray_Concatenate(a0, axis);\n}\n\nstatic char doc_innerproduct[] = \\\n\t\"inner(a,b) returns the dot product of two arrays, which has\\n\"\\\n\t\"shape a.shape[:-1] + b.shape[:-1] with elements computed by\\n\" \\\n\t\"the product of the elements from the last dimensions of a and b.\";\n\nstatic PyObject *array_innerproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *b0, *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a0, &b0)) return NULL;\n\t\n\treturn _ARET(PyArray_InnerProduct(a0, b0));\n}\n\nstatic char doc_matrixproduct[] = \\\n\t\"dot(a,v) returns matrix-multiplication between a and b. \\n\"\\\n\t\"The product-sum is over the last dimension of a and the \\n\"\\\n\t\"second-to-last dimension of b.\";\n\nstatic PyObject *array_matrixproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *v, *a;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a, &v)) return NULL;\n\t\n\treturn _ARET(PyArray_MatrixProduct(a, v));\n}\n\nstatic char doc_fastCopyAndTranspose[] = \"_fastCopyAndTranspose(a)\";\n\nstatic PyObject *array_fastCopyAndTranspose(PyObject *dummy, PyObject *args) {\n\tPyObject *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &a0)) return NULL;\n\t\n\treturn _ARET(PyArray_CopyAndTranspose(a0));\n}\n\nstatic char doc_correlate[] = \"cross_correlate(a,v, mode=0)\";\n\nstatic PyObject *array_correlate(PyObject *dummy, PyObject *args, PyObject *kwds) {\n\tPyObject *shape, *a0;\n\tint mode=0;\n\tstatic char *kwlist[] = {\"a\", \"v\", \"mode\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO|i\", kwlist, \n\t\t\t\t\t &a0, &shape, &mode)) return NULL;\n\t\n\treturn PyArray_Correlate(a0, shape, mode);\n}\n\n\nstatic PyObject *\nPyArray_Arange(double start, double stop, double step, int type_num)\n{\n\tintp length, i;\n\tPyObject *range;\n\tchar *rptr;\n\tint elsize, type;\n\tdouble value;\n\tPyArray_Descr *dbl_descr;\n\n\tlength = (intp ) ceil((stop - start)/step);\n \n\tif (length <= 0) {\n\t\tlength = 0;\n\t\treturn PyArray_New(&PyArray_Type, 1, &length, type_num,\n\t\t\t\t NULL, NULL, 0, 0, NULL);\n\t}\n\n\trange = PyArray_New(&PyArray_Type, 1, &length, type_num, \n\t\t\t NULL, NULL, 0, 0, NULL);\n\tif (range == NULL) return NULL;\n\tdbl_descr = PyArray_DescrFromType(PyArray_DOUBLE);\n \n\trptr = ((PyArrayObject *)range)->data;\n\telsize = ((PyArrayObject *)range)->itemsize;\n\ttype = ((PyArrayObject *)range)->descr->type_num;\n\tfor (i=0; i < length; i++) {\n\t\tvalue = start + i*step;\n\t\tdbl_descr->cast[type]((char*)&value, rptr, 1, NULL, \n\t\t\t\t (PyArrayObject *)range);\n\t\trptr += elsize;\n\t}\n \n\treturn range;\n}\n\n\nstatic char doc_arange[] = \"arange(start, stop=None, step=1, dtype=intp)\\n\\n Just like range() except it returns an array whose type can be\\n specified by the keyword argument typecode.\";\n\nstatic PyObject *\narray_arange(PyObject *ignored, PyObject *args, PyObject *kws) {\n\tPyObject *o_start=NULL, *o_stop=Py_None, *o_step=NULL;\n\tstatic char *kwd[]= {\"start\", \"stop\", \"step\", \"dtype\", NULL};\n\tdouble start, stop, step;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0};\n\tint type_num;\n\tint deftype = PyArray_INTP;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|OOO&\", kwd, &o_start,\n\t\t\t\t\t&o_stop, &o_step, \n\t\t\t\t\tPyArray_TypecodeConverter, \n\t\t\t\t\t&typecode)) \n\t\treturn NULL;\n\n\tdeftype = PyArray_ObjectType(o_start, deftype);\n\tif (o_stop != Py_None) {\n\t\tdeftype = PyArray_ObjectType(o_stop, deftype);\n\t}\n\tif (o_step != NULL) {\n\t\tdeftype = PyArray_ObjectType(o_step, deftype);\n\t}\n\n\ttype_num = typecode.type_num;\n\tif (type_num == PyArray_NOTYPE) {\n\t\ttype_num = deftype;\n\t}\n\n\tstart = PyFloat_AsDouble(o_start);\n\tif error_converting(start) return NULL;\n\n\tif (o_step == NULL) {\n\t\tstep = 1;\n\t}\n\telse {\n\t\tstep = PyFloat_AsDouble(o_step);\n\t\tif error_converting(step) return NULL;\n\t}\n\n\tif (o_stop == Py_None) {\n\t\tstop = start;\n\t\tstart = 0;\n\t}\n\telse {\n\t\tstop = PyFloat_AsDouble(o_stop);\n\t\tif error_converting(stop) return NULL;\n\t}\n\n\treturn PyArray_Arange(start, stop, step, type_num);\n}\n\n#undef _ARET\n\n/*****\n static char doc_arrayMap[] = \"arrayMap(func, [a1,...,an])\";\n\n static PyObject *array_arrayMap(PyObject *dummy, PyObject *args) {\n PyObject *shape, *a0;\n \n if (PyArg_ParseTuple(args, \"OO\", &a0, &shape) == NULL) return NULL;\n\t\n return PyArray_Map(a0, shape);\n }\n*****/\n\nstatic char \ndoc_set_string_function[] = \"set_string_function(f, repr=1) sets the python function f to be the function used to obtain a pretty printable string version of a array whenever a array is printed. f(M) should expect a array argument M, and should return a string consisting of the desired representation of M for printing.\";\n\nstatic PyObject *\narray_set_string_function(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *op;\n\tint repr=1;\n\tstatic char *kwlist[] = {\"f\", \"repr\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O|i\", kwlist, \n\t\t\t\t\t&op, &repr)) return NULL; \n\tPyArray_SetStringFunction(op, repr);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char \ndoc_set_ops_function[] = \"set_numeric_ops(op=func, ...) sets some or all of the number methods for all array objects. Don't forget **dict can be used as the argument list. Returns the functions that were replaced -- can be stored and set later.\";\n\nstatic PyObject *\narray_set_ops_function(PyObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *oldops=NULL;\n\t\n\tif ((oldops = PyArray_GetNumericOps())==NULL) return NULL;\n\n\t/* Should probably ensure that objects are at least callable */\n\t/* Leave this to the caller for now --- error will be raised\n\t later when use is attempted \n\t*/\n\tif (PyArray_SetNumericOps(kwds) == -1) {\n\t\tPy_DECREF(oldops);\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"One or more objects is not callable.\");\n\t\treturn NULL;\n\t}\n\treturn oldops;\n}\n\n\nstatic PyObject *\nPyArray_Where(PyObject *condition, PyObject *x, PyObject *y)\n{\n\tPyArrayObject *arr;\n\tPyObject *tup=NULL, *obj=NULL;\n\tPyObject *ret=NULL, *zero=NULL;\n\n\tif ((x==NULL) || (y==NULL)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"either both or neither\"\n\t\t\t\t\"of x and y should be given.\");\n\t\treturn NULL;\n\t}\n\n\tarr = (PyArrayObject *)PyArray_FromAny(condition, NULL, 0, 0, 0);\n\tif (arr == NULL) return NULL;\n\n\tif ((x==NULL) && (y==NULL)) {\n\t\tret = PyArray_Nonzero(arr);\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\n\n\tzero = PyInt_FromLong((long) 0);\n\n\tobj = PyArray_EnsureArray(PyArray_GenericBinaryFunction(arr, zero, n_ops.not_equal));\n\tPy_DECREF(zero);\n\tPy_DECREF(arr);\n\tif (obj == NULL) return NULL;\n\n\ttup = Py_BuildValue(\"(OO)\", y, x);\n\tif (tup == NULL) {Py_DECREF(obj); return NULL;}\n\n\tret = PyArray_Choose((PyAO *)obj, tup);\n\n\tPy_DECREF(obj);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n\nstatic char doc_where[] = \"where(condition, | x, y) is shaped like condition\"\\\n\t\" and has elements of x and y where condition is respectively true or\"\\\n\t\" false. If x or y are not given, then it is equivalent to\"\\\n\t\" nonzero(condition).\";\n\nstatic PyObject *\narray_where(PyObject *ignored, PyObject *args)\n{\n\tPyObject *obj=NULL, *x=NULL, *y=NULL;\n\t\n\tif (!PyArg_ParseTuple(args, \"O|OO\", &obj, &x, &y)) return NULL;\n\n\treturn PyArray_Where(obj, x, y);\n\n}\n\nstatic char doc_register_dtype[] = \\\n\t\"register_dtype(a) registers a new type object -- gives it a typenum\";\n\nstatic PyObject *\narray_register_dtype(PyObject *dummy, PyObject *args)\n{\n\tPyObject *dtype;\n\tint ret;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &dtype)) return NULL;\n\t\n\tret = PyArray_RegisterDataType((PyTypeObject *)dtype);\n\tif (ret < 0)\n\t\treturn NULL;\n\treturn PyInt_FromLong((long) ret);\n}\n\nstatic char doc_can_cast_safely[] = \\\n\t\"can_cast_safely(from=d1, to=d2) returns True if data type d1 \"\\\n\t\"can be cast to data type d2 without losing precision.\";\n\nstatic PyObject *\narray_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode d1={PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode d2={PyArray_NOTYPE, 0, 0};\n\tBool ret;\n\tPyObject *retobj;\n\tstatic char *kwlist[] = {\"from\", \"to\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O&O&\", kwlist, \n\t\t\t\t\tPyArray_TypecodeConverter, &d1,\n\t\t\t\t\tPyArray_TypecodeConverter, &d2))\n\t\treturn NULL;\n\tif (d1.type_num == PyArray_NOTYPE || \\\n\t d2.type_num == PyArray_NOTYPE) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"did not understand one of the types. \"\\\n\t\t\t\t\"'None' not accepted.\");\n\t\treturn NULL;\n\t}\n\t\t\n\tret = PyArray_CanCastTo(&d1, &d2);\n\tretobj = (ret ? Py_True : Py_False);\n\tPy_INCREF(retobj);\n\treturn retobj;\n}\n\nstatic struct PyMethodDef array_module_methods[] = {\n\t{\"set_string_function\", (PyCFunction)array_set_string_function, \n\t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n\t{\"set_numeric_ops\", (PyCFunction)array_set_ops_function,\n\t METH_VARARGS|METH_KEYWORDS, doc_set_ops_function},\n\t{\"set_typeDict\", (PyCFunction)array_set_typeDict,\n\t METH_VARARGS, doc_set_typeDict},\n\n\t{\"array\",\t(PyCFunction)_array_fromobject, \n\t METH_VARARGS|METH_KEYWORDS, doc_fromobject},\n\t{\"arange\", (PyCFunction)array_arange, \n\t METH_VARARGS|METH_KEYWORDS, doc_arange},\n\t{\"zeros\",\t(PyCFunction)array_zeros, \n\t METH_VARARGS|METH_KEYWORDS, doc_zeros},\n\t{\"empty\",\t(PyCFunction)array_empty, \n\t METH_VARARGS|METH_KEYWORDS, doc_empty},\n\t{\"scalar\", (PyCFunction)array_scalar,\n\t METH_VARARGS|METH_KEYWORDS, doc_scalar},\n\t{\"where\", (PyCFunction)array_where,\n\t METH_VARARGS, doc_where},\n\t{\"fromstring\",(PyCFunction)array_fromString,\n\t METH_VARARGS|METH_KEYWORDS, doc_fromString},\n\t{\"concatenate\", (PyCFunction)array_concatenate, \n\t METH_VARARGS|METH_KEYWORDS, doc_concatenate},\n\t{\"inner\", (PyCFunction)array_innerproduct, \n\t METH_VARARGS, doc_innerproduct}, \n\t{\"dot\", (PyCFunction)array_matrixproduct, \n\t METH_VARARGS, doc_matrixproduct}, \n\t{\"_fastCopyAndTranspose\", (PyCFunction)array_fastCopyAndTranspose, \n\t METH_VARARGS, doc_fastCopyAndTranspose},\n\t{\"correlate\", (PyCFunction)array_correlate, \n\t METH_VARARGS | METH_KEYWORDS, doc_correlate},\n\t{\"frombuffer\", (PyCFunction)array_frombuffer,\n\t METH_VARARGS | METH_KEYWORDS, doc_frombuffer},\n\t{\"fromfile\", (PyCFunction)array_fromfile,\n\t METH_VARARGS | METH_KEYWORDS, doc_fromfile},\n\t{\"register_dtype\", (PyCFunction)array_register_dtype,\n\t METH_VARARGS, doc_register_dtype},\n\t{\"can_cast\", (PyCFunction)array_can_cast_safely,\n\t METH_VARARGS | METH_KEYWORDS, doc_can_cast_safely},\t\t\n\t/* {\"arrayMap\",\t(PyCFunction)array_arrayMap, \n\t METH_VARARGS, doc_arrayMap},*/\n\t\n\t{NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n#include \"__multiarray_api.c\"\n\n/* Establish scalar-type hierarchy */\n\n/* For dual inheritance we need to make sure that the objects being\n inherited from have the tp->mro object initialized. This is\n not necessarily true for the basic type objects of Python (it is \n checked for single inheritance but not dual in PyType_Ready).\n\n Thus, we call PyType_Ready on the standard Python Types, here.\n*/ \nstatic int\nsetup_scalartypes(PyObject *dict)\n{\n\n\tinitialize_numeric_types();\n\n if (PyType_Ready(&PyBool_Type) < 0) return -1;\n if (PyType_Ready(&PyInt_Type) < 0) return -1;\n if (PyType_Ready(&PyFloat_Type) < 0) return -1;\n if (PyType_Ready(&PyComplex_Type) < 0) return -1;\n if (PyType_Ready(&PyString_Type) < 0) return -1;\n if (PyType_Ready(&PyUnicode_Type) < 0) return -1;\n\n#define SINGLE_INHERIT(child, parent) \\\n Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type;\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) {\t\t\\\n PyErr_Print(); \\\n PyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Tyupe\", \\\n #child); \\\n return -1;\t\t\t\t\t\t\\\n }\n \n if (PyType_Ready(&PyGenericArrType_Type) < 0)\n return -1;\n\n SINGLE_INHERIT(Numeric, Generic);\n SINGLE_INHERIT(Integer, Numeric);\n SINGLE_INHERIT(Inexact, Numeric);\n SINGLE_INHERIT(SignedInteger, Integer);\n SINGLE_INHERIT(UnsignedInteger, Integer);\n SINGLE_INHERIT(Floating, Inexact);\n SINGLE_INHERIT(ComplexFloating, Inexact);\n SINGLE_INHERIT(Flexible, Generic);\n SINGLE_INHERIT(Character, Flexible);\n\t\n#define DUAL_INHERIT(child, parent1, parent2) \\\n Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type;\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent2##ArrType_Type,\t\\\n\t\t\t &Py##parent1##_Type);\t\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n#define DUAL_INHERIT2(child, parent1, parent2)\t\t\t\t\\\n Py##child##ArrType_Type.tp_base = &Py##parent1##_Type;\t\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent1##_Type,\t\t\\\n\t\t\t &Py##parent2##ArrType_Type);\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n SINGLE_INHERIT(Bool, Generic);\n SINGLE_INHERIT(Byte, SignedInteger);\n SINGLE_INHERIT(Short, SignedInteger);\n#if SIZEOF_INT == SIZEOF_LONG\n DUAL_INHERIT(Int, Int, SignedInteger);\n#else\n SINGLE_INHERIT(Int, SignedInteger);\n#endif\n DUAL_INHERIT(Long, Int, SignedInteger);\n#if SIZEOF_LONGLONG == SIZEOF_LONG\n DUAL_INHERIT(LongLong, Int, SignedInteger);\n#else\n SINGLE_INHERIT(LongLong, SignedInteger);\n#endif\n\n SINGLE_INHERIT(UByte, UnsignedInteger);\n SINGLE_INHERIT(UShort, UnsignedInteger);\n SINGLE_INHERIT(UInt, UnsignedInteger);\n SINGLE_INHERIT(ULong, UnsignedInteger);\n SINGLE_INHERIT(ULongLong, UnsignedInteger);\n\n SINGLE_INHERIT(Float, Floating);\n DUAL_INHERIT(Double, Float, Floating);\n SINGLE_INHERIT(LongDouble, Floating);\n\n SINGLE_INHERIT(CFloat, ComplexFloating);\n DUAL_INHERIT(CDouble, Complex, ComplexFloating);\n SINGLE_INHERIT(CLongDouble, ComplexFloating);\n\n DUAL_INHERIT2(String, String, Character);\n DUAL_INHERIT2(Unicode, Unicode, Character);\n\t\n SINGLE_INHERIT(Void, Flexible);\n \n SINGLE_INHERIT(Object, Generic);\n\n return 0;\n\n#undef SINGLE_INHERIT\n#undef DUAL_INHERIT\n\n\t/* Clean up string and unicode array types so they act more like\n\t strings -- get their tables from the standard types.\n\t \n\t \n\t*/\n}\n\n/* place a flag dictionary in d */\n\nstatic void\nset_flaginfo(PyObject *d)\n{\n PyObject *s;\n PyObject *newd;\n \n newd = PyDict_New();\n\n PyDict_SetItemString(newd, \"OWNDATA\", s=PyInt_FromLong(OWNDATA));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"FORTRAN\", s=PyInt_FromLong(FORTRAN));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"CONTIGUOUS\", s=PyInt_FromLong(CONTIGUOUS));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"ALIGNED\", s=PyInt_FromLong(ALIGNED));\n Py_DECREF(s);\n\n PyDict_SetItemString(newd, \"NOTSWAPPED\", s=PyInt_FromLong(NOTSWAPPED));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"UPDATEIFCOPY\", s=PyInt_FromLong(UPDATEIFCOPY));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"WRITEABLE\", s=PyInt_FromLong(WRITEABLE));\n Py_DECREF(s);\n \n PyDict_SetItemString(d, \"_flagdict\", newd);\n Py_DECREF(newd);\n return;\n}\n\n\n/* Initialization function for the module */\n\nDL_EXPORT(void) initmultiarray(void) {\n\tPyObject *m, *d, *s;\n\tPyObject *c_api;\n\t\n\t/* Create the module and add the functions */\n\tm = Py_InitModule(\"multiarray\", array_module_methods);\n\tif (!m) goto err;\n\n\t/* Add some symbolic constants to the module */\n\td = PyModule_GetDict(m);\n\tif (!d) goto err; \n\n\t/* Create the module and add the functions */\n\tif (PyType_Ready(&PyBigArray_Type) < 0) \n\t\treturn;\n\n PyArray_Type.tp_base = &PyBigArray_Type;\n\n PyArray_Type.tp_as_mapping = &array_as_mapping;\n\t/* Even though, this would be inherited, it needs to be set now\n\t so that the __getitem__ will map to the as_mapping descriptor\n\t*/\n PyArray_Type.tp_as_number = &array_as_number; \n\t/* For good measure */\n\tPyArray_Type.tp_as_sequence = &array_as_sequence;\n\tPyArray_Type.tp_as_buffer = &array_as_buffer;\t\n PyArray_Type.tp_flags = (Py_TPFLAGS_DEFAULT \n\t\t\t\t | Py_TPFLAGS_BASETYPE\n\t\t\t\t | Py_TPFLAGS_CHECKTYPES);\n PyArray_Type.tp_doc = Arraytype__doc__;\n\n\tif (PyType_Ready(&PyArray_Type) < 0)\n return;\n\n if (setup_scalartypes(d) < 0) goto err;\n\n\tif (PyType_Ready(&PyArrayIter_Type) < 0)\n\t\treturn; \n \n\tif (PyType_Ready(&PyArrayMapIter_Type) < 0)\n return; \n\n\tc_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);\n\tif (PyErr_Occurred()) goto err;\n\tPyDict_SetItemString(d, \"_ARRAY_API\", c_api);\n\tPy_DECREF(c_api);\n\tif (PyErr_Occurred()) goto err;\n\n\tMultiArrayError = PyString_FromString (\"multiarray.error\");\n\tPyDict_SetItemString (d, \"error\", MultiArrayError);\n\t\n\ts = PyString_FromString(\"3.0\");\n\tPyDict_SetItemString(d, \"__version__\", s);\n\tPy_DECREF(s);\n Py_INCREF(&PyBigArray_Type);\n\tPyDict_SetItemString(d, \"bigndarray\", (PyObject *)&PyBigArray_Type);\n Py_INCREF(&PyArray_Type);\n\tPyDict_SetItemString(d, \"ndarray\", (PyObject *)&PyArray_Type);\n Py_INCREF(&PyArrayIter_Type);\n\tPyDict_SetItemString(d, \"flatiter\", (PyObject *)&PyArrayIter_Type);\n Py_INCREF(&PyArrayMapIter_Type);\n\tPyDict_SetItemString(d, \"mapiter\", (PyObject *)&PyArrayMapIter_Type);\n\n set_flaginfo(d);\n\n\tif (set_typeinfo(d) == 0) \n return; /* otherwise there is an error */\n\n\n err:\t\n\t/* Check for errors */\n\tif (PyErr_Occurred())\n PyErr_Print();\n\t\tPy_FatalError(\"can't initialize module multiarray\");\n\n\treturn;\n}\n\n", "source_code_before": "\n/*\n Python Multiarray Module -- A useful collection of functions for creating and\n using ndarrays\n\n Original file \n Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\n Modified for scipy_core in 2005 \n\n Travis E. Oliphant\n Assistant Professor at\n Brigham Young University\n \n*/\n\n/* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */\n\n#include \"Python.h\"\n#include \"structmember.h\"\n/*#include \n#include \n*/\n\n#define _MULTIARRAYMODULE\n#include \"scipy/arrayobject.h\"\n\n#define PyAO PyArrayObject\n\nstatic PyObject *typeDict=NULL; /* Must be explicitly loaded */\n\n/* Including this file is the only way I know how to declare functions\n static in each file, and store the pointers from functions in both\n arrayobject.c and multiarraymodule.c for the C-API \n\n Declarying an external pointer-containing variable in arrayobject.c\n and trying to copy it to PyArray_API, did not work.\n\n Think about two modules with a common api that import each other...\n\n This file would just be the module calls. \n*/\n\n#include \"arrayobject.c\"\n\n\n/* An Error object -- rarely used? */\nstatic PyObject *MultiArrayError;\n\nstatic int\nPyArray_MultiplyIntList(register int *l1, register int n) \n{\n\tregister int s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\nstatic intp \nPyArray_MultiplyList(register intp *l1, register int n) \n{\n\tregister intp s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\n\nstatic int \nPyArray_AxisConverter(PyObject *obj, int *axis)\n{\n\tif (obj == Py_None) {\n\t\t*axis = MAX_DIMS;\n\t}\n\telse {\n\t\t*axis = (int) PyInt_AsLong(obj);\n\t\tif (PyErr_Occurred()) {\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n\treturn PY_SUCCEED;\n}\n\nstatic int \nPyArray_CompareLists(intp *l1, intp *l2, int n) \n{\n int i;\n for(i=0;itype_num;\n\t}\n\n\tnew = PyArray_New(self->ob_type,\n\t\t\t self->nd, self->dimensions,\n\t\t\t self->descr->type_num,\n\t\t\t self->strides,\n\t\t\t self->data,\n\t\t\t self->itemsize,\n\t\t\t self->flags, (PyObject *)self);\n\n\tif (new==NULL) return NULL;\n\t\n Py_INCREF(self);\n PyArray_BASE(new) = (PyObject *)self;\n if ((type_num != PyArray_NOTYPE) && \\\n (type_num != self->descr->type_num)) {\n if (!PyTypeNum_ISFLEXIBLE(type_num)) {\n v = PyArray_TypeObjectFromType(type_num);\n }\n else {\n PyArray_Descr *descr;\n int itemsize = type->itemsize;\n descr = PyArray_DescrFromType(type_num);\n if (type_num == PyArray_UNICODE) \n itemsize /= sizeof(Py_UNICODE);\n /* construct a string representation */\n v = PyString_FromFormat(\"%c%d\", descr->type, \n itemsize);\n }\n if (v == NULL) goto fail;\n /* set attribute new.dtype = newtype */\n if (PyObject_SetAttrString(new, \"dtype\", v) < 0) goto fail;\n Py_DECREF(v);\n }\n\treturn new;\t\n\n fail:\n Py_XDECREF(v);\n Py_XDECREF(new);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Ravel(PyArrayObject *a, int fortran)\n{\n\tPyArray_Dims newdim = {NULL,1};\n\tintp val[1] = {-1};\n\n if (a->nd == 1) {\n Py_INCREF(a);\n return (PyObject *)a;\n }\n\tnewdim.ptr = val;\n\tif (!fortran && PyArray_ISCONTIGUOUS(a)) \n\t\treturn PyArray_Newshape(a, &newdim);\n\telse\n\t return PyArray_Flatten(a, fortran);\n}\n\nstatic PyObject *\nPyArray_Flatten(PyArrayObject *a, int fortran)\n{\n\tPyObject *ret, *new;\n\tintp size;\n\n\tsize = PyArray_SIZE(a);\n\tret = PyArray_New(a->ob_type,\n\t\t\t 1, &size,\n\t\t\t a->descr->type_num,\n\t\t\t NULL,\n NULL,\n\t\t\t a->itemsize,\n\t\t\t 0, (PyObject *)a);\n\n\tif (ret== NULL) return NULL;\n\tif (fortran) {\n\t\tnew = PyArray_Transpose(a, NULL);\n\t\tif (new == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tPy_INCREF(a);\n\t\tnew = (PyObject *)a;\n\t}\n\tif (PyArray_CopyInto((PyArrayObject *)ret, (PyArrayObject *)new) < 0) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(new);\n\t\treturn NULL;\n\t}\n\tPy_DECREF(new);\n\treturn ret;\n}\n\n\n/* For back-ward compatability *\n\n/ * Not recommended */\n\nstatic PyObject *\nPyArray_Reshape(PyArrayObject *self, PyObject *shape) \n{\n PyObject *ret;\n PyArray_Dims newdims;\n\n if (!PyArray_IntpConverter(shape, &newdims)) return NULL;\n ret = PyArray_Newshape(self, &newdims);\n PyDimMem_FREE(newdims.ptr);\n return ret;\n}\n\n/* Returns a new array \n with the a new shape from the data\n in the old array\n*/\n\nstatic PyObject * \nPyArray_Newshape(PyArrayObject *self, PyArray_Dims *newdims)\n{\n intp i, s_original, i_unknown, s_known;\n intp *dimensions = newdims->ptr;\n PyArrayObject *ret;\n\tchar msg[] = \"total size of new array must be unchanged\";\n\tint n = newdims->len;\n Bool same;\n\n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n same = TRUE;\n i=0;\n while(same && i= 0) {\n if ((s_known == 0) || (s_original % s_known != 0)) {\n PyErr_SetString(PyExc_ValueError, msg);\n goto fail;\n }\n dimensions[i_unknown] = s_original/s_known;\n } else {\n if (s_original != s_known) {\n PyErr_SetString(PyExc_ValueError, msg);\n goto fail;\n }\n }\n \n\tret = (PyAO *)PyArray_New(self->ob_type,\n\t\t\t\t n, dimensions,\n\t\t\t\t self->descr->type_num,\n\t\t\t\t NULL,\n\t\t\t\t self->data,\n\t\t\t\t self->itemsize,\n\t\t\t\t self->flags, (PyObject *)self);\n\n\tif (ret== NULL)\n goto fail;\n\t\n Py_INCREF(self);\n ret->base = (PyObject *)self;\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n return (PyObject *)ret;\n\t\n fail:\n return NULL;\n}\n\n/* return a new view of the array object with all of its unit-length \n dimensions squeezed out if needed, otherwise\n return the same array.\n */\n\nstatic PyObject *\nPyArray_Squeeze(PyArrayObject *self)\n{\n\tint nd = self->nd;\n\tint newnd = nd;\n\tintp dimensions[MAX_DIMS];\n\tintp strides[MAX_DIMS];\n\tint i,j;\n\tPyObject *ret;\n\n\tif (nd == 0) {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\tfor (j=0, i=0; idimensions[i] == 1) {\n\t\t\tnewnd -= 1;\n\t\t}\n\t\telse {\n\t\t\tdimensions[j] = self->dimensions[i];\n\t\t\tstrides[j++] = self->strides[i];\n\t\t}\n\t}\n\t\n\tret = PyArray_New(self->ob_type, newnd, dimensions, \n\t\t\t self->descr->type_num, strides,\n\t\t\t self->data, self->itemsize, self->flags,\n\t\t\t (PyObject *)self);\n\tself->flags &= ~OWN_DATA;\n\tself->base = (PyObject *)self;\n\tPy_INCREF(self);\n\treturn (PyObject *)ret;\n}\n\n\nstatic PyObject *\nPyArray_Mean(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL;\n\tPyObject *new, *ret;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\n\tobj1 = PyArray_GenericReduceFunction((PyAO *)new, n_ops.add, axis,\n\t\t\t\t\t rtype);\n\tobj2 = PyFloat_FromDouble((double) PyArray_DIM(new,axis));\n Py_DECREF(new);\n\tif (obj1 == NULL || obj2 == NULL) {\n\t\tPy_XDECREF(obj1);\n\t\tPy_XDECREF(obj2);\n\t\treturn NULL;\n\t}\n\n\tret = PyNumber_Divide(obj1, obj2);\n\tPy_DECREF(obj1);\n\tPy_DECREF(obj2);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Std(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL, *new=NULL;\n\tPyObject *ret=NULL, *newshape=NULL;\n\tint i, n;\n\tintp val;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\t\n\t/* Compute and reshape mean */\n\tobj1 = PyArray_EnsureArray(PyArray_Mean((PyAO *)new, axis, rtype));\n\tif (obj1 == NULL) {Py_DECREF(new); return NULL;} \n\tn = PyArray_NDIM(new);\n\tnewshape = PyTuple_New(n);\n\tif (newshape == NULL) {Py_DECREF(obj1); Py_DECREF(new); return NULL;}\n\tfor (i=0; ind != 1) {\n Py_DECREF(cond);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Condition must be 1-d array.\");\n return NULL;\n }\n\n res = PyArray_Nonzero(cond);\n Py_DECREF(cond);\n\tret = PyArray_Take(self, res, axis);\n\tPy_DECREF(res);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Nonzero(PyArrayObject *self)\n{\n int n=self->nd, j;\n\tintp count=0, i, size;\n\tPyArrayIterObject *it=NULL;\n\tPyObject *ret=NULL, *item;\n\tintp *dptr[MAX_DIMS];\n\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (it==NULL) return NULL;\n\n\tsize = it->size;\n\tfor (i=0; idescr->nonzero(it->dataptr, self)) count++;\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\n\tPyArray_ITER_RESET(it);\n\tif (n==1) {\n\t\tret = PyArray_New(self->ob_type, 1, &count, PyArray_INTP, \n\t\t\t\t NULL, NULL, 0, 0, (PyObject *)self);\n\t\tif (ret == NULL) goto fail;\n\t\tdptr[0] = (intp *)PyArray_DATA(ret);\n\t\t\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\t*(dptr[0])++ = i;\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t}\n\telse {\n\t\tret = PyTuple_New(n);\n\t\tfor (j=0; job_type, 1, &count, \n\t\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0,\n\t\t\t\t\t (PyObject *)self);\n\t\t\tPyTuple_SET_ITEM(ret, j, item);\n\t\t\tif (item == NULL) goto fail;\n\t\t\tdptr[j] = (intp *)PyArray_DATA(item);\n\t\t}\n\t\t\n\t\t/* reset contiguous so that coordinates gets updated */\n\t\tit->contiguous = 0;\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\tfor (j=0; jcoordinates[j];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\n\t}\n\n\treturn ret;\n\n fail:\n\tPy_XDECREF(ret);\n\tPy_XDECREF(it);\n\treturn NULL;\n \n}\n\nstatic PyObject *\nPyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max)\n{\n\tPyObject *selector=NULL, *newtup=NULL, *ret=NULL;\n\tPyObject *res1=NULL, *res2=NULL, *res3=NULL;\n\tPyObject *two;\n\n\ttwo = PyInt_FromLong((long)2);\n\tres1 = PyArray_GenericBinaryFunction(self, max, n_ops.greater);\n\tres2 = PyArray_GenericBinaryFunction(self, min, n_ops.less);\n\tif ((res1 == NULL) || (res2 == NULL)) goto fail;\n\tres3 = PyNumber_Multiply(two, res1);\n\tPy_DECREF(two);\n\tPy_DECREF(res1);\n\tif (res3 == NULL) return NULL;\n\n\tselector = PyArray_EnsureArray(PyNumber_Add(res2, res3));\n\tPy_DECREF(res2);\n\tPy_DECREF(res3);\n\tif (selector == NULL) return NULL;\n\n\tnewtup = Py_BuildValue(\"(OOO)\", (PyObject *)self, min, max);\n\tif (newtup == NULL) goto fail;\n\tret = PyArray_Choose((PyAO *)selector, newtup);\n\tPy_DECREF(selector);\n\tPy_DECREF(newtup);\n\treturn ret;\n\n fail:\n\tPy_XDECREF(res1);\n\tPy_XDECREF(res2);\n\tPy_XDECREF(two);\n\tPy_XDECREF(selector);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Conjugate(PyArrayObject *self)\n{\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyObject *new;\n\t\tintp size, i;\n\t\t/* Make a copy */\n\t\tnew = PyArray_Copy(self);\n\t\tif (new==NULL) return NULL;\n\t\tsize = PyArray_SIZE(new);\n\t\tif (self->descr->type_num == PyArray_CFLOAT) {\n\t\t\tcfloat *dptr = (cfloat *) PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CDOUBLE) {\n\t\t\tcdouble *dptr = (cdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CLONGDOUBLE) {\n\t\t\tclongdouble *dptr = (clongdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t\treturn new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *) self;\n\t}\n}\n\nstatic PyObject *\nPyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, \nint rtype)\n{\n\tPyObject *diag=NULL, *ret=NULL;\n\n\tdiag = PyArray_Diagonal(self, offset, axis1, axis2);\n\tif (diag == NULL) return NULL;\n\tret = PyArray_GenericReduceFunction((PyAO *)diag, n_ops.add, -1, rtype);\n\tPy_DECREF(diag);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Diagonal(PyArrayObject *self, int offset, int axis1, int axis2)\n{\n\tint n = self->nd;\n\tPyObject *new;\n\tPyObject *newaxes;\n\tint i, pos;\t\n\n\tif (n < 2) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"array.ndim must be >= 2\");\n\t\treturn NULL;\n\t}\n\tif (axis1 < 0) axis1 += n;\n\tif (axis2 < 0) axis2 += n;\n\tif ((axis1 == axis2) || (axis1 < 0) || (axis1 >= n) ||\t\\\n\t (axis2 < 0) || (axis2 >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \"axis1(=%d) and axis2(=%d) \"\\\n\t\t\t \"must be different and within range (nd=%d)\",\n\t\t\t axis1, axis2, n);\n\t\treturn NULL;\n\t}\n \n\tnewaxes = PyTuple_New(n);\n\tif (newaxes==NULL) return NULL;\n\t/* insert at the end */\n\tPyTuple_SET_ITEM(newaxes, n-2, PyInt_FromLong((long)axis1));\n\tPyTuple_SET_ITEM(newaxes, n-1, PyInt_FromLong((long)axis2));\n\tpos = 0;\n\tfor (i=0; idimensions[0];\n\t\tn2 = self->dimensions[1];\n\t\tstep = n2+1;\n\t\tif (offset < 0) {\n\t\t\tstart = -n2 * offset;\n\t\t\tstop = MIN(n2, n1+offset)*(n2+1) - n2*offset;\n\t\t}\n\t\telse {\n\t\t\tstart = offset;\n\t\t\tstop = MIN(n1, n2-offset)*(n2+1) + offset;\n\t\t}\n\t\t\n\t\t/* count = ceil((stop-start)/step) */\n\t\tcount = ((stop-start) / step) + (((stop-start) % step) != 0);\n\t\t\t\n\t\tindices = PyArray_New(&PyArray_Type, 1, &count, \n\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0, NULL);\n\t\tif (indices == NULL) {\n\t\t\tPy_DECREF(self); return NULL;\n\t\t}\n\t\tdptr = (intp *)PyArray_DATA(indices);\n\t\tfor (n1=start; n1descr->type_num;\n\t\ttypecode.itemsize = self->itemsize;\n\t\ttypecode.fortran = 0;\n\n\t\tmydiagonal = PyList_New(0);\n\t\tif (mydiagonal == NULL) {Py_DECREF(self); return NULL;}\n\t\tn1 = self->dimensions[0];\n\t\tfor (i=0; i 3)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"Only Carrays of 1-3 dimensions available.\");\n\t\treturn -1;\n\t}\n\tif ((ap = (PyArrayObject*)PyArray_FromAny(*op, &typecode, nd, nd,\n\t\t\t\t\t\t CARRAY_FLAGS)) == NULL)\n\t\treturn -1;\n\tswitch(nd) {\n\tcase 1:\n\t\t*((char **)ptr) = ap->data;\n\t\tbreak;\n\tcase 2:\n\t\tn = ap->dimensions[0];\n\t\tptr2 = (char **)malloc(n * sizeof(char *));\n\t\tif (!ptr2) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0];\n\t\t}\n\t\t*((char ***)ptr) = ptr2;\n\t\tbreak;\t\t\n\tcase 3:\n\t\tn = ap->dimensions[0];\n\t\tm = ap->dimensions[1];\n\t\tptr3 = (char ***)malloc(n*(m+1) * sizeof(char *));\n\t\tif (!ptr3) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0] + \\\n\t\t\t\t\tj*ap->strides[1];\n\t\t\t}\n\t\t}\n\t\t*((char ****)ptr) = ptr3;\n\t}\n\tmemcpy(dims, ap->dimensions, nd*sizeof(intp));\n\t*op = (PyObject *)ap;\n\treturn 0;\n\n fail:\n\tPyErr_SetString(PyExc_MemoryError, \"No memory.\");\n\treturn -1;\n}\n\n/* Deprecated --- Use PyArray_AsCArray instead */\n\nstatic int \nPyArray_As1D(PyObject **op, char **ptr, int *d1, int typecode) \n{\n\tintp newd1;\n\t\n\tif (PyArray_AsCArray(op, (void *)ptr, &newd1, 1, typecode) == -1)\n\t\treturn -1;\t\n\t*d1 = (int) newd1;\n\treturn 0;\n}\n\n\nstatic int \nPyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) \n{\n\tintp newdims[2];\n\n\tif (PyArray_AsCArray(op, (void *)ptr, newdims, 2, typecode) == -1)\n\t\treturn -1;\n\n\t*d1 = (int ) newdims[0];\n\t*d2 = (int ) newdims[1];\n return 0;\n}\n\n/* End Deprecated */\n\nstatic int \nPyArray_Free(PyObject *op, void *ptr) \n{\n PyArrayObject *ap = (PyArrayObject *)op;\n\t\n if ((ap->nd < 1) || (ap->nd > 3)) \n\t\treturn -1;\n if (ap->nd >= 2) {\n\t\tfree(ptr);\n }\n Py_DECREF(ap);\n return 0;\n}\n\n\nstatic PyObject *\n_swap_and_concat(PyObject *op, int axis, int n)\n{\n\tPyObject *newtup=NULL;\n\tPyObject *otmp, *arr;\n\tint i;\n\n\tnewtup = PyTuple_New(n);\n\tif (newtup==NULL) return NULL;\n\tfor (i=0; i= MAX_DIMS) {\n\t\t\totmp = PyArray_Ravel(mps[i],0);\n\t\t\tPy_DECREF(mps[i]);\n\t\t\tmps[i] = (PyArrayObject *)otmp;\n\t\t}\n\t\tprior2 = PyArray_GetPriority((PyObject *)(mps[i]), 0.0);\n\t\tif (prior2 > prior1) {\n\t\t\tprior1 = prior2;\n\t\t\tsubtype = mps[i]->ob_type;\n\t\t\tret = mps[i];\n\t\t}\n\t}\n\t\n\tnew_dim = 0;\n\tfor(i=0; ind;\n\t\telse {\n\t\t\tif (nd != mps[i]->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"arrays must have same \"\\\n\t\t\t\t\t\t\"number of dimensions\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (!PyArray_CompareLists(mps[0]->dimensions+1, \n\t\t\t\t\t\t mps[i]->dimensions+1, \n\t\t\t\t\t\t nd-1)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"array dimensions must \"\\\n\t\t\t\t\t\t\"agree except for d_0\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t\tif (nd == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"0d arrays can't be concatenated\");\n\t\t\tgoto fail;\n\t\t}\n\t\tnew_dim += mps[i]->dimensions[0];\n\t}\n\t\n\ttmp = mps[0]->dimensions[0];\n\tmps[0]->dimensions[0] = new_dim;\n\tret = (PyArrayObject *)PyArray_New(subtype, nd,\n\t\t\t\t\t mps[0]->dimensions, \n\t\t\t\t\t type_num, NULL, NULL, 0, 0,\n (PyObject *)ret);\n\tmps[0]->dimensions[0] = tmp;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tdata = ret->data;\n\tfor(i=0; idata, numbytes);\n\t\tdata += numbytes;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; ind;\n\tif (n <= 1) {\n\t\tPy_INCREF(ap);\n\t\treturn (PyObject *)ap;\n\t}\n\n\tif (a1 < 0) a1 += n;\n\tif (a2 < 0) a2 += n;\n\tif ((a1 < 0) || (a1 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis1 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tif ((a2 < 0) || (a2 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis2 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tnew_axes = PyTuple_New(n);\n\tfor (i=0; ind;\n\t\tpermutation = (intp *)malloc(n*sizeof(int));\n\t\tfor(i=0; ind+axis;\n\t\t\tif (axis < 0 || axis >= ap->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"invalid axis for this array\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tpermutation[i] = axis;\n\t\t}\n\t}\n\t\n\t/* this allocates memory for dimensions and strides (but fills them\n\t incorrectly), sets up descr, and points data at ap->data. */\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, n, permutation, \n\t\t\t\t\t ap->descr->type_num, NULL,\n\t\t\t\t\t ap->data, ap->itemsize, ap->flags,\n\t\t\t\t\t (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\t/* point at true owner of memory: */\n\tret->base = (PyObject *)ap;\n\tPy_INCREF(ap);\n\t\n\tfor(i=0; idimensions[i] = ap->dimensions[permutation[i]];\n\t\tret->strides[i] = ap->strides[permutation[i]];\n\t}\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n\tif (op && (op != Py_None))\n\t\tPyArray_Free(op, (char *)axes);\n\tfree(permutation);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ret);\n\tif (permutation != NULL) free(permutation);\n\tif (op != Py_None)\n\t\tPyArray_Free(op, (char *)axes);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis) {\n\tintp *counts;\n\tintp n, n_outer, i, j, k, chunk, total;\n\tintp tmp;\n\tint nd;\n\tPyArrayObject *repeats=NULL;\n\tPyObject *ap=NULL;\n\tPyArrayObject *ret=NULL;\n\tchar *new_data, *old_data;\n\n\trepeats = (PyAO *)PyArray_ContiguousFromObject(op, PyArray_INTP, 0, 1);\n\tif (repeats == NULL) return NULL;\n\tnd = repeats->nd;\n\tcounts = (intp *)repeats->data;\n\n\tif ((ap=_check_axis(aop, &axis, CARRAY_FLAGS))==NULL) {\n\t\tPy_DECREF(repeats);\n\t\treturn NULL;\n\t}\n\n\taop = (PyAO *)ap;\n\n\tif (nd == 1)\n\t\tn = repeats->dimensions[0];\n\telse /* nd == 0 */\n\t\tn = aop->dimensions[axis];\n\n\tif (aop->dimensions[axis] != n) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"a.shape[axis] != len(repeats)\");\n\t\tgoto fail;\n\t}\n\n\t\n\tif (nd == 0) \n\t\ttotal = counts[0]*n;\n\telse {\n\t\t\n\t\ttotal = 0;\n\t\tfor(j=0; jdimensions[axis] = total;\n\tret = (PyArrayObject *)PyArray_New(aop->ob_type, aop->nd,\n\t\t\t\t\t aop->dimensions, \n\t\t\t\t\t aop->descr->type_num,\n\t\t\t\t\t NULL, NULL, aop->itemsize, 0,\n\t\t\t\t\t (PyObject *)aop);\n\taop->dimensions[axis] = n;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tnew_data = ret->data;\n\told_data = aop->data;\n\t\n\tchunk = aop->itemsize;\n\tfor(i=axis+1; ind; i++) {\n\t\tchunk *= aop->dimensions[i];\n\t}\n\t\n\tn_outer = 1;\n\tfor(i=0; idimensions[i];\n\n\tfor(i=0; ind < mps[i]->nd) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"too many dimensions\");\n\t\t\tgoto fail;\n\t\t}\n\t\tif (!PyArray_CompareLists(ap->dimensions+(ap->nd-mps[i]->nd),\n\t\t\t\t mps[i]->dimensions, mps[i]->nd)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"array dimensions must agree\");\n\t\t\tgoto fail;\n\t\t}\n\t\tsizes[i] = PyArray_NBYTES(mps[i]);\n\t}\n\t\n\t/* why not ??? \n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tPyErr_SetString(PyExc_NotImplementedError, \n\t\t\t\t\"Not implemented for flexible sizes\");\n\t\treturn NULL;\n\t}\n\t*/\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\telsize = ret->itemsize;\n\tm = PyArray_SIZE(ret);\n\tself_data = (intp *)ap->data;\n\tret_data = ret->data;\n\t\n\tfor (i=0; i= n) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"invalid entry in choice array\");\n\t\t\tgoto fail;\n\t\t}\n\t\toffset = i*elsize;\n\t\tif (offset >= sizes[mi]) {offset = offset % sizes[mi]; }\n\t\tmemmove(ret_data, mps[mi]->data+offset, elsize);\n\t\tret_data += elsize; self_data++;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; idescr->compare(a,b,global_obj);\n}\n\n#define SWAPAXES(op, ap) {\t\t\t\t\t\t\\\n\t\torign = (ap)->nd-1;\t\t\t\t\t\\\n\t\tif (axis != orign) {\t\t\t\t\t\\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\n#define SWAPBACK(op, ap) { \\\n\t\tif (axis != orign) { \\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\nstatic PyObject *\nPyArray_Sort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap=NULL, *store_arr=NULL;\n\tchar *ip;\n\tint i, n, m, elsize, orign;\n\n\tif ((ap = (PyAO*) _check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_CopyFromObject((PyObject *)op, \n\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tPy_DECREF(ap);\n\t\treturn NULL;\n\t}\n\t\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\n\t/* Store global -- allows re-entry -- restore before leaving*/\n\tstore_arr = global_obj; \n\tglobal_obj = ap;\n\t\n\tfor (ip=ap->data, i=0; iitemsize;\n\tconst intp *ipa = ip1;\n\tconst intp *ipb = ip2;\t\n\treturn global_obj->descr->compare(global_data + (isize * *ipa),\n global_data + (isize * *ipb), \n\t\t\t\t\t global_obj);\n}\n\nstatic PyObject *\nPyArray_ArgSort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap, *ret, *store;\n\tintp *ip;\n\tintp i, j, n, m, orign;\n\tint argsort_elsize;\n\tchar *store_ptr;\n\n\tif ((ap = (PyAO *)_check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)op, \n\t\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tip = (intp *)ret->data;\n\targsort_elsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\tstore_ptr = global_data;\n\tglobal_data = ap->data;\n\tstore = global_obj;\n\tglobal_obj = ap;\n\tfor (i=0; idescr->compare;\n\tintp min_i, max_i, i, j;\n\tint location, elsize = ap1->itemsize;\n\tintp elements = ap1->dimensions[ap1->nd-1];\n\tintp n = PyArray_Size((PyObject *)ap2);\n\tintp *rp = (intp *)ret->data;\n\tchar *ip = ap2->data;\n\tchar *vp = ap1->data;\n\n\tfor (j=0; j 0) {\n\t\t\t\t\tif (compare(ip, vp+elsize*(--i), ap2) \\\n\t\t\t\t\t != 0) {\n\t\t\t\t\t\ti = i+1; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmin_i = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (location < 0) {\n\t\t\t\tmax_i = i;\n\t\t\t} else {\n\t\t\t\tmin_i = i+1;\n\t\t\t}\n\t\t}\n\t\t*rp = min_i;\n\t}\n}\n\nstatic PyObject *\nPyArray_SearchSorted(PyArrayObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tint typenum = 0;\n\n\t/* \n PyObject *args;\n args = Py_BuildValue(\"O\",op2);\n\tPy_DELEGATE_ARGS(((PyObject *)op1), searchsorted, args);\n Py_XDECREF(args);\n\t*/\n\n\ttypenum = PyArray_ObjectType((PyObject *)op1, 0);\n\ttypenum = PyArray_ObjectType(op2, typenum);\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)op1, \n\t\t\t\t\t\t\t typenum, \n\t\t\t\t\t\t\t 1, 1);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap2->ob_type, ap2->nd, \n\t\t\t\t\t ap2->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap2);\n\tif (ret == NULL) goto fail;\n\n\tif (ap2->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tlocal_where(ap1, ap2, ret); \n\t\n\tPy_DECREF(ap1);\n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ap1);\n\tPy_XDECREF(ap2);\n\tPy_XDECREF(ret);\n\treturn NULL;\n}\n\n\n\n/* Could perhaps be redone to not make contiguous arrays \n */\n\nstatic PyObject *\nPyArray_InnerProduct(PyObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tintp i, j, l, i1, i2, n1, n2;\n\tint typenum;\n\tintp is1, is2, os;\n\tchar *ip1, *ip2, *op;\n\tintp dimensions[MAX_DIMS], nd;\n\tPyArray_DotFunc *dot;\n\tPyTypeObject *subtype;\n double prior1, prior2;\n\t\n\ttypenum = PyArray_ObjectType(op1, 0); \n\ttypenum = PyArray_ObjectType(op2, typenum);\n\t\t\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tif (ap1->nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\n\n\t/* Need to choose an output array that can hold a sum \n\t -- use priority to determine which subtype.\n\t */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = (ret->descr->dotfunc);\n\t\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\n\t\n\tis1 = ap1->strides[ap1->nd-1]; \n\tis2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\tif (ap2->nd > 1) {\n\t\tmatchDim = ap2->nd - 2;\n\t\totherDim = ap2->nd - 1;\n\t}\n\telse {\n\t\tmatchDim = 0;\n\t\totherDim = 0;\n\t}\n\n\tif (ap2->dimensions[matchDim] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"objects are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-2; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\tif(ap2->nd > 1) {\n\t\tdimensions[j++] = ap2->dimensions[ap2->nd-1];\n\t}\n\t/*\n\tfprintf(stderr, \"nd=%d dimensions=\", nd);\n\t for(i=0; i prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\t\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[matchDim];\n\tif(ap1->nd > 1)\n\t\tis1r = ap1->strides[ap1->nd-2];\n\telse\n\t\tis1r = ap1->strides[ap1->nd-1];\n\tis2r = ap2->strides[otherDim];\n\n\top = ret->data; os = ret->itemsize;\n\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2ob_type, 2, dims, PyArray_TYPE(arr),\n\t\t\t NULL, NULL, elsize, 0, arr);\n\n\tif (ret == NULL) {\n\t\tPy_DECREF(arr);\n\t\treturn NULL;\n\t}\n\t/* do 2-d loop */\n\toptr = PyArray_DATA(ret);\n\tstr2 = elsize*dims[0];\n\tfor (i=0; idimensions[ap1->nd-1];\n\tn2 = ap2->dimensions[ap2->nd-1];\n\n\tif (n1 < n2) { \n\t\tret = ap1; ap1 = ap2; ap2 = ret; \n\t\tret = NULL; i = n1;n1=n2;n2=i;\n\t}\n\tlength = n1;\n\tn = n2;\n\tswitch(mode) {\n\tcase 0:\t\n\t\tlength = length-n+1;\n\t\tn_left = n_right = 0;\n\t\tbreak;\n\tcase 1:\n\t\tn_left = (int)(n/2);\n\t\tn_right = n-n_left-1;\n\t\tbreak;\n\tcase 2:\n\t\tn_right = n-1;\n\t\tn_left = n-1;\n\t\tlength = length+n-1;\n\t\tbreak;\n\tdefault:\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"mode must be 0,1, or 2\");\n\t\tgoto fail;\n\t}\n\t\n\tret = (PyArrayObject *)PyArray_New(ap1->ob_type, 1,\n\t\t\t\t\t &length, typenum, \n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap1);\n\tif (ret == NULL) goto fail;\n\n\t\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"function not available for this type\");\n\t\tgoto fail;\n\t}\n\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data; ip2 = ap2->data+n_left*is2;\n\tn = n-n_left;\n\tfor(i=0; idescr->argmax;\n\tif (arg_func == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"data type not ordered\");\n\t\tgoto fail;\n\t}\n\n\trp = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd-1,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap);\n\tif (rp == NULL) goto fail;\n\n\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) {\n\t\tPyErr_SetString(MultiArrayError, \n\t\t\t\t\"Attempt to get argmax/argmin \"\\\n\t\t\t\t\"of an empty sequence??\");\n\t\tgoto fail;\n\t}\n\tn = PyArray_SIZE(ap)/m;\n\trptr = (intp *)rp->data;\n\tfor (ip = ap->data, i=0; ind + indices->nd - 1;\n for (i=0; i< nd; i++) {\n if (i < axis) {\n shape[i] = self->dimensions[i];\n n *= shape[i];\n } else {\n if (i < axis+indices->nd) {\n shape[i] = indices->dimensions[i-axis];\n m *= shape[i];\n } else {\n shape[i] = self->dimensions[i-indices->nd+1];\n chunk *= shape[i];\n }\n }\n }\n ret = (PyArrayObject *)PyArray_New(self->ob_type, nd, shape, \n\t\t\t\t\t self->descr->type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)self);\n\t\n if (ret == NULL) goto fail;\n\t\n max_item = self->dimensions[axis];\n chunk = chunk * ret->itemsize;\n src = self->data;\n dest = ret->data;\n\t\n for(i=0; idata))[j];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"Index out of range for \"\\\n\t\t\t\t\t\t\"array\");\n goto fail;\n }\n memmove(dest, src+tmp*chunk, chunk);\n dest += chunk;\n }\n src += chunk*max_item;\n }\n\t\n PyArray_INCREF(ret);\n\n Py_XDECREF(indices);\n Py_XDECREF(self);\n\n return (PyObject *)ret;\n\t\n\t\n fail:\n Py_XDECREF(ret);\n Py_XDECREF(indices);\n Py_XDECREF(self);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Put(PyArrayObject *self, PyObject *indices0, PyObject* values0) \n{\n PyArrayObject *indices, *values;\n int i, chunk, ni, max_item, nv, tmp; \n char *src, *dest;\n\n indices = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be contiguous\");\n return NULL;\n }\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n indices = (PyArrayObject *)PyArray_ContiguousFromObject(indices0, PyArray_INTP, 0, 0);\n if (indices == NULL) goto fail;\n ni = PyArray_SIZE(indices);\n\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromObject(values0, self->descr->type_num, \n\t\t\t\t\t 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\n if (nv > 0) { /* nv == 0 for a null array */\n for(i=0; idata + chunk * (i % nv);\n tmp = ((intp *)(indices->data))[i];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \"Index out of range for array\");\n goto fail;\n }\n memmove(dest + tmp * chunk, src, chunk);\n }\n }\n\n Py_XDECREF(values);\n Py_XDECREF(indices);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(indices);\n Py_XDECREF(values);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_PutMask(PyArrayObject *self, PyObject *mask0, PyObject* values0) \n{\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv, tmp, thistype;\n char *src, *dest;\n\n mask = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must \"\\\n\t\t\t\t\"be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must be contiguous\");\n return NULL;\n }\n\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n mask = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromObject(mask0, PyArray_BOOL, 0, 0);\n if (mask == NULL) goto fail;\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: mask and data must be \"\\\n\t\t\t\t\"the same size.\");\n goto fail;\n }\n\n\tthistype = self->descr->type_num;\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromObject(values0, thistype, 0, 0);\n\tif (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\t /* zero if null array */\n if (nv > 0) {\n\t\tfor(i=0; idata + chunk * (i % nv);\n\t\t\ttmp = ((Bool *)(mask->data))[i];\n\t\t\tif (tmp) {\n\t\t\t\tmemmove(dest + i * chunk, src, chunk);\n\t\t\t\tif (thistype == PyArray_OBJECT)\n\t\t\t\t\tPy_INCREF(*((PyObject **)src));\n\t\t\t}\n\t\t}\n }\n\n Py_XDECREF(values);\n Py_XDECREF(mask);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(mask);\n Py_XDECREF(values);\n return NULL;\n}\n\n\n/* This conversion function can be used with the \"O&\" argument for\n PyArg_ParseTuple. It will immediately return an object of array type\n or will convert to a CARRAY any other object. \n\n If you use PyArray_Converter, you must DECREF the array when finished\n as you get a new reference to it.\n*/\n \nstatic int \nPyArray_Converter(PyObject *object, PyObject **address) \n{\n if (PyArray_Check(object)) {\n *address = object;\n\t\tPy_INCREF(object);\n return PY_SUCCEED;\n }\n else {\n\t\t*address = PyArray_FromAny(object, NULL, 0, 0, CARRAY_FLAGS);\n\t\tif (*address == NULL) return PY_FAIL;\n\t\treturn PY_SUCCEED;\n }\n}\n\nstatic int\nPyArray_BoolConverter(PyObject *object, Bool *val)\n{\n\tif (PyObject_IsTrue(object)) *val=TRUE;\n\telse *val=FALSE;\n\tif (PyErr_Occurred()) return PY_FAIL;\n\treturn PY_SUCCEED;\n}\n\n\nstatic int\nPyArray_TypestrConvert(int itemsize, int gentype)\n{\n\tregister int newtype = gentype;\n\t\n\tif (gentype == PyArray_SIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_INT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_INT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_INT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_INT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_INT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\n\t}\n\n\telse if (gentype == PyArray_UNSIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_UINT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_UINT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_UINT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_UINT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_UINT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (gentype == PyArray_FLOATINGLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 4:\n\t\t\tnewtype = PyArray_FLOAT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_FLOAT64;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 10:\n\t\t\tnewtype = PyArray_FLOAT80;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 12:\n\t\t\tnewtype = PyArray_FLOAT96;\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_FLOAT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\t\n\telse if (gentype == PyArray_COMPLEXLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 8:\n\t\t\tnewtype = PyArray_COMPLEX64;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\tnewtype = PyArray_COMPLEX128;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 20:\n\t\t\tnewtype = PyArray_COMPLEX160;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 24:\n\t\t\tnewtype = PyArray_COMPLEX192;\t\t\t\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 32:\n\t\t\tnewtype = PyArray_COMPLEX256;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\n\treturn newtype;\n}\n\n\n/* this function takes a Python object which exposes the (single-segment)\n buffer interface and returns a pointer to the data segment\n \n You should increment the reference count by one of buf->base\n if you will hang on to a reference\n\n You only get a borrowed reference to the object. Do not free the\n memory...\n*/\n\n\nstatic int\nPyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf)\n{\n int buflen;\n\n buf->ptr = NULL;\n buf->flags = WRITEABLE;\n buf->base = NULL;\n\n\tif (obj == Py_None)\n\t\treturn PY_SUCCEED;\n\n if (PyObject_AsWriteBuffer(obj, &(buf->ptr), &buflen) < 0) {\n PyErr_Clear();\n buf->flags &= ~WRITEABLE;\n if (PyObject_AsReadBuffer(obj, (const void **)&(buf->ptr), \n &buflen) < 0)\n return PY_FAIL;\n }\n buf->len = (intp) buflen;\n \n /* Point to the base of the buffer object if present */\n if (PyBuffer_Check(obj)) buf->base = ((PyArray_Chunk *)obj)->base;\n if (buf->base == NULL) buf->base = obj;\n \n return PY_SUCCEED; \n}\n\n\n\n/* This function takes a Python sequence object and allocates and\n fills in an intp array with the converted values.\n\n **Remember to free the pointer seq.ptr when done using\n PyDimMem_FREE(seq.ptr)**\n*/\n\nstatic int\nPyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)\n{\n int len;\n int nd;\n\n seq->ptr = NULL;\n if (obj == Py_None) return PY_SUCCEED;\n len = PySequence_Size(obj);\n if (len == -1) { /* Check to see if it is a number */\n if (PyNumber_Check(obj)) len = 1;\n }\n if (len < 0) {\n PyErr_SetString(PyExc_TypeError, \n \"Expected sequence object with len >= 0\");\n return PY_FAIL;\n }\n if (len > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError, \"Sequence too large, \" \\\n \"must be smaller than %d\", MAX_DIMS);\n return PY_FAIL;\n }\n\tif (len > 0) {\n\t\tseq->ptr = PyDimMem_NEW(len);\n\t\tif (seq->ptr == NULL) {\n\t\t\tPyErr_NoMemory();\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n seq->len = len;\n nd = PyArray_IntpFromSequence(obj, (intp *)seq->ptr, len);\n if (nd == -1 || nd != len) goto fail;\n return PY_SUCCEED;\n\n fail:\n\tPyDimMem_FREE(seq->ptr);\n\treturn PY_FAIL;\n}\n\n/* This function takes a Python object representing a type and converts it \n to a C type_num and an itemsize (elements of PyArray_Typecode structure)\n \n Many objects can be used to represent a type.\n */\n\nstatic int\nPyArray_TypecodeConverter(PyObject *obj, PyArray_Typecode *at)\n{\n char *type;\n PyArray_Descr *descr;\n int check_num=PyArray_NOTYPE+10;\n\tint len;\n\tPyObject *item, *attr=NULL;\n\n\tat->itemsize = 0;\n if (obj == Py_None) {\n at->type_num = PyArray_NOTYPE;\n return PY_SUCCEED;\n }\n\n if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, \n &PyGenericArrType_Type)) {\n PyArray_TypecodeFromTypeObject(obj, at);\n return PY_SUCCEED;\n }\n\n\n\t/* type object could be an array */\n\tif (PyArray_Check(obj)) {\n\t\tat->type_num = PyArray_TYPE(obj);\n\t\tat->itemsize = PyArray_ITEMSIZE(obj);\n\t\treturn PY_SUCCEED;\n\t}\n\n\t/* or an array scalar */\n if (PyArray_IsScalar(obj, Generic)) {\n PyArray_TypecodeFromScalar(obj, at);\n return PY_SUCCEED;\n }\n\n\t/* or a typecode string */\n\n\tif (PyString_Check(obj)) {\n\t\t/* Check for a string typecode. */\n\t\ttype = PyString_AS_STRING(obj);\n\t\tlen = PyString_GET_SIZE(obj);\t\t\n\t\tif (len > 0) {\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tif (len > 1) {\n\t\t\tat->itemsize = atoi(type+1);\n\t\t\t/* When specifying length of UNICODE\n\t\t\t the number of characters is given to match \n\t\t\t the STRING interface. Each character can be\n\t\t\t more than one byte and itemsize must be\n\t\t\t the number of bytes.\n\t\t\t*/\n\t\t\tif (check_num == PyArray_UNICODELTR ||\t\\\n\t\t\t check_num == PyArray_UNICODE) \n\t\t\t at->itemsize *= sizeof(Py_UNICODE);\n\n\t\t\t/* Support for generic processing */\n\t\t\telse if ((check_num != PyArray_STRINGLTR) &&\n\t\t\t\t (check_num != PyArray_VOIDLTR) &&\n\t\t\t\t (check_num != PyArray_STRING) &&\n\t\t\t\t (check_num != PyArray_VOID)) {\n\t\t\t\tcheck_num = \\\n\t\t\t\t\tPyArray_TypestrConvert(at->itemsize,\n\t\t\t\t\t\t\t check_num);\n\t\t\t at->itemsize = 0;\n\t\t\t\tif (check_num == PyArray_NOTYPE) goto fail;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Arbitray object with dtypenum and itemsize attributes. */\n\telse if (PyObject_HasAttrString(obj, \"dtypenum\") && \n\t PyObject_HasAttrString(obj, \"itemsize\")) {\n\t\tattr = PyObject_GetAttrString(obj, \"dtypenum\");\n\t\tcheck_num = PyInt_AsLong(attr);\n\t\tif (PyErr_Occurred()) { /* not an integer, try character */\n\t\t\tPyErr_Clear();\n\t\t\ttype = PyString_AsString(attr);\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tPy_XDECREF(attr);\n\t\tif (!PyErr_Occurred()) {\n\t\t\tattr = PyObject_GetAttrString(obj, \"itemsize\");\n\t\t\tat->itemsize = PyInt_AsLong(attr);\n\t\t\tPy_XDECREF(attr);\n\t\t}\t\t\t\n\t}\t\t\n\telse if (PyType_Check(obj)) {\n\t\tcheck_num = PyArray_OBJECT;\n\t\tif (obj == (PyObject *)(&PyInt_Type)) \n\t\t\tcheck_num = PyArray_LONG;\n\t\telse if (obj == (PyObject *)(&PyBool_Type))\n\t\t\tcheck_num = PyArray_BOOL;\n\t\telse if (obj == (PyObject *)(&PyFloat_Type)) \n\t\t\tcheck_num = PyArray_DOUBLE;\n\t\telse if (obj == (PyObject *)(&PyComplex_Type)) \n\t\t\tcheck_num = PyArray_CDOUBLE;\n else if (obj == (PyObject *)(&PyString_Type))\n check_num = PyArray_STRING;\n else if (obj == (PyObject *)(&PyUnicode_Type))\n check_num = PyArray_UNICODE;\n\t}\t\n else { /* Default -- try integer conversion */\n check_num = PyInt_AsLong(obj);\n\t}\n\n\tif (PyErr_Occurred()) goto fail;\n\n\t/*\n\tif (check_num == PyArray_NOTYPE) return PY_FAIL;\n\t*/\n\tif (check_num == PyArray_NOTYPE) {\n\t\tat->type_num = PyArray_NOTYPE;\n\t\tat->itemsize = 0;\n\t\treturn PY_SUCCEED;\n\t}\n\n if ((descr = PyArray_DescrFromType(check_num))==NULL) {\n\t\t/* Now check to see if the object is registered\n\t\t in typeDict */\n\t\tif (typeDict != NULL) {\n\t\t\titem = PyDict_GetItem(typeDict, obj);\n\t\t\tif (item) {\n\t\t\t\tPyArray_TypecodeFromTypeObject(obj, at);\n\t\t\t\tPyErr_Clear();\n\t\t\t\treturn PY_SUCCEED;\n\t\t\t}\n\t\t}\n return PY_FAIL;\n\t}\n\t\n at->type_num = descr->type_num;\n\tif (at->itemsize == 0) at->itemsize = descr->elsize;\n\t\n return PY_SUCCEED;\n fail:\n\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\"data type not understood\");\n\treturn PY_FAIL;\n}\t\n\n\n/* This function returns true if the two typecodes are \n equivalent (same basic kind and same itemsize).\n*/\n\nstatic Bool\nPyArray_EquivalentTypes(PyArray_Typecode *typ1, PyArray_Typecode *typ2)\n{\n\tregister int typenum1=typ1->type_num;\n\tregister int typenum2=typ2->type_num;\n\tregister int size1=typ1->itemsize;\n\tregister int size2=typ2->itemsize;\n\n\tif (size1 != size2) return FALSE;\n\tif (typenum1==typenum2) return TRUE;\n\n\t/* If we are here then size1 == size2 */\n\tif (typenum1 < PyArray_FLOAT) {\n\t\tif (PyTypeNum_ISBOOL(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISBOOL(typenum2));\n\t\telse if (PyTypeNum_ISUNSIGNED(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISUNSIGNED(typenum2));\n\t\telse \n\t\t\treturn (Bool)(PyTypeNum_ISSIGNED(typenum2));\n\t}\n\telse {\n\t\tif (PyTypeNum_ISFLOAT(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISFLOAT(typenum2));\n\t\telse if (PyTypeNum_ISCOMPLEX(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISCOMPLEX(typenum2));\n\t}\n\t/* Default size1 != size2 and typenum1 != typenum2 */\n\treturn FALSE;\t\n}\n\nstatic Bool \nPyArray_EquivArrTypes(PyArrayObject *a1, PyArrayObject *a2)\n{\n PyArray_Typecode type1={0,0,0};\n PyArray_Typecode type2={0,0,0};\n\n\ttype1.type_num = PyArray_TYPE(a1);\n\ttype2.type_num = PyArray_TYPE(a2);\n\ttype1.itemsize = PyArray_ITEMSIZE(a1);\n\ttype2.itemsize = PyArray_ITEMSIZE(a2);\n\t\t\t\n return PyArray_EquivalentTypes(&type1, &type2);\n}\n\n\n/*** END C-API FUNCTIONS **/\n\n\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\n\nstatic char doc_fromobject[] = \"array(object, dtype=None, copy=1, fortran=0) will return a new array formed from the given object type given. Object can anything with an __array__ method, or any (nested) sequence. If no type is given, then the type will be determined as the minimum type required to hold the objects in the sequence. If copy is zero and sequence is already an array with the right type, a reference will be returned. If the sequence is an array, type can be used only to upcast the array. For downcasting use .astype(t) method.\";\n\nstatic PyObject *\n_array_fromobject(PyObject *ignored, PyObject *args, PyObject *kws)\n{\n\tPyObject *op, *ret=NULL;\n\tstatic char *kwd[]= {\"object\", \"dtype\", \"copy\", \"fortran\", NULL};\n\tBool copy=TRUE;\n\tPyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_NOTYPE, 0, 0};\n\tint type_num;\n\tBool fortran=FALSE;\n\tint flags=0;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|O&O&O&\", kwd, &op, \n\t\t\t\t\tPyArray_TypecodeConverter,\n &type, \n\t\t\t\t\tPyArray_BoolConverter, ©, \n\t\t\t\t\tPyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\ttype_num = type.type_num;\n\n\t/* fast exit if simple call */\n\tif (PyArray_Check(op) && (copy==0) &&\t\t\t\\\n\t (fortran == PyArray_CHKFLAGS(op, FORTRAN))) {\n\t\tif (type_num == PyArray_NOTYPE) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t\t/* One more chance */\n\t\toldtype.type_num = PyArray_TYPE(op);\n\t\toldtype.itemsize = PyArray_ITEMSIZE(op);\n\t\tif (PyArray_EquivalentTypes(&oldtype, &type)) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t}\n\n\ttype.fortran = fortran; \n\tif (copy) {\n\t\tflags = ENSURECOPY;\n\t}\n\n\tif ((ret = PyArray_FromAny(op, &type, 0, 0, flags)) == NULL) \n\t\treturn NULL;\n\n\treturn _ARET(ret);\n}\n\nstatic PyObject *\nPyArray_Empty(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n \n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n PyArray_FillObjectArray(ret, Py_None);\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic char doc_empty[] = \"empty((d1,...,dn),dtype=intp,fortran=0) will return a new array\\n of shape (d1,...,dn) and given type with all its entries uninitialized. This can be faster than zeros.\";\n\nstatic PyObject *\narray_empty(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Empty(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_scalar[] = \"scalar(dtypestr,obj) will return a new scalar array of the given type initialized with obj. Mainly for pickle support. typestr must be a valid data typestr (complete with < > or |). If dtypestr is object, then obj can be any object, otherwise obj must be a string. If obj is not given it will be interpreted as None for object type and zeros for all other types.\";\n\nstatic PyObject *\narray_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"dtypestr\",\"obj\", NULL};\n\tPyArray_Typecode typecode;\n\tPyObject *obj=NULL;\n\tchar *typestr;\n\tint typestrlen;\n\tint swap, alloc=0;\n\tvoid *dptr;\n\tPyObject *ret;\n\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"z#|O\",\n\t\t\t\t\t kwlist, &typestr, &typestrlen,\n\t\t\t\t\t &obj)) \n\t\treturn NULL;\n\t\n\tif (_array_typecode_fromstr(typestr, &swap, &typecode) < 0) \n\t\treturn NULL;\n\t\n\tif (typecode.itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\t\t\\\n\t\t\t\t\"itemsize cannot be zero\");\n\t\treturn NULL;\n\t}\n\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (obj == NULL) obj = Py_None;\n\t\tdptr = &obj;\n\t\tswap = 0;\n\t}\n\telse {\n\t\tif (obj == NULL) {\n\t\t\tdptr = malloc(typecode.itemsize);\n\t\t\tif (dptr == NULL) {\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tmemset(dptr, '\\0', typecode.itemsize);\n\t\t\talloc = 1;\n\t\t}\n\t\telse {\n\t\t\tif (!PyString_Check(obj)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"initializing object must \"\\\n\t\t\t\t\t\t\"be a string.\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif (PyString_GET_SIZE(obj) < typecode.itemsize) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"initialization string is too\"\\\n\t\t\t\t\t\t\" small\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tdptr = PyString_AS_STRING(obj);\n\t\t}\n\t}\n\n\tret = PyArray_Scalar(dptr, typecode.type_num,\n\t\t\t typecode.itemsize, swap); \n\n\t/* free dptr which contains zeros */\n\tif (alloc) free(dptr);\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_Zeros(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n\t\tPyObject *zero = PyInt_FromLong(0);\n PyArray_FillObjectArray(ret, zero);\n Py_DECREF(zero);\n\t}\n\telse {\t\t\n\t\tmemset(ret->data, 0, n*(ret->itemsize));\n\t}\n\treturn (PyObject *)ret;\n\n}\n\nstatic char doc_zeros[] = \"zeros((d1,...,dn),dtype=intp,fortran=0) will return a new array of shape (d1,...,dn) and type typecode with all it's entries initialized to zero.\";\n\n\nstatic PyObject *\narray_zeros(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Zeros(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_set_typeDict[] = \"set_typeDict(dict) set the internal \"\\\n\t\"dictionary that can look up an array type using a registered \"\\\n\t\"code\";\n\nstatic PyObject *\narray_set_typeDict(PyObject *ignored, PyObject *args)\n{\n\tPyObject *dict;\n\tif (!PyArg_ParseTuple(args, \"O\", &dict)) return NULL;\n\tPy_XDECREF(typeDict); /* Decrement old reference (if any)*/\n\ttypeDict = dict;\n\tPy_INCREF(dict); /* Create an internal reference to it */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_fromString[] = \"fromstring(string, dtype=intp, count=-1, swap=False) returns a new 1d array initialized from the raw binary data in string. If count is positive, the new array will have count elements, otherwise it's size is determined by the size of string.\";\n\nstatic PyObject *\narray_fromString(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyArrayObject *ret; \n\tchar *data;\n\tlonglong nin=-1;\n\tintp s, n;\n\tstatic char *kwlist[] = {\"string\", \"dtype\", \"count\", \"swap\",NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint itemsize;\n\tint swapped=FALSE;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"s#|O&LO&\", kwlist, \n\t\t\t\t\t &data, &s, \n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &swapped)) {\n\t\treturn NULL;\n\t}\n\t\n\tn = (intp) nin;\n\n\titemsize = type.itemsize;\n\tif (itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \"zero-valued itemsize.\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype.type_num, NULL, \n\t\t\t\t\t\tNULL, itemsize, 0,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\t\n\tmemcpy(ret->data, data, n*ret->itemsize);\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPyArray_INCREF(ret);\n\treturn (PyObject *)ret;\n}\n\n\n/* This needs an open file object and reads it in directly. \n memory-mapped files handled differently through buffer interface.\n\nfile pointer number in resulting 1d array \n(can easily reshape later, -1 for to end of file)\ntype of array\nsep is a separator string for character-based data (or NULL for binary)\n \" \" means whitespace\n*/\n\n\nstatic int\n_fill_in_itemsize(PyArray_Typecode *typecode)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(typecode->type_num);\n\tif (descr==NULL) return -1;\n\ttypecode->itemsize = descr->elsize;\n\treturn 0;\n}\n\n\nstatic PyObject *\nPyArray_FromFile(FILE *fp, PyArray_Typecode *typecode, intp num, char *sep)\n{\n\tPyArrayObject *r;\n\tsize_t nread = 0;\n\tPyArray_ScanFunc *scan;\n\n\tif (typecode->itemsize == 0) {\n\t\tif (_fill_in_itemsize(typecode) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tif (num == -1 && sep == NULL) { /* Get size for binary file*/\n\t\tintp start, numbytes;\n\t\tstart = (intp )ftell(fp);\n\t\tfseek(fp, 0, SEEK_END);\n\t\tnumbytes = (intp )ftell(fp) - start;\n\t\tfseek(fp, (long) start, SEEK_SET);\n\t\tif (numbytes == -1) {\n\t\t\tPyErr_SetString(PyExc_IOError, \"Could not seek in file.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tif (typecode->itemsize == 0) {\n\t\t\ttypecode->itemsize = numbytes;\n\t\t\tnum = 1;\n\t\t}\n\t\telse {\n\t\t\tnum = numbytes / typecode->itemsize;\n\t\t}\n\t}\n\t\n\tif (sep==NULL) { /* binary data */\n\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &num, \n\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t typecode->itemsize, 0, NULL);\n\t\tif (r==NULL) return NULL;\n\t\tnread = fread(r->data, typecode->itemsize, num, fp);\n\t}\n\telse { /* character reading */\n\t\tintp i;\n\t\tchar *dptr;\n\t\tint done=0;\n\n\t\tscan = PyArray_DescrFromType(typecode->type_num)->scanfunc;\n\t\tif (scan == NULL) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Don't know how to read \"\t\\\n\t\t\t\t\t\"character files with that \"\t\\\n\t\t\t\t\t\"array type\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (num != -1) { /* number to read is known */\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &num, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\tdptr = r->data;\n\t\t\tfor (i=0; i < num; i++) {\n\t\t\t\tif (done) break;\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\t\t\t\tif (done < -2) break;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t\telse { /* we have to watch for the end of the file and \n\t\t\t reallocate at the end */\n#define _FILEBUFNUM 4096\n\t\t\tintp thisbuf=0;\n\t\t\tintp size = _FILEBUFNUM;\n\t\t\tintp bytes;\n\t\t\tintp totalbytes;\n\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &size, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\ttotalbytes = bytes = size * typecode->itemsize;\n\t\t\tdptr = r->data;\n\t\t\twhile (!done) {\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\n\t\t\t\t/* end of file reached trying to \n\t\t\t\t scan value. done is 1 or 2\n\t\t\t\t if end of file reached trying to\n\t\t\t\t scan separator. Still good value.\n\t\t\t\t*/\n\t\t\t\tif (done < -2) break;\n\t\t\t\tthisbuf += 1;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t\tif (!done && thisbuf == size) {\n\t\t\t\t\ttotalbytes += bytes;\n\t\t\t\t\tr->data = PyDataMem_RENEW(r->data, \n\t\t\t\t\t\t\t\t totalbytes);\n\t\t\t\t\tdptr = r->data + (totalbytes - bytes);\n\t\t\t\t\tthisbuf = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tr->data = PyDataMem_RENEW(r->data, nread*r->itemsize);\n\t\t\tPyArray_DIM(r,0) = nread;\n\t\t\tnum = nread;\n#undef _FILEBUFNUM\n\t\t}\n\t}\n\tif (nread < num) {\n\t\tfprintf(stderr, \"%ld items requested but only %ld read\\n\", \n\t\t\t(long) num, (long) nread);\n\t\tr->data = PyDataMem_RENEW(r->data, nread * r->itemsize);\n\t\tPyArray_DIM(r,0) = nread;\n\t}\n\treturn (PyObject *)r;\n}\n\nstatic char doc_fromfile[] = \\\n\t\"fromfile(file=, dtype=intp, count=-1, sep='')\\n\"\\\n\t\"\\n\"\\\n\t\" Return an array of the given data type from a \\n\"\\\n\t\" (text or binary) file. The file argument can be an open file\\n\"\\\n\t\" or a string with the name of a file to read from. If\\n\"\\\n\t\" count==-1, then the entire file is read, otherwise count is\\n\"\\\n\t\" the number of items of the given type read in. If sep is ''\\n\"\\\n\t\" then read a binary file, otherwise it gives the separator\\n\"\\\n\t\" between elements in a text file.\\n\"\\\n\t\"\\n\"\\\n\t\" WARNING: This function should be used sparingly, as it is not\\n\"\\\n\t\" a robust method of persistence. But it can be useful to\\n\"\\\n\t\" read in simply-formatted or binary data quickly.\";\n\nstatic PyObject *\narray_fromfile(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *file=NULL, *ret;\n\tFILE *fp;\n\tchar *sep=\"\";\n\tchar *mode=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"file\", \"dtype\", \"count\", \"sep\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Ls\", kwlist, \n\t\t\t\t\t &file,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &sep)) {\n\t\treturn NULL;\n\t}\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"rb\";\n\t\telse mode=\"r\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfp = PyFile_AsFile(file);\n\tif (fp == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be an open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_FromFile(fp, &type, (intp) nin, sep);\n\tPy_DECREF(file);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_FromBuffer(PyObject *buf, PyArray_Typecode *type, \n\t\t intp count, int swapped) \n{\n\tPyArrayObject *ret;\n\tchar *data;\n\tint ts;\n\tintp s, n;\n\tint itemsize;\n\tint write=1;\n\n\tif (type->type_num == PyArray_OBJECT) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Cannot create an OBJECT array from memory\"\\\n\t\t\t\t\" buffer.\");\n\t\treturn NULL;\n\t}\n\tif (type->itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Itemsize cannot be zero in type\");\n\t\treturn NULL;\n\t}\n\n\tif (PyObject_AsWriteBuffer(buf, (void *)&data, &ts)==-1) {\n\t\twrite = 0;\n\t\tPyErr_Clear();\n\t\tif (PyObject_AsReadBuffer(buf, (void *)&data, &ts)==-1) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\ts = (intp)ts;\t\n\tn = (intp)count;\n\titemsize = type->itemsize;\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype->type_num, NULL, \n\t\t\t\t\t\tdata, itemsize, DEFAULT_FLAGS,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\n\tif (!write) ret->flags &= ~WRITEABLE;\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPy_INCREF(buf);\n\t/* Store a reference for decref on deallocation */\n\tret->base = buf;\n\tPyArray_UpdateFlags(ret, ALIGNED);\n\treturn (PyObject *)ret; \t\n}\n\nstatic char doc_frombuffer[] = \\\n\t\"frombuffer(buffer=, dtype=intp, count=-1, swap=0)\\n\"\\\n\t\"\\n\"\t\t\t\t\t\t\t\t\\\n\t\" Returns a 1-d array of data type dtype from buffer. The buffer\\n\"\\\n\t\" argument must be an object that exposes the buffer interface.\\n\"\\\n\t\" If count is -1 then the entire buffer is used, otherwise, count\\n\"\\\n\t\" is the size of the output. If the buffer has data that is out\\n\" \\\n\t\" not in machine byte-order, than set swap=1. The data will not\\n\"\n\t\" be byteswapped, but the array will manage it in future\\n\"\\\n\t\" operations.\\n\";\n\nstatic PyObject *\narray_frombuffer(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *obj=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"buffer\", \"dtype\", \"count\", \n\t\t\t\t \"swap\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint swapped=0;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Li\", kwlist, \n\t\t\t\t\t &obj,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &swapped)) {\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_FromBuffer(obj, &type, (intp)nin, swapped);\n}\n\n\n\nstatic char doc_concatenate[] = \"concatenate((a1,a2,...),axis=None).\";\n\nstatic PyObject *\narray_concatenate(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *a0;\n\tint axis=0;\n\tstatic char *kwlist[] = {\"seq\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist,\n\t\t\t\t\t &a0,\n\t\t\t\t\t PyArray_AxisConverter, &axis))\n\t\treturn NULL;\n\treturn PyArray_Concatenate(a0, axis);\n}\n\nstatic char doc_innerproduct[] = \\\n\t\"inner(a,b) returns the dot product of two arrays, which has\\n\"\\\n\t\"shape a.shape[:-1] + b.shape[:-1] with elements computed by\\n\" \\\n\t\"the product of the elements from the last dimensions of a and b.\";\n\nstatic PyObject *array_innerproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *b0, *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a0, &b0)) return NULL;\n\t\n\treturn _ARET(PyArray_InnerProduct(a0, b0));\n}\n\nstatic char doc_matrixproduct[] = \\\n\t\"dot(a,v) returns matrix-multiplication between a and b. \\n\"\\\n\t\"The product-sum is over the last dimension of a and the \\n\"\\\n\t\"second-to-last dimension of b.\";\n\nstatic PyObject *array_matrixproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *v, *a;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a, &v)) return NULL;\n\t\n\treturn _ARET(PyArray_MatrixProduct(a, v));\n}\n\nstatic char doc_fastCopyAndTranspose[] = \"_fastCopyAndTranspose(a)\";\n\nstatic PyObject *array_fastCopyAndTranspose(PyObject *dummy, PyObject *args) {\n\tPyObject *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &a0)) return NULL;\n\t\n\treturn _ARET(PyArray_CopyAndTranspose(a0));\n}\n\nstatic char doc_correlate[] = \"cross_correlate(a,v, mode=0)\";\n\nstatic PyObject *array_correlate(PyObject *dummy, PyObject *args, PyObject *kwds) {\n\tPyObject *shape, *a0;\n\tint mode=0;\n\tstatic char *kwlist[] = {\"a\", \"v\", \"mode\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO|i\", kwlist, \n\t\t\t\t\t &a0, &shape, &mode)) return NULL;\n\t\n\treturn PyArray_Correlate(a0, shape, mode);\n}\n\n\nstatic PyObject *\nPyArray_Arange(double start, double stop, double step, int type_num)\n{\n\tintp length, i;\n\tPyObject *range;\n\tchar *rptr;\n\tint elsize, type;\n\tdouble value;\n\tPyArray_Descr *dbl_descr;\n\n\tlength = (intp ) ceil((stop - start)/step);\n \n\tif (length <= 0) {\n\t\tlength = 0;\n\t\treturn PyArray_New(&PyArray_Type, 1, &length, type_num,\n\t\t\t\t NULL, NULL, 0, 0, NULL);\n\t}\n\n\trange = PyArray_New(&PyArray_Type, 1, &length, type_num, \n\t\t\t NULL, NULL, 0, 0, NULL);\n\tif (range == NULL) return NULL;\n\tdbl_descr = PyArray_DescrFromType(PyArray_DOUBLE);\n \n\trptr = ((PyArrayObject *)range)->data;\n\telsize = ((PyArrayObject *)range)->itemsize;\n\ttype = ((PyArrayObject *)range)->descr->type_num;\n\tfor (i=0; i < length; i++) {\n\t\tvalue = start + i*step;\n\t\tdbl_descr->cast[type]((char*)&value, rptr, 1, NULL, \n\t\t\t\t (PyArrayObject *)range);\n\t\trptr += elsize;\n\t}\n \n\treturn range;\n}\n\n\nstatic char doc_arange[] = \"arange(start, stop=None, step=1, dtype=intp)\\n\\n Just like range() except it returns an array whose type can be\\n specified by the keyword argument typecode.\";\n\nstatic PyObject *\narray_arange(PyObject *ignored, PyObject *args, PyObject *kws) {\n\tPyObject *o_start=NULL, *o_stop=Py_None, *o_step=NULL;\n\tstatic char *kwd[]= {\"start\", \"stop\", \"step\", \"dtype\", NULL};\n\tdouble start, stop, step;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0};\n\tint type_num;\n\tint deftype = PyArray_INTP;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|OOO&\", kwd, &o_start,\n\t\t\t\t\t&o_stop, &o_step, \n\t\t\t\t\tPyArray_TypecodeConverter, \n\t\t\t\t\t&typecode)) \n\t\treturn NULL;\n\n\tdeftype = PyArray_ObjectType(o_start, deftype);\n\tif (o_stop != Py_None) {\n\t\tdeftype = PyArray_ObjectType(o_stop, deftype);\n\t}\n\tif (o_step != NULL) {\n\t\tdeftype = PyArray_ObjectType(o_step, deftype);\n\t}\n\n\ttype_num = typecode.type_num;\n\tif (type_num == PyArray_NOTYPE) {\n\t\ttype_num = deftype;\n\t}\n\n\tstart = PyFloat_AsDouble(o_start);\n\tif error_converting(start) return NULL;\n\n\tif (o_step == NULL) {\n\t\tstep = 1;\n\t}\n\telse {\n\t\tstep = PyFloat_AsDouble(o_step);\n\t\tif error_converting(step) return NULL;\n\t}\n\n\tif (o_stop == Py_None) {\n\t\tstop = start;\n\t\tstart = 0;\n\t}\n\telse {\n\t\tstop = PyFloat_AsDouble(o_stop);\n\t\tif error_converting(stop) return NULL;\n\t}\n\n\treturn PyArray_Arange(start, stop, step, type_num);\n}\n\n#undef _ARET\n\n/*****\n static char doc_arrayMap[] = \"arrayMap(func, [a1,...,an])\";\n\n static PyObject *array_arrayMap(PyObject *dummy, PyObject *args) {\n PyObject *shape, *a0;\n \n if (PyArg_ParseTuple(args, \"OO\", &a0, &shape) == NULL) return NULL;\n\t\n return PyArray_Map(a0, shape);\n }\n*****/\n\nstatic char \ndoc_set_string_function[] = \"set_string_function(f, repr=1) sets the python function f to be the function used to obtain a pretty printable string version of a array whenever a array is printed. f(M) should expect a array argument M, and should return a string consisting of the desired representation of M for printing.\";\n\nstatic PyObject *\narray_set_string_function(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *op;\n\tint repr=1;\n\tstatic char *kwlist[] = {\"f\", \"repr\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O|i\", kwlist, \n\t\t\t\t\t&op, &repr)) return NULL; \n\tPyArray_SetStringFunction(op, repr);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char \ndoc_set_ops_function[] = \"set_numeric_ops(op=func, ...) sets some or all of the number methods for all array objects. Don't forget **dict can be used as the argument list. Returns the functions that were replaced -- can be stored and set later.\";\n\nstatic PyObject *\narray_set_ops_function(PyObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *oldops=NULL;\n\t\n\tif ((oldops = PyArray_GetNumericOps())==NULL) return NULL;\n\n\t/* Should probably ensure that objects are at least callable */\n\t/* Leave this to the caller for now --- error will be raised\n\t later when use is attempted \n\t*/\n\tif (PyArray_SetNumericOps(kwds) == -1) {\n\t\tPy_DECREF(oldops);\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"One or more objects is not callable.\");\n\t\treturn NULL;\n\t}\n\treturn oldops;\n}\n\n\nstatic PyObject *\nPyArray_Where(PyObject *condition, PyObject *x, PyObject *y)\n{\n\tPyArrayObject *arr;\n\tPyObject *tup=NULL, *obj=NULL;\n\tPyObject *ret=NULL, *zero=NULL;\n\n\tif ((x==NULL) || (y==NULL)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"either both or neither\"\n\t\t\t\t\"of x and y should be given.\");\n\t\treturn NULL;\n\t}\n\n\tarr = (PyArrayObject *)PyArray_FromAny(condition, NULL, 0, 0, 0);\n\tif (arr == NULL) return NULL;\n\n\tif ((x==NULL) && (y==NULL)) {\n\t\tret = PyArray_Nonzero(arr);\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\n\n\tzero = PyInt_FromLong((long) 0);\n\n\tobj = PyArray_EnsureArray(PyArray_GenericBinaryFunction(arr, zero, n_ops.not_equal));\n\tPy_DECREF(zero);\n\tPy_DECREF(arr);\n\tif (obj == NULL) return NULL;\n\n\ttup = Py_BuildValue(\"(OO)\", y, x);\n\tif (tup == NULL) {Py_DECREF(obj); return NULL;}\n\n\tret = PyArray_Choose((PyAO *)obj, tup);\n\n\tPy_DECREF(obj);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n\nstatic char doc_where[] = \"where(condition, | x, y) is shaped like condition\"\\\n\t\" and has elements of x and y where condition is respectively true or\"\\\n\t\" false. If x or y are not given, then it is equivalent to\"\\\n\t\" nonzero(condition).\";\n\nstatic PyObject *\narray_where(PyObject *ignored, PyObject *args)\n{\n\tPyObject *obj=NULL, *x=NULL, *y=NULL;\n\t\n\tif (!PyArg_ParseTuple(args, \"O|OO\", &obj, &x, &y)) return NULL;\n\n\treturn PyArray_Where(obj, x, y);\n\n}\n\nstatic char doc_register_dtype[] = \\\n\t\"register_dtype(a) registers a new type object -- gives it a typenum\";\n\nstatic PyObject *\narray_register_dtype(PyObject *dummy, PyObject *args)\n{\n\tPyObject *dtype;\n\tint ret;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &dtype)) return NULL;\n\t\n\tret = PyArray_RegisterDataType((PyTypeObject *)dtype);\n\tif (ret < 0)\n\t\treturn NULL;\n\treturn PyInt_FromLong((long) ret);\n}\n\nstatic char doc_can_cast_safely[] = \\\n\t\"can_cast_safely(from=d1, to=d2) returns True if data type d1 \"\\\n\t\"can be cast to data type d2 without losing precision.\";\n\nstatic PyObject *\narray_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode d1={PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode d2={PyArray_NOTYPE, 0, 0};\n\tBool ret;\n\tPyObject *retobj;\n\tstatic char *kwlist[] = {\"from\", \"to\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O&O&\", kwlist, \n\t\t\t\t\tPyArray_TypecodeConverter, &d1,\n\t\t\t\t\tPyArray_TypecodeConverter, &d2))\n\t\treturn NULL;\n\tif (d1.type_num == PyArray_NOTYPE || \\\n\t d2.type_num == PyArray_NOTYPE) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"did not understand one of the types. \"\\\n\t\t\t\t\"'None' not accepted.\");\n\t\treturn NULL;\n\t}\n\t\t\n\tret = PyArray_CanCastTo(&d1, &d2);\n\tretobj = (ret ? Py_True : Py_False);\n\tPy_INCREF(retobj);\n\treturn retobj;\n}\n\n\nstatic struct PyMethodDef array_module_methods[] = {\n\t{\"set_string_function\", (PyCFunction)array_set_string_function, \n\t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n\t{\"set_numeric_ops\", (PyCFunction)array_set_ops_function,\n\t METH_VARARGS|METH_KEYWORDS, doc_set_ops_function},\n\t{\"set_typeDict\", (PyCFunction)array_set_typeDict,\n\t METH_VARARGS, doc_set_typeDict},\n\n\t{\"array\",\t(PyCFunction)_array_fromobject, \n\t METH_VARARGS|METH_KEYWORDS, doc_fromobject},\n\t{\"arange\", (PyCFunction)array_arange, \n\t METH_VARARGS|METH_KEYWORDS, doc_arange},\n\t{\"zeros\",\t(PyCFunction)array_zeros, \n\t METH_VARARGS|METH_KEYWORDS, doc_zeros},\n\t{\"empty\",\t(PyCFunction)array_empty, \n\t METH_VARARGS|METH_KEYWORDS, doc_empty},\n\t{\"scalar\", (PyCFunction)array_scalar,\n\t METH_VARARGS|METH_KEYWORDS, doc_scalar},\n\t{\"where\", (PyCFunction)array_where,\n\t METH_VARARGS, doc_where},\n\t{\"fromstring\",(PyCFunction)array_fromString,\n\t METH_VARARGS|METH_KEYWORDS, doc_fromString},\n\t{\"concatenate\", (PyCFunction)array_concatenate, \n\t METH_VARARGS|METH_KEYWORDS, doc_concatenate},\n\t{\"inner\", (PyCFunction)array_innerproduct, \n\t METH_VARARGS, doc_innerproduct}, \n\t{\"dot\", (PyCFunction)array_matrixproduct, \n\t METH_VARARGS, doc_matrixproduct}, \n\t{\"_fastCopyAndTranspose\", (PyCFunction)array_fastCopyAndTranspose, \n\t METH_VARARGS, doc_fastCopyAndTranspose},\n\t{\"correlate\", (PyCFunction)array_correlate, \n\t METH_VARARGS | METH_KEYWORDS, doc_correlate},\n\t{\"frombuffer\", (PyCFunction)array_frombuffer,\n\t METH_VARARGS | METH_KEYWORDS, doc_frombuffer},\n\t{\"fromfile\", (PyCFunction)array_fromfile,\n\t METH_VARARGS | METH_KEYWORDS, doc_fromfile},\n\t{\"register_dtype\", (PyCFunction)array_register_dtype,\n\t METH_VARARGS, doc_register_dtype},\n\t{\"can_cast\", (PyCFunction)array_can_cast_safely,\n\t METH_VARARGS | METH_KEYWORDS, doc_can_cast_safely},\t\t\n\t/* {\"arrayMap\",\t(PyCFunction)array_arrayMap, \n\t METH_VARARGS, doc_arrayMap},*/\n\t\n\t{NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n#include \"__multiarray_api.c\"\n\n/* Establish scalar-type hierarchy */\n\n/* For dual inheritance we need to make sure that the objects being\n inherited from have the tp->mro object initialized. This is\n not necessarily true for the basic type objects of Python (it is \n checked for single inheritance but not dual in PyType_Ready).\n\n Thus, we call PyType_Ready on the standard Python Types, here.\n*/ \nstatic int\nsetup_scalartypes(PyObject *dict)\n{\n\n\tinitialize_numeric_types();\n\n if (PyType_Ready(&PyBool_Type) < 0) return -1;\n if (PyType_Ready(&PyInt_Type) < 0) return -1;\n if (PyType_Ready(&PyFloat_Type) < 0) return -1;\n if (PyType_Ready(&PyComplex_Type) < 0) return -1;\n if (PyType_Ready(&PyString_Type) < 0) return -1;\n if (PyType_Ready(&PyUnicode_Type) < 0) return -1;\n\n#define SINGLE_INHERIT(child, parent) \\\n Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type;\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) {\t\t\\\n PyErr_Print(); \\\n PyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Tyupe\", \\\n #child); \\\n return -1;\t\t\t\t\t\t\\\n }\n \n if (PyType_Ready(&PyGenericArrType_Type) < 0)\n return -1;\n\n SINGLE_INHERIT(Numeric, Generic);\n SINGLE_INHERIT(Integer, Numeric);\n SINGLE_INHERIT(Inexact, Numeric);\n SINGLE_INHERIT(SignedInteger, Integer);\n SINGLE_INHERIT(UnsignedInteger, Integer);\n SINGLE_INHERIT(Floating, Inexact);\n SINGLE_INHERIT(ComplexFloating, Inexact);\n SINGLE_INHERIT(Flexible, Generic);\n SINGLE_INHERIT(Character, Flexible);\n\t\n#define DUAL_INHERIT(child, parent1, parent2) \\\n Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type;\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent2##ArrType_Type,\t\\\n\t\t\t &Py##parent1##_Type);\t\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n#define DUAL_INHERIT2(child, parent1, parent2)\t\t\t\t\\\n Py##child##ArrType_Type.tp_base = &Py##parent1##_Type;\t\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent1##_Type,\t\t\\\n\t\t\t &Py##parent2##ArrType_Type);\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n SINGLE_INHERIT(Bool, Generic);\n SINGLE_INHERIT(Byte, SignedInteger);\n SINGLE_INHERIT(Short, SignedInteger);\n#if SIZEOF_INT == SIZEOF_LONG\n DUAL_INHERIT(Int, Int, SignedInteger);\n#else\n SINGLE_INHERIT(Int, SignedInteger);\n#endif\n DUAL_INHERIT(Long, Int, SignedInteger);\n#if SIZEOF_LONGLONG == SIZEOF_LONG\n DUAL_INHERIT(LongLong, Int, SignedInteger);\n#else\n SINGLE_INHERIT(LongLong, SignedInteger);\n#endif\n\n SINGLE_INHERIT(UByte, UnsignedInteger);\n SINGLE_INHERIT(UShort, UnsignedInteger);\n SINGLE_INHERIT(UInt, UnsignedInteger);\n SINGLE_INHERIT(ULong, UnsignedInteger);\n SINGLE_INHERIT(ULongLong, UnsignedInteger);\n\n SINGLE_INHERIT(Float, Floating);\n DUAL_INHERIT(Double, Float, Floating);\n SINGLE_INHERIT(LongDouble, Floating);\n\n SINGLE_INHERIT(CFloat, ComplexFloating);\n DUAL_INHERIT(CDouble, Complex, ComplexFloating);\n SINGLE_INHERIT(CLongDouble, ComplexFloating);\n\n DUAL_INHERIT2(String, String, Character);\n DUAL_INHERIT2(Unicode, Unicode, Character);\n\t\n SINGLE_INHERIT(Void, Flexible);\n \n SINGLE_INHERIT(Object, Generic);\n\n return 0;\n\n#undef SINGLE_INHERIT\n#undef DUAL_INHERIT\n\n\t/* Clean up string and unicode array types so they act more like\n\t strings -- get their tables from the standard types.\n\t \n\t \n\t*/\n}\n\n/* place a flag dictionary in d */\n\nstatic void\nset_flaginfo(PyObject *d)\n{\n PyObject *s;\n PyObject *newd;\n \n newd = PyDict_New();\n\n PyDict_SetItemString(newd, \"OWNDATA\", s=PyInt_FromLong(OWNDATA));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"FORTRAN\", s=PyInt_FromLong(FORTRAN));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"CONTIGUOUS\", s=PyInt_FromLong(CONTIGUOUS));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"ALIGNED\", s=PyInt_FromLong(ALIGNED));\n Py_DECREF(s);\n\n PyDict_SetItemString(newd, \"NOTSWAPPED\", s=PyInt_FromLong(NOTSWAPPED));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"UPDATEIFCOPY\", s=PyInt_FromLong(UPDATEIFCOPY));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"WRITEABLE\", s=PyInt_FromLong(WRITEABLE));\n Py_DECREF(s);\n \n PyDict_SetItemString(d, \"_flagdict\", newd);\n Py_DECREF(newd);\n return;\n}\n\n\n/* Initialization function for the module */\n\nDL_EXPORT(void) initmultiarray(void) {\n\tPyObject *m, *d, *s;\n\tPyObject *c_api;\n\t\n\t/* Create the module and add the functions */\n\tm = Py_InitModule(\"multiarray\", array_module_methods);\n\tif (!m) goto err;\n\n\t/* Add some symbolic constants to the module */\n\td = PyModule_GetDict(m);\n\tif (!d) goto err; \n\n\t/* Create the module and add the functions */\n\tif (PyType_Ready(&PyBigArray_Type) < 0) \n\t\treturn;\n\n PyArray_Type.tp_base = &PyBigArray_Type;\n\n PyArray_Type.tp_as_mapping = &array_as_mapping;\n\t/* Even though, this would be inherited, it needs to be set now\n\t so that the __getitem__ will map to the as_mapping descriptor\n\t*/\n PyArray_Type.tp_as_number = &array_as_number; \n\t/* For good measure */\n\tPyArray_Type.tp_as_sequence = &array_as_sequence;\n\tPyArray_Type.tp_as_buffer = &array_as_buffer;\t\n PyArray_Type.tp_flags = (Py_TPFLAGS_DEFAULT \n\t\t\t\t | Py_TPFLAGS_BASETYPE\n\t\t\t\t | Py_TPFLAGS_CHECKTYPES);\n PyArray_Type.tp_doc = Arraytype__doc__;\n\n\tif (PyType_Ready(&PyArray_Type) < 0)\n return;\n\n if (setup_scalartypes(d) < 0) goto err;\n\n\tif (PyType_Ready(&PyArrayIter_Type) < 0)\n\t\treturn; \n \n\tif (PyType_Ready(&PyArrayMapIter_Type) < 0)\n return; \n\n\tc_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);\n\tif (PyErr_Occurred()) goto err;\n\tPyDict_SetItemString(d, \"_ARRAY_API\", c_api);\n\tPy_DECREF(c_api);\n\tif (PyErr_Occurred()) goto err;\n\n\tMultiArrayError = PyString_FromString (\"multiarray.error\");\n\tPyDict_SetItemString (d, \"error\", MultiArrayError);\n\t\n\ts = PyString_FromString(\"3.0\");\n\tPyDict_SetItemString(d, \"__version__\", s);\n\tPy_DECREF(s);\n Py_INCREF(&PyBigArray_Type);\n\tPyDict_SetItemString(d, \"bigndarray\", (PyObject *)&PyBigArray_Type);\n Py_INCREF(&PyArray_Type);\n\tPyDict_SetItemString(d, \"ndarray\", (PyObject *)&PyArray_Type);\n Py_INCREF(&PyArrayIter_Type);\n\tPyDict_SetItemString(d, \"flatiter\", (PyObject *)&PyArrayIter_Type);\n Py_INCREF(&PyArrayMapIter_Type);\n\tPyDict_SetItemString(d, \"mapiter\", (PyObject *)&PyArrayMapIter_Type);\n\n set_flaginfo(d);\n\n\tif (set_typeinfo(d) == 0) \n return; /* otherwise there is an error */\n\n\n err:\t\n\t/* Check for errors */\n\tif (PyErr_Occurred())\n PyErr_Print();\n\t\tPy_FatalError(\"can't initialize module multiarray\");\n\n\treturn;\n}\n\n", "methods": [ { "name": "PyArray_MultiplyIntList", "long_name": "PyArray_MultiplyIntList( register int * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 51, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_MultiplyList", "long_name": "PyArray_MultiplyList( register intp * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_AxisConverter", "long_name": "PyArray_AxisConverter( PyObject * obj , int * axis)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 53, "parameters": [ "obj", "axis" ], "start_line": 68, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_CompareLists", "long_name": "PyArray_CompareLists( intp * l1 , intp * l2 , int n)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 83, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_View", "long_name": "PyArray_View( PyArrayObject * self , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 9, "token_count": 245, "parameters": [ "self", "type" ], "start_line": 93, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "PyArray_Ravel", "long_name": "PyArray_Ravel( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 14, "complexity": 4, "token_count": 87, "parameters": [ "a", "fortran" ], "start_line": 144, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyArray_Flatten", "long_name": "PyArray_Flatten( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 32, "complexity": 5, "token_count": 162, "parameters": [ "a", "fortran" ], "start_line": 161, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Reshape", "long_name": "PyArray_Reshape( PyArrayObject * self , PyObject * shape)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 53, "parameters": [ "self", "shape" ], "start_line": 202, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 68, "complexity": 15, "token_count": 366, "parameters": [ "self", "newdims" ], "start_line": 219, "end_line": 298, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 0 }, { "name": "PyArray_Squeeze", "long_name": "PyArray_Squeeze( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 4, "token_count": 192, "parameters": [ "self" ], "start_line": 306, "end_line": 337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "PyArray_Mean", "long_name": "PyArray_Mean( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 19, "complexity": 4, "token_count": 139, "parameters": [ "self", "axis", "rtype" ], "start_line": 341, "end_line": 362, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Std", "long_name": "PyArray_Std( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 43, "complexity": 12, "token_count": 433, "parameters": [ "self", "axis", "rtype" ], "start_line": 365, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "PyArray_Sum", "long_name": "PyArray_Sum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Prod", "long_name": "PyArray_Prod( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 437, "end_line": 447, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumSum", "long_name": "PyArray_CumSum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 450, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumProd", "long_name": "PyArray_CumProd( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 463, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Any", "long_name": "PyArray_Any( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 477, "end_line": 488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_All", "long_name": "PyArray_All( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 491, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Compress", "long_name": "PyArray_Compress( PyArrayObject * self , PyObject * condition , int axis)", "filename": "multiarraymodule.c", "nloc": 18, "complexity": 3, "token_count": 110, "parameters": [ "self", "condition", "axis" ], "start_line": 506, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_Nonzero", "long_name": "PyArray_Nonzero( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 13, "token_count": 403, "parameters": [ "self" ], "start_line": 529, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "PyArray_Clip", "long_name": "PyArray_Clip( PyArrayObject * self , PyObject * min , PyObject * max)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 6, "token_count": 241, "parameters": [ "self", "min", "max" ], "start_line": 590, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Conjugate", "long_name": "PyArray_Conjugate( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 9, "token_count": 225, "parameters": [ "self" ], "start_line": 626, "end_line": 662, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_Trace", "long_name": "PyArray_Trace( PyArrayObject * self , int offset , int axis1 , int axis2 , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 81, "parameters": [ "self", "offset", "axis1", "axis2", "rtype" ], "start_line": 665, "end_line": 675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Diagonal", "long_name": "PyArray_Diagonal( PyArrayObject * self , int offset , int axis1 , int axis2)", "filename": "multiarraymodule.c", "nloc": 106, "complexity": 24, "token_count": 808, "parameters": [ "self", "offset", "axis1", "axis2" ], "start_line": 678, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "PyArray_AsCArray", "long_name": "PyArray_AsCArray( PyObject ** op , * ptr , intp * dims , int nd , int type_num)", "filename": "multiarraymodule.c", "nloc": 55, "complexity": 13, "token_count": 432, "parameters": [ "op", "ptr", "dims", "nd", "type_num" ], "start_line": 816, "end_line": 872, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 57, "top_nesting_level": 0 }, { "name": "PyArray_As1D", "long_name": "PyArray_As1D( PyObject ** op , char ** ptr , int * d1 , int typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 60, "parameters": [ "op", "ptr", "d1", "typecode" ], "start_line": 877, "end_line": 885, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_As2D", "long_name": "PyArray_As2D( PyObject ** op , char ** * ptr , int * d1 , int * d2 , int typecode)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 81, "parameters": [ "op", "ptr", "d1", "d2", "typecode" ], "start_line": 889, "end_line": 899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Free", "long_name": "PyArray_Free( PyObject * op , * ptr)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 4, "token_count": 67, "parameters": [ "op", "ptr" ], "start_line": 904, "end_line": 915, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_swap_and_concat", "long_name": "_swap_and_concat( PyObject * op , int axis , int n)", "filename": "multiarraymodule.c", "nloc": 27, "complexity": 6, "token_count": 185, "parameters": [ "op", "axis", "n" ], "start_line": 919, "end_line": 947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_Concatenate", "long_name": "PyArray_Concatenate( PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 114, "complexity": 24, "token_count": 771, "parameters": [ "op", "axis" ], "start_line": 956, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 129, "top_nesting_level": 0 }, { "name": "PyArray_SwapAxes", "long_name": "PyArray_SwapAxes( PyArrayObject * ap , int a1 , int a2)", "filename": "multiarraymodule.c", "nloc": 37, "complexity": 12, "token_count": 227, "parameters": [ "ap", "a1", "a2" ], "start_line": 1087, "end_line": 1126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_Transpose", "long_name": "PyArray_Transpose( PyArrayObject * ap , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 49, "complexity": 15, "token_count": 403, "parameters": [ "ap", "op" ], "start_line": 1130, "end_line": 1189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "PyArray_Repeat", "long_name": "PyArray_Repeat( PyArrayObject * aop , PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 15, "token_count": 520, "parameters": [ "aop", "op", "axis" ], "start_line": 1192, "end_line": 1284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Choose", "long_name": "PyArray_Choose( PyArrayObject * ip , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 18, "token_count": 650, "parameters": [ "ip", "op" ], "start_line": 1288, "end_line": 1400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 }, { "name": "qsortCompare", "long_name": "qsortCompare( const * a , const * b)", "filename": "multiarraymodule.c", "nloc": 4, "complexity": 1, "token_count": 28, "parameters": [ "a", "b" ], "start_line": 1408, "end_line": 1411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "PyArray_Sort", "long_name": "PyArray_Sort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 7, "token_count": 250, "parameters": [ "op", "axis" ], "start_line": 1433, "end_line": 1482, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "argsort_static_compare", "long_name": "argsort_static_compare( const * ip1 , const * ip2)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 1, "token_count": 63, "parameters": [ "ip1", "ip2" ], "start_line": 1488, "end_line": 1496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_ArgSort", "long_name": "PyArray_ArgSort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 48, "complexity": 8, "token_count": 350, "parameters": [ "op", "axis" ], "start_line": 1499, "end_line": 1558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "local_where", "long_name": "local_where( PyArrayObject * ap1 , PyArrayObject * ap2 , PyArrayObject * ret)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 7, "token_count": 243, "parameters": [ "ap1", "ap2", "ret" ], "start_line": 1561, "end_line": 1596, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_SearchSorted", "long_name": "PyArray_SearchSorted( PyArrayObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 33, "complexity": 5, "token_count": 223, "parameters": [ "op1", "op2" ], "start_line": 1599, "end_line": 1644, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "PyArray_InnerProduct", "long_name": "PyArray_InnerProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 83, "complexity": 17, "token_count": 657, "parameters": [ "op1", "op2" ], "start_line": 1652, "end_line": 1755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 104, "top_nesting_level": 0 }, { "name": "PyArray_MatrixProduct", "long_name": "PyArray_MatrixProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 99, "complexity": 20, "token_count": 760, "parameters": [ "op1", "op2" ], "start_line": 1760, "end_line": 1882, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "PyArray_CopyAndTranspose", "long_name": "PyArray_CopyAndTranspose( PyObject * op)", "filename": "multiarraymodule.c", "nloc": 44, "complexity": 6, "token_count": 278, "parameters": [ "op" ], "start_line": 1885, "end_line": 1936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Correlate", "long_name": "PyArray_Correlate( PyObject * op1 , PyObject * op2 , int mode)", "filename": "multiarraymodule.c", "nloc": 87, "complexity": 13, "token_count": 602, "parameters": [ "op1", "op2", "mode" ], "start_line": 1939, "end_line": 2035, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 97, "top_nesting_level": 0 }, { "name": "PyArray_ArgMin", "long_name": "PyArray_ArgMin( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 5, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2038, "end_line": 2063, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_Max", "long_name": "PyArray_Max( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2066, "end_line": 2077, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Min", "long_name": "PyArray_Min( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2080, "end_line": 2091, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Ptp", "long_name": "PyArray_Ptp( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 4, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2094, "end_line": 2117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "PyArray_ArgMax", "long_name": "PyArray_ArgMax( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 7, "token_count": 322, "parameters": [ "op", "axis" ], "start_line": 2121, "end_line": 2178, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_Take", "long_name": "PyArray_Take( PyArrayObject * self0 , PyObject * indices0 , int axis)", "filename": "multiarraymodule.c", "nloc": 62, "complexity": 12, "token_count": 468, "parameters": [ "self0", "indices0", "axis" ], "start_line": 2182, "end_line": 2254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 73, "top_nesting_level": 0 }, { "name": "PyArray_Put", "long_name": "PyArray_Put( PyArrayObject * self , PyObject * indices0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 10, "token_count": 319, "parameters": [ "self", "indices0", "values0" ], "start_line": 2257, "end_line": 2309, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "PyArray_PutMask", "long_name": "PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 10, "token_count": 334, "parameters": [ "self", "mask0", "values0" ], "start_line": 2312, "end_line": 2374, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_Converter", "long_name": "PyArray_Converter( PyObject * object , PyObject ** address)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 66, "parameters": [ "object", "address" ], "start_line": 2386, "end_line": 2398, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_BoolConverter", "long_name": "PyArray_BoolConverter( PyObject * object , Bool * val)", "filename": "multiarraymodule.c", "nloc": 7, "complexity": 3, "token_count": 42, "parameters": [ "object", "val" ], "start_line": 2401, "end_line": 2407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_TypestrConvert", "long_name": "PyArray_TypestrConvert( int itemsize , int gentype)", "filename": "multiarraymodule.c", "nloc": 90, "complexity": 33, "token_count": 284, "parameters": [ "itemsize", "gentype" ], "start_line": 2411, "end_line": 2520, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "PyArray_BufferConverter", "long_name": "PyArray_BufferConverter( PyObject * obj , PyArray_Chunk * buf)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 6, "token_count": 147, "parameters": [ "obj", "buf" ], "start_line": 2535, "end_line": 2560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_IntpConverter", "long_name": "PyArray_IntpConverter( PyObject * obj , PyArray_Dims * seq)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 10, "token_count": 186, "parameters": [ "obj", "seq" ], "start_line": 2572, "end_line": 2608, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_TypecodeConverter", "long_name": "PyArray_TypecodeConverter( PyObject * obj , PyArray_Typecode * at)", "filename": "multiarraymodule.c", "nloc": 108, "complexity": 33, "token_count": 639, "parameters": [ "obj", "at" ], "start_line": 2617, "end_line": 2755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 139, "top_nesting_level": 0 }, { "name": "PyArray_EquivalentTypes", "long_name": "PyArray_EquivalentTypes( PyArray_Typecode * typ1 , PyArray_Typecode * typ2)", "filename": "multiarraymodule.c", "nloc": 24, "complexity": 8, "token_count": 162, "parameters": [ "typ1", "typ2" ], "start_line": 2763, "end_line": 2790, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "PyArray_EquivArrTypes", "long_name": "PyArray_EquivArrTypes( PyArrayObject * a1 , PyArrayObject * a2)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 1, "token_count": 80, "parameters": [ "a1", "a2" ], "start_line": 2793, "end_line": 2804, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_array_fromobject", "long_name": "_array_fromobject( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 38, "complexity": 9, "token_count": 254, "parameters": [ "ignored", "args", "kws" ], "start_line": 2815, "end_line": 2859, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_Empty", "long_name": "PyArray_Empty( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 15, "complexity": 3, "token_count": 99, "parameters": [ "nd", "dims", "type" ], "start_line": 2862, "end_line": 2878, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_empty", "long_name": "array_empty( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2884, "end_line": 2908, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_scalar", "long_name": "array_scalar( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 11, "token_count": 290, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2913, "end_line": 2977, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 }, { "name": "PyArray_Zeros", "long_name": "PyArray_Zeros( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 3, "token_count": 133, "parameters": [ "nd", "dims", "type" ], "start_line": 2981, "end_line": 3003, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_zeros", "long_name": "array_zeros( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 3009, "end_line": 3033, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_set_typeDict", "long_name": "array_set_typeDict( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "ignored", "args" ], "start_line": 3040, "end_line": 3049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_fromString", "long_name": "array_fromString( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 8, "token_count": 283, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3054, "end_line": 3109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "_fill_in_itemsize", "long_name": "_fill_in_itemsize( PyArray_Typecode * typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 42, "parameters": [ "typecode" ], "start_line": 3124, "end_line": 3131, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_FromFile", "long_name": "PyArray_FromFile( FILE * fp , PyArray_Typecode * typecode , intp num , char * sep)", "filename": "multiarraymodule.c", "nloc": 113, "complexity": 23, "token_count": 682, "parameters": [ "fp", "typecode", "num", "sep" ], "start_line": 3135, "end_line": 3262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "array_fromfile", "long_name": "array_fromfile( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 34, "complexity": 6, "token_count": 221, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3280, "end_line": 3315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_FromBuffer", "long_name": "PyArray_FromBuffer( PyObject * buf , PyArray_Typecode * type , intp count , int swapped)", "filename": "multiarraymodule.c", "nloc": 58, "complexity": 11, "token_count": 306, "parameters": [ "buf", "type", "count", "swapped" ], "start_line": 3318, "end_line": 3381, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_frombuffer", "long_name": "array_frombuffer( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 16, "complexity": 2, "token_count": 115, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3395, "end_line": 3412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_concatenate", "long_name": "array_concatenate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 73, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3419, "end_line": 3430, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_innerproduct", "long_name": "array_innerproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3437, "end_line": 3443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_matrixproduct", "long_name": "array_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3450, "end_line": 3456, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_fastCopyAndTranspose", "long_name": "array_fastCopyAndTranspose( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 41, "parameters": [ "dummy", "args" ], "start_line": 3460, "end_line": 3466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_correlate", "long_name": "array_correlate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 81, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3470, "end_line": 3479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Arange", "long_name": "PyArray_Arange( double start , double stop , double step , int type_num)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 4, "token_count": 229, "parameters": [ "start", "stop", "step", "type_num" ], "start_line": 3483, "end_line": 3516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_arange", "long_name": "array_arange( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 10, "token_count": 258, "parameters": [ "ignored", "args", "kws" ], "start_line": 3522, "end_line": 3570, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "array_set_string_function", "long_name": "array_set_string_function( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 78, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3590, "end_line": 3601, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_set_ops_function", "long_name": "array_set_ops_function( PyObject * self , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 12, "complexity": 3, "token_count": 67, "parameters": [ "self", "args", "kwds" ], "start_line": 3607, "end_line": 3624, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Where", "long_name": "PyArray_Where( PyObject * condition , PyObject * x , PyObject * y)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 8, "token_count": 226, "parameters": [ "condition", "x", "y" ], "start_line": 3628, "end_line": 3664, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "array_where", "long_name": "array_where( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 60, "parameters": [ "ignored", "args" ], "start_line": 3672, "end_line": 3680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_register_dtype", "long_name": "array_register_dtype( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 3, "token_count": 64, "parameters": [ "dummy", "args" ], "start_line": 3686, "end_line": 3697, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_can_cast_safely", "long_name": "array_can_cast_safely( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 5, "token_count": 145, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3704, "end_line": 3728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "setup_scalartypes", "long_name": "setup_scalartypes( PyObject * dict)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 10, "token_count": 351, "parameters": [ "dict" ], "start_line": 3788, "end_line": 3897, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "set_flaginfo", "long_name": "set_flaginfo( PyObject * d)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 1, "token_count": 171, "parameters": [ "d" ], "start_line": 3902, "end_line": 3928, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "initmultiarray", "long_name": "initmultiarray()", "filename": "multiarraymodule.c", "nloc": 52, "complexity": 12, "token_count": 361, "parameters": [], "start_line": 3933, "end_line": 4009, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 77, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_MultiplyIntList", "long_name": "PyArray_MultiplyIntList( register int * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 51, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_MultiplyList", "long_name": "PyArray_MultiplyList( register intp * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_AxisConverter", "long_name": "PyArray_AxisConverter( PyObject * obj , int * axis)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 53, "parameters": [ "obj", "axis" ], "start_line": 68, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_CompareLists", "long_name": "PyArray_CompareLists( intp * l1 , intp * l2 , int n)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 83, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_View", "long_name": "PyArray_View( PyArrayObject * self , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 9, "token_count": 245, "parameters": [ "self", "type" ], "start_line": 93, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "PyArray_Ravel", "long_name": "PyArray_Ravel( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 14, "complexity": 4, "token_count": 87, "parameters": [ "a", "fortran" ], "start_line": 144, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyArray_Flatten", "long_name": "PyArray_Flatten( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 32, "complexity": 5, "token_count": 162, "parameters": [ "a", "fortran" ], "start_line": 161, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Reshape", "long_name": "PyArray_Reshape( PyArrayObject * self , PyObject * shape)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 53, "parameters": [ "self", "shape" ], "start_line": 202, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 68, "complexity": 15, "token_count": 366, "parameters": [ "self", "newdims" ], "start_line": 219, "end_line": 298, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 0 }, { "name": "PyArray_Squeeze", "long_name": "PyArray_Squeeze( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 4, "token_count": 192, "parameters": [ "self" ], "start_line": 306, "end_line": 337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "PyArray_Mean", "long_name": "PyArray_Mean( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 19, "complexity": 4, "token_count": 139, "parameters": [ "self", "axis", "rtype" ], "start_line": 341, "end_line": 362, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Std", "long_name": "PyArray_Std( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 43, "complexity": 12, "token_count": 433, "parameters": [ "self", "axis", "rtype" ], "start_line": 365, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "PyArray_Sum", "long_name": "PyArray_Sum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Prod", "long_name": "PyArray_Prod( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 437, "end_line": 447, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumSum", "long_name": "PyArray_CumSum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 450, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumProd", "long_name": "PyArray_CumProd( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 463, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Any", "long_name": "PyArray_Any( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 477, "end_line": 488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_All", "long_name": "PyArray_All( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 491, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Compress", "long_name": "PyArray_Compress( PyArrayObject * self , PyObject * condition , int axis)", "filename": "multiarraymodule.c", "nloc": 18, "complexity": 3, "token_count": 110, "parameters": [ "self", "condition", "axis" ], "start_line": 506, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_Nonzero", "long_name": "PyArray_Nonzero( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 13, "token_count": 403, "parameters": [ "self" ], "start_line": 529, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "PyArray_Clip", "long_name": "PyArray_Clip( PyArrayObject * self , PyObject * min , PyObject * max)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 6, "token_count": 241, "parameters": [ "self", "min", "max" ], "start_line": 590, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Conjugate", "long_name": "PyArray_Conjugate( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 9, "token_count": 225, "parameters": [ "self" ], "start_line": 626, "end_line": 662, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_Trace", "long_name": "PyArray_Trace( PyArrayObject * self , int offset , int axis1 , int axis2 , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 81, "parameters": [ "self", "offset", "axis1", "axis2", "rtype" ], "start_line": 665, "end_line": 675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Diagonal", "long_name": "PyArray_Diagonal( PyArrayObject * self , int offset , int axis1 , int axis2)", "filename": "multiarraymodule.c", "nloc": 106, "complexity": 24, "token_count": 808, "parameters": [ "self", "offset", "axis1", "axis2" ], "start_line": 678, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "PyArray_AsCArray", "long_name": "PyArray_AsCArray( PyObject ** op , * ptr , intp * dims , int nd , int type_num)", "filename": "multiarraymodule.c", "nloc": 55, "complexity": 13, "token_count": 432, "parameters": [ "op", "ptr", "dims", "nd", "type_num" ], "start_line": 816, "end_line": 872, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 57, "top_nesting_level": 0 }, { "name": "PyArray_As1D", "long_name": "PyArray_As1D( PyObject ** op , char ** ptr , int * d1 , int typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 60, "parameters": [ "op", "ptr", "d1", "typecode" ], "start_line": 877, "end_line": 885, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_As2D", "long_name": "PyArray_As2D( PyObject ** op , char ** * ptr , int * d1 , int * d2 , int typecode)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 81, "parameters": [ "op", "ptr", "d1", "d2", "typecode" ], "start_line": 889, "end_line": 899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Free", "long_name": "PyArray_Free( PyObject * op , * ptr)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 4, "token_count": 67, "parameters": [ "op", "ptr" ], "start_line": 904, "end_line": 915, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_swap_and_concat", "long_name": "_swap_and_concat( PyObject * op , int axis , int n)", "filename": "multiarraymodule.c", "nloc": 27, "complexity": 6, "token_count": 185, "parameters": [ "op", "axis", "n" ], "start_line": 919, "end_line": 947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_Concatenate", "long_name": "PyArray_Concatenate( PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 114, "complexity": 24, "token_count": 771, "parameters": [ "op", "axis" ], "start_line": 956, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 129, "top_nesting_level": 0 }, { "name": "PyArray_SwapAxes", "long_name": "PyArray_SwapAxes( PyArrayObject * ap , int a1 , int a2)", "filename": "multiarraymodule.c", "nloc": 37, "complexity": 12, "token_count": 227, "parameters": [ "ap", "a1", "a2" ], "start_line": 1087, "end_line": 1126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_Transpose", "long_name": "PyArray_Transpose( PyArrayObject * ap , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 49, "complexity": 15, "token_count": 403, "parameters": [ "ap", "op" ], "start_line": 1130, "end_line": 1189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "PyArray_Repeat", "long_name": "PyArray_Repeat( PyArrayObject * aop , PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 15, "token_count": 520, "parameters": [ "aop", "op", "axis" ], "start_line": 1192, "end_line": 1284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Choose", "long_name": "PyArray_Choose( PyArrayObject * ip , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 18, "token_count": 650, "parameters": [ "ip", "op" ], "start_line": 1288, "end_line": 1400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 }, { "name": "qsortCompare", "long_name": "qsortCompare( const * a , const * b)", "filename": "multiarraymodule.c", "nloc": 4, "complexity": 1, "token_count": 28, "parameters": [ "a", "b" ], "start_line": 1408, "end_line": 1411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "PyArray_Sort", "long_name": "PyArray_Sort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 7, "token_count": 250, "parameters": [ "op", "axis" ], "start_line": 1433, "end_line": 1482, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "argsort_static_compare", "long_name": "argsort_static_compare( const * ip1 , const * ip2)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 1, "token_count": 63, "parameters": [ "ip1", "ip2" ], "start_line": 1488, "end_line": 1496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_ArgSort", "long_name": "PyArray_ArgSort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 48, "complexity": 8, "token_count": 350, "parameters": [ "op", "axis" ], "start_line": 1499, "end_line": 1558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "local_where", "long_name": "local_where( PyArrayObject * ap1 , PyArrayObject * ap2 , PyArrayObject * ret)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 7, "token_count": 243, "parameters": [ "ap1", "ap2", "ret" ], "start_line": 1561, "end_line": 1596, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_SearchSorted", "long_name": "PyArray_SearchSorted( PyArrayObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 33, "complexity": 5, "token_count": 223, "parameters": [ "op1", "op2" ], "start_line": 1599, "end_line": 1644, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "PyArray_InnerProduct", "long_name": "PyArray_InnerProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 83, "complexity": 17, "token_count": 657, "parameters": [ "op1", "op2" ], "start_line": 1652, "end_line": 1755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 104, "top_nesting_level": 0 }, { "name": "PyArray_MatrixProduct", "long_name": "PyArray_MatrixProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 99, "complexity": 20, "token_count": 760, "parameters": [ "op1", "op2" ], "start_line": 1760, "end_line": 1882, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "PyArray_CopyAndTranspose", "long_name": "PyArray_CopyAndTranspose( PyObject * op)", "filename": "multiarraymodule.c", "nloc": 44, "complexity": 6, "token_count": 278, "parameters": [ "op" ], "start_line": 1885, "end_line": 1936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Correlate", "long_name": "PyArray_Correlate( PyObject * op1 , PyObject * op2 , int mode)", "filename": "multiarraymodule.c", "nloc": 87, "complexity": 13, "token_count": 602, "parameters": [ "op1", "op2", "mode" ], "start_line": 1939, "end_line": 2035, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 97, "top_nesting_level": 0 }, { "name": "PyArray_ArgMin", "long_name": "PyArray_ArgMin( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 5, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2038, "end_line": 2063, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_Max", "long_name": "PyArray_Max( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2066, "end_line": 2077, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Min", "long_name": "PyArray_Min( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2080, "end_line": 2091, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Ptp", "long_name": "PyArray_Ptp( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 4, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2094, "end_line": 2117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "PyArray_ArgMax", "long_name": "PyArray_ArgMax( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 7, "token_count": 322, "parameters": [ "op", "axis" ], "start_line": 2121, "end_line": 2178, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_Take", "long_name": "PyArray_Take( PyArrayObject * self0 , PyObject * indices0 , int axis)", "filename": "multiarraymodule.c", "nloc": 62, "complexity": 12, "token_count": 468, "parameters": [ "self0", "indices0", "axis" ], "start_line": 2182, "end_line": 2254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 73, "top_nesting_level": 0 }, { "name": "PyArray_Put", "long_name": "PyArray_Put( PyArrayObject * self , PyObject * indices0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 10, "token_count": 319, "parameters": [ "self", "indices0", "values0" ], "start_line": 2257, "end_line": 2309, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "PyArray_PutMask", "long_name": "PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 10, "token_count": 334, "parameters": [ "self", "mask0", "values0" ], "start_line": 2312, "end_line": 2374, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_Converter", "long_name": "PyArray_Converter( PyObject * object , PyObject ** address)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 66, "parameters": [ "object", "address" ], "start_line": 2386, "end_line": 2398, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_BoolConverter", "long_name": "PyArray_BoolConverter( PyObject * object , Bool * val)", "filename": "multiarraymodule.c", "nloc": 7, "complexity": 3, "token_count": 42, "parameters": [ "object", "val" ], "start_line": 2401, "end_line": 2407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_TypestrConvert", "long_name": "PyArray_TypestrConvert( int itemsize , int gentype)", "filename": "multiarraymodule.c", "nloc": 90, "complexity": 33, "token_count": 284, "parameters": [ "itemsize", "gentype" ], "start_line": 2411, "end_line": 2520, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "PyArray_BufferConverter", "long_name": "PyArray_BufferConverter( PyObject * obj , PyArray_Chunk * buf)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 6, "token_count": 147, "parameters": [ "obj", "buf" ], "start_line": 2535, "end_line": 2560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_IntpConverter", "long_name": "PyArray_IntpConverter( PyObject * obj , PyArray_Dims * seq)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 10, "token_count": 186, "parameters": [ "obj", "seq" ], "start_line": 2572, "end_line": 2608, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_TypecodeConverter", "long_name": "PyArray_TypecodeConverter( PyObject * obj , PyArray_Typecode * at)", "filename": "multiarraymodule.c", "nloc": 108, "complexity": 33, "token_count": 639, "parameters": [ "obj", "at" ], "start_line": 2617, "end_line": 2755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 139, "top_nesting_level": 0 }, { "name": "PyArray_EquivalentTypes", "long_name": "PyArray_EquivalentTypes( PyArray_Typecode * typ1 , PyArray_Typecode * typ2)", "filename": "multiarraymodule.c", "nloc": 24, "complexity": 8, "token_count": 162, "parameters": [ "typ1", "typ2" ], "start_line": 2763, "end_line": 2790, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "PyArray_EquivArrTypes", "long_name": "PyArray_EquivArrTypes( PyArrayObject * a1 , PyArrayObject * a2)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 1, "token_count": 80, "parameters": [ "a1", "a2" ], "start_line": 2793, "end_line": 2804, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_array_fromobject", "long_name": "_array_fromobject( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 38, "complexity": 9, "token_count": 254, "parameters": [ "ignored", "args", "kws" ], "start_line": 2815, "end_line": 2859, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_Empty", "long_name": "PyArray_Empty( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 15, "complexity": 3, "token_count": 99, "parameters": [ "nd", "dims", "type" ], "start_line": 2862, "end_line": 2878, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_empty", "long_name": "array_empty( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2884, "end_line": 2908, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_scalar", "long_name": "array_scalar( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 11, "token_count": 290, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2913, "end_line": 2977, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 }, { "name": "PyArray_Zeros", "long_name": "PyArray_Zeros( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 3, "token_count": 133, "parameters": [ "nd", "dims", "type" ], "start_line": 2981, "end_line": 3003, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_zeros", "long_name": "array_zeros( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 3009, "end_line": 3033, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_set_typeDict", "long_name": "array_set_typeDict( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "ignored", "args" ], "start_line": 3040, "end_line": 3049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_fromString", "long_name": "array_fromString( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 8, "token_count": 283, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3054, "end_line": 3109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "_fill_in_itemsize", "long_name": "_fill_in_itemsize( PyArray_Typecode * typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 42, "parameters": [ "typecode" ], "start_line": 3124, "end_line": 3131, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_FromFile", "long_name": "PyArray_FromFile( FILE * fp , PyArray_Typecode * typecode , intp num , char * sep)", "filename": "multiarraymodule.c", "nloc": 113, "complexity": 23, "token_count": 682, "parameters": [ "fp", "typecode", "num", "sep" ], "start_line": 3135, "end_line": 3262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "array_fromfile", "long_name": "array_fromfile( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 34, "complexity": 6, "token_count": 221, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3280, "end_line": 3315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_FromBuffer", "long_name": "PyArray_FromBuffer( PyObject * buf , PyArray_Typecode * type , intp count , int swapped)", "filename": "multiarraymodule.c", "nloc": 58, "complexity": 11, "token_count": 306, "parameters": [ "buf", "type", "count", "swapped" ], "start_line": 3318, "end_line": 3381, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_frombuffer", "long_name": "array_frombuffer( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 16, "complexity": 2, "token_count": 115, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3395, "end_line": 3412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_concatenate", "long_name": "array_concatenate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 73, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3419, "end_line": 3430, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_innerproduct", "long_name": "array_innerproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3437, "end_line": 3443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_matrixproduct", "long_name": "array_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3450, "end_line": 3456, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_fastCopyAndTranspose", "long_name": "array_fastCopyAndTranspose( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 41, "parameters": [ "dummy", "args" ], "start_line": 3460, "end_line": 3466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_correlate", "long_name": "array_correlate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 81, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3470, "end_line": 3479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Arange", "long_name": "PyArray_Arange( double start , double stop , double step , int type_num)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 4, "token_count": 229, "parameters": [ "start", "stop", "step", "type_num" ], "start_line": 3483, "end_line": 3516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_arange", "long_name": "array_arange( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 10, "token_count": 258, "parameters": [ "ignored", "args", "kws" ], "start_line": 3522, "end_line": 3570, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "array_set_string_function", "long_name": "array_set_string_function( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 78, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3590, "end_line": 3601, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_set_ops_function", "long_name": "array_set_ops_function( PyObject * self , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 12, "complexity": 3, "token_count": 67, "parameters": [ "self", "args", "kwds" ], "start_line": 3607, "end_line": 3624, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Where", "long_name": "PyArray_Where( PyObject * condition , PyObject * x , PyObject * y)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 8, "token_count": 226, "parameters": [ "condition", "x", "y" ], "start_line": 3628, "end_line": 3664, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "array_where", "long_name": "array_where( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 60, "parameters": [ "ignored", "args" ], "start_line": 3672, "end_line": 3680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_register_dtype", "long_name": "array_register_dtype( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 3, "token_count": 64, "parameters": [ "dummy", "args" ], "start_line": 3686, "end_line": 3697, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_can_cast_safely", "long_name": "array_can_cast_safely( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 5, "token_count": 145, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3704, "end_line": 3728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "setup_scalartypes", "long_name": "setup_scalartypes( PyObject * dict)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 10, "token_count": 351, "parameters": [ "dict" ], "start_line": 3789, "end_line": 3898, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "set_flaginfo", "long_name": "set_flaginfo( PyObject * d)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 1, "token_count": 171, "parameters": [ "d" ], "start_line": 3903, "end_line": 3929, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "initmultiarray", "long_name": "initmultiarray()", "filename": "multiarraymodule.c", "nloc": 52, "complexity": 12, "token_count": 361, "parameters": [], "start_line": 3934, "end_line": 4010, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 77, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 3101, "complexity": 635, "token_count": 20274, "diff_parsed": { "added": [], "deleted": [ "" ] } }, { "old_path": "scipy/base/src/scalartypes.inc.src", "new_path": "scipy/base/src/scalartypes.inc.src", "filename": "scalartypes.inc.src", "extension": "src", "change_type": "MODIFY", "diff": "@@ -513,20 +513,17 @@ gentype_ndim_get(PyObject *self)\n static PyObject *\n gentype_flags_get(PyObject *self)\n {\n-\tPyObject *dict;\n-\tdict = PyDict_New();\t\n-\n-#define ADDFLAG(flag, val) PyDict_SetItemString(dict, #flag, Py_##val);\n-\n- ADDFLAG(CONTIGUOUS, True);\n- ADDFLAG(OWN_DATA, True);\n- ADDFLAG(FORTRAN, True);\n- ADDFLAG(ALIGNED, True);\n- ADDFLAG(NOTSWAPPED, True);\n- ADDFLAG(WRITEABLE, False);\n- ADDFLAG(UPDATEIFCOPY, False);\n-\treturn dict;\n-#undef ADDFLAG\n+\tstatic int flags=CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED | \\\n+\t\tNOTSWAPPED;\n+ static PyObject *module=NULL;\n+\n+ if (module==NULL) {\n+ module = PyImport_ImportModule(\"scipy.base._internal\");\n+ if (module == NULL) return NULL;\n+ }\n+ return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n+ self, flags, 1);\n+\n }\n \n static PyObject *\n", "added_lines": 11, "deleted_lines": 14, "source_code": "/* -*- c -*- */\n\n/**begin repeat\n\n#name=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, Object,#\n#type=Bool, signed char, short, int, long, longlong, unsigned char, unsigned short, unsigned int, unsigned long, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, PyObject *,char#\n*/\ntypedef struct {\n\tPyObject_HEAD;\n\t@type@ obval;\n} Py@name@ScalarObject;\n\n/**end repeat**/\n\n/* Inheritance established later when tp_bases is set (or tp_base for \n single inheritance) */\n\n/**begin repeat\n\n#name=numeric, integer, signedinteger, unsignedinteger, inexact, floating, complexfloating, flexible, \ncharacter#\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, ComplexFloating, Flexible, Character#\n*/\n\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n\n#define PyStringScalarObject PyStringObject\n#define PyUnicodeScalarObject PyUnicodeObject\n\ntypedef struct {\n\tPyObject_VAR_HEAD;\n\tchar *obval;\n} PyVoidScalarObject;\n\n/* 0-dim array from array-scalar object */\n\nstatic PyObject *\nPyArray_FromScalar(PyObject *scalar, PyArray_Typecode *outcode)\n{\n\tPyArray_Typecode typecode;\n\tPyObject *r;\n\tchar *memptr;\n\tPyObject *ret;\n\n\t/* convert to 0-dim array of scalar typecode */\n\tPyArray_TypecodeFromScalar(scalar, &typecode);\n\tr = PyArray_New(&PyArray_Type, 0, NULL, typecode.type_num,\n\t\t\tNULL, NULL, typecode.itemsize, 0, NULL);\n\tif (r==NULL) return NULL;\n\n\tswitch(typecode.type_num) {\n\tcase PyArray_STRING:\n\t\tmemptr = PyString_AS_STRING(scalar);\n\t\tbreak;\n\tcase PyArray_UNICODE:\n\t\tmemptr = (char *)PyUnicode_AS_DATA(scalar);\n\t\tbreak;\n\tcase PyArray_VOID:\n\t\tmemptr = (((PyVoidScalarObject *)scalar)->obval);\n\t\tbreak;\n\tdefault:\n\t\tmemptr = &(((PyScalarObject *)scalar)->obval);\n\t\tbreak;\n\t}\n\n\tmemcpy(PyArray_DATA(r), memptr, PyArray_ITEMSIZE(r));\n\tif (PyArray_ISOBJECT(r)) {\n\t\tPy_INCREF(*((PyObject **)memptr));\n\t}\n\t\n\tif (outcode == NULL || \\\n\t outcode->type_num == PyArray_NOTYPE ||\t\\\n\t outcode->type_num == PyArray_TYPE(r))\n\t\treturn r;\n\n\t/* cast if necessary to desired output typecode */\n\tret = PyArray_CastToType((PyArrayObject *)r, outcode);\n\tPy_DECREF(r);\n\treturn ret;\n}\n\n\nstatic void\ngentype_dealloc(PyObject *v) \n{\n\tv->ob_type->tp_free(v);\n}\n\n\nstatic PyObject *\ngentype_power(PyObject *m1, PyObject *m2, PyObject *m3)\n{\n\tPyObject *arr, *ret, *arg2;\n\tchar *msg=\"unsupported operand type(s) for ** or pow()\";\n\t\n\tif (!PyArray_IsScalar(m1,Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m2,Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(m1, arr,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(arr, m2,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=arg2=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\targ2 = PyArray_FromScalar(m2, NULL);\t\n\tif (arr == NULL || arg2 == NULL) {\n\t\tPy_XDECREF(arr); Py_XDECREF(arg2); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_power(arr, arg2, Py_None);\n\tPy_DECREF(arr);\n\tPy_DECREF(arg2);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_generic_method(PyObject *self, PyObject *args, PyObject *kwds, \n\t\t char *str)\n{\n\tPyObject *arr, *meth, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tmeth = PyObject_GetAttrString(arr, str);\n\tif (kwds == NULL) \n\t\tret = PyObject_CallObject(meth, args);\n\telse\n\t\tret = PyObject_Call(meth, args, kwds);\n\tPy_DECREF(meth);\n\tPy_DECREF(arr);\n\treturn PyArray_Return((PyArrayObject *)ret);\n}\n\n/**begin repeat\n\n#name=add, subtract, divide, remainder, divmod, lshift, rshift, and, xor, or, floor_divide, true_divide#\n#PYNAME=Add, Subtract, Divide, Remainder, Divmod, Lshift, Rshift, And, Xor, Or, FloorDivide, TrueDivide#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\t\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n else {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_multiply(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\tlong repeat;\n\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m1->ob_type->tp_as_number == NULL) ||\n\t\t\t (m1->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m2 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m2);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m1, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\\\n\t\t\t\t\tnb_multiply(m1, arr);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m2->ob_type->tp_as_number == NULL) ||\n\t\t\t (m2->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m1 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m1);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m2, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\t\\\n\t\t\t\t\tnb_multiply(arr, m2);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\t\t\t\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret =NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\t/* Both are array scalar objects */\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_multiply(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n\n}\n\n\n\n/**begin repeat\n\n#name=negative, absolute, invert, int, long, float, oct, hex#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1)\n{\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n/**end repeat**/\n\nstatic int\ngentype_nonzero_number(PyObject *m1)\n{\n\tPyObject *arr;\n\tint ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return -1;\n\tret = arr->ob_type->tp_as_number->nb_nonzero(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_str(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Str(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_repr(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Repr(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic void\nformat_longdouble(char *buf, size_t buflen, longdouble val, int precision)\n{\n register char *cp;\n\n PyOS_snprintf(buf, buflen, \"%.*\" LONGDOUBLE_FMT, precision, val);\n cp = buf;\n if (*cp == '-')\n cp++;\n for (; *cp != '\\0'; cp++) {\n if (!isdigit(Py_CHARMASK(*cp)))\n break;\n }\n if (*cp == '\\0') {\n *cp++ = '.';\n *cp++ = '0';\n *cp++ = '\\0';\n }\n}\n\n#if SIZEOF_LONGDOUBLE == SIZEOF_DOUBLE\n#define PREC_REPR 15\n#define PREC_STR 15\n#else\n#define PREC_REPR 21\n#define PREC_STR 21\n#endif\n\nstatic PyObject *\nlongdoubletype_repr(PyObject *self)\n{\n static char buf[100];\n format_longdouble(buf, sizeof(buf), ((PyLongDoubleScalarObject *)self)->obval, PREC_REPR);\n return PyString_FromString(buf);\n}\n\nstatic PyObject *\nclongdoubletype_repr(PyObject *self)\n{\n static char buf1[100];\n static char buf2[100];\n\tstatic char buf3[202];\n clongdouble x;\n x = ((PyCLongDoubleScalarObject *)self)->obval;\n format_longdouble(buf1, sizeof(buf1), x.real, PREC_REPR);\n format_longdouble(buf2, sizeof(buf2), x.imag, PREC_REPR);\n\n\tsnprintf(buf3, sizeof(buf3), \"(%s+%sj)\", buf1, buf2);\n\treturn PyString_FromString(buf3);\n}\n\n#define longdoubletype_str longdoubletype_repr\n#define clongdoubletype_str clongdoubletype_repr\n\n/** Could improve this with a PyLong_FromLongDouble(longdouble ldval)\n but this would need some more work...\n**/\n\n/**begin repeat\n\n#name=(int, long, hex, oct, float)*2#\n#KIND=(Long*4, Float)*2#\n#char=,,,,,c*5#\n#CHAR=,,,,,C*5#\n#POST=,,,,,.real*5#\n*/\nstatic PyObject *\n@char@longdoubletype_@name@(PyObject *self)\n{\n\tdouble dval;\n\tPyObject *obj, *ret;\n\t\n\tdval = (double)(((Py@CHAR@LongDoubleScalarObject *)self)->obval)@POST@;\n\tobj = Py@KIND@_FromDouble(dval);\n\tret = obj->ob_type->tp_as_number->nb_@name@(obj);\n\tPy_DECREF(obj);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *gentype_copy(PyObject *, PyObject *);\n\nstatic PyNumberMethods gentype_as_number = {\n (binaryfunc)gentype_add,\t\t /*nb_add*/\n (binaryfunc)gentype_subtract,\t\t /*nb_subtract*/\n (binaryfunc)gentype_multiply,\t\t /*nb_multiply*/\n (binaryfunc)gentype_divide,\t\t /*nb_divide*/\n (binaryfunc)gentype_remainder,\t /*nb_remainder*/\n (binaryfunc)gentype_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)gentype_power,\t\t /*nb_power*/\n (unaryfunc)gentype_negative,\t \n (unaryfunc)gentype_copy,\t\t /*nb_pos*/ \n (unaryfunc)gentype_absolute,\t\t /*(unaryfunc)gentype_abs,*/\n (inquiry)gentype_nonzero_number,\t\t /*nb_nonzero*/\n (unaryfunc)gentype_invert,\t\t /*nb_invert*/\n (binaryfunc)gentype_lshift,\t /*nb_lshift*/\n (binaryfunc)gentype_rshift,\t /*nb_rshift*/\n (binaryfunc)gentype_and,\t /*nb_and*/\n (binaryfunc)gentype_xor,\t /*nb_xor*/\n (binaryfunc)gentype_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)gentype_int,\t\t /*nb_int*/\n (unaryfunc)gentype_long,\t\t /*nb_long*/\n (unaryfunc)gentype_float,\t\t /*nb_float*/\n (unaryfunc)gentype_oct,\t\t /*nb_oct*/\n (unaryfunc)gentype_hex,\t\t /*nb_hex*/\n 0, /*inplace_add*/\n 0, /*inplace_subtract*/\n 0, /*inplace_multiply*/\n 0, /*inplace_divide*/\n 0, /*inplace_remainder*/\n 0, /*inplace_power*/\n 0, /*inplace_lshift*/\n 0, /*inplace_rshift*/\n 0, /*inplace_and*/\n 0, /*inplace_xor*/\n 0, /*inplace_or*/\n (binaryfunc)gentype_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)gentype_true_divide,\t /*nb_true_divide*/\n 0, /*nb_inplace_floor_divide*/\n 0, /*nb_inplace_true_divide*/\n\n};\n\nstatic PyObject *\ngentype_richcompare(PyObject *self, PyObject *other, int cmp_op) \n{\n\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_richcompare(arr, other, cmp_op);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_ndim_get(PyObject *self)\n{\n\treturn PyInt_FromLong(0);\n}\n\nstatic PyObject *\ngentype_flags_get(PyObject *self)\n{\n\tstatic int flags=CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED | \\\n\t\tNOTSWAPPED;\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, flags, 1);\n\n}\n\nstatic PyObject *\ngentype_shape_get(PyObject *self)\n{\n\treturn PyTuple_New(0);\n}\n\n/*\nstatic int\ngentype_shape_set(PyObject *self, PyObject *val)\n{\n\tif (!PyTuple_Check(val) || PyTuple_GET_SIZE(val) > 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \\\n\t\t\t\t\"invalid shape for scalar\");\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n*/\n\n\nstatic PyObject *\ngentype_data_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\n\treturn PyBuffer_FromObject(self, 0, typecode.itemsize);\n}\n\n\nstatic PyObject *\ngentype_itemsize_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.itemsize);\n}\n\nstatic PyObject *\ngentype_size_get(PyObject *self)\n{\n\treturn PyInt_FromLong(1);\n}\n\n\nstatic PyObject *\ngentype_typechar_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_Descr *descr;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tdescr = PyArray_DescrFromType(typecode.type_num);\n\tif (PyArray_IsScalar(self, Flexible)) \n\t\treturn PyString_FromFormat(\"%c%d\", (int)(descr->type),\n\t\t\t\t\t typecode.itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(descr->type), 1);\n}\n\nstatic PyObject *\ngentype_typestr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"dtypestr\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_descr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"__array_descr__\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\n\nstatic PyObject *\ngentype_typenum_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.type_num);\n}\n\nstatic PyObject *\ngentype_type_get(PyObject *self)\n{\n\treturn (PyObject *)self->ob_type;\n}\n\n\nstatic PyObject *\ngentype_base_get(PyObject *self)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\n\nstatic PyObject *\ngentype_real_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\tPyArray_TypecodeFromScalar(self, &typecode);\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval),\n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize >> 1, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"real\");\n\t\tif (ret != NULL) return ret;\n\t}\n\tPy_INCREF(self);\n\treturn (PyObject *)self;\n}\n\nstatic PyObject *\ngentype_imag_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\ttypecode.itemsize >>= 1;\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval)\n\t\t\t\t + typecode.itemsize, \n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"imag\");\n\t\tif (ret == NULL) {\n\t\t\tPyErr_Clear();\n\t\t\tobj = PyInt_FromLong(0);\n\t\t\tret = PyArray_Scalar((char *)&obj, PyArray_OBJECT, \n\t\t\t\t\t sizeof(void *), 0);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t\treturn ret;\n\t}\n\telse {\n\t\tPyObject *ret;\n\t\tchar *temp;\n\t\ttemp = PyDataMem_NEW(typecode.itemsize);\n\t\tmemset(temp, '\\0', typecode.itemsize);\n\t\tret = PyArray_Scalar(temp, typecode.type_num,\n\t\t\t\t typecode.itemsize, 0);\n\t\tPyDataMem_FREE(temp);\n\t\treturn ret;\n\t}\n}\n\nstatic PyObject *\ngentype_flat_get(PyObject *self)\n{\n\tPyObject *ret, *arr;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = PyArray_IterNew(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyGetSetDef gentype_getsets[] = {\n {\"ndim\", \n\t (getter)gentype_ndim_get, \n\t (setter) 0, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)gentype_flags_get, \n\t (setter)0, \n\t \"integer value of flags\"},\n {\"shape\", \n\t (getter)gentype_shape_get, \n\t (setter)0, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)gentype_shape_get, \n\t (setter) 0, \n\t \"tuple of bytes steps in each dimension\"},\n {\"data\",\n\t (getter)gentype_data_get, \n\t (setter) 0, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)gentype_itemsize_get, \n\t (setter)0, \n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)gentype_size_get,\n (setter)0,\n \"number of elements in the gentype\"},\n\t{\"base\",\n\t (getter)gentype_base_get,\n\t (setter)0,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)gentype_type_get, \n\t (setter)0, \n\t \"get gentype type class\"},\n\t{\"dtypechar\",\n\t (getter)gentype_typechar_get,\n\t (setter)0,\n\t \"get gentype type character code\"},\n\t{\"dtypenum\",\n\t (getter)gentype_typenum_get,\n\t (setter)0,\n\t \"get gentype type number code\"},\n\t{\"dtypestr\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)gentype_real_get, \n\t (setter)0,\n\t \"real part of scalar\"},\n {\"imag\", \n\t (getter)gentype_imag_get, \n\t (setter)0, \n\t \"imaginary part of scalar\"},\n\t{\"flat\", \n\t (getter)gentype_flat_get, \n\t (setter)0, \n\t \"a 1-d view of scalar\"}, \n\t{\"__array_data__\", \n\t (getter)gentype_data_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)gentype_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t/* Does not have __array_priority__ because it is not a subtype.\n\t */\n \t{NULL, NULL, NULL, NULL} /* Sentinel */\n};\n\n/* 0-dim array from scalar object */\n\nstatic char doc_getarray[] = \"sc.__array__(|type) return 0-dim array\";\n\nstatic PyObject *\ngentype_getarray(PyObject *scalar, PyObject *args) \n{\n\tPyArray_Typecode outcode = {PyArray_NOTYPE, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", &PyArray_TypecodeConverter,\n\t\t\t &outcode)) return NULL;\n\treturn PyArray_FromScalar(scalar, &outcode);\n}\n\nstatic char doc_sc_wraparray[] = \"sc.__array_wrap__(obj) return scalar from array\";\n\nstatic PyObject *\ngentype_wraparray(PyObject *scalar, PyObject *args)\n{\n\tPyObject *arr;\n\n\tif (PyTuple_Size(args) < 1) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"only accepts 1 argument.\");\n\t\treturn NULL;\n\t}\n\tarr = PyTuple_GET_ITEM(args, 0);\n\tif (!PyArray_Check(arr)) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"can only be called with ndarray object\");\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_Scalar(PyArray_DATA(arr), PyArray_TYPE(arr),\n\t\t\t PyArray_ITEMSIZE(arr), !PyArray_ISNOTSWAPPED(arr));\n}\n\n\n/**begin repeat\n\n#name=tolist, toscalar, tostring, astype, copy, resize, __deepcopy__, choose, sort, argsort, searchsorted, argmax, argmin, reshape, view, swapaxes, max, min, ptp, conj, conjugate, nonzero, all, any, flatten, ravel#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args)\n{\n\treturn gentype_generic_method(self, args, NULL, \"@name@\");\n}\n/**end repeat**/\n\nstatic PyObject *\ngentype_squeeze(PyObject *self, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\tPy_INCREF(self);\n\treturn self;\n}\n\nstatic int\ngentype_getreadbuf(PyObject *, int, void **);\n\nstatic PyObject *\ngentype_byteswap(PyObject *self, PyObject *args)\n{\n\tBool inplace=FALSE;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter, &inplace))\n\t\treturn NULL;\n\t\n\tif (inplace) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"cannot byteswap a scalar in-place\");\n\t\treturn NULL;\n\t}\n\telse {\n\t\t/* get the data, copyswap it and pass it to a new Array scalar\n\t\t */\n\t\tchar *data;\n\t\tint numbytes;\n\t\tPyArray_Typecode type;\n\t\tPyArray_Descr *descr;\n\t\tPyObject *new;\n\t\tchar *newmem;\n\n\t\tnumbytes = gentype_getreadbuf(self, 0, (void **)&data);\n\t\tPyArray_TypecodeFromScalar(self, &type);\n\t\tnewmem = malloc(type.itemsize);\n\t\tif (newmem == NULL) return PyErr_NoMemory();\n\t\telse memcpy(newmem, data, type.itemsize);\n\t\tdescr = PyArray_DescrFromType(type.type_num);\n\t\tdescr->copyswap(newmem, NULL, 1, type.itemsize);\t\t\n\t\tnew = PyArray_Scalar(newmem, type.type_num, type.itemsize, 0);\n\t\tfree(newmem);\n\t\treturn new;\n\t}\n}\n\n/**begin repeat\n\n#name=transpose, getfield, take, put, putmask, repeat, tofile, mean, trace, diagonal, clip, std, sum, cumsum, prod, cumprod, compress#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\treturn gentype_generic_method(self, args, kwds, \"@name@\");\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_reduce(PyObject *self, PyObject *args)\n{\n\tPyObject *ret=NULL, *obj=NULL, *mod=NULL;\n\tconst char *buffer; \n\tint buflen;\n\n\t/* Return a tuple of (callable object, arguments) */\n\n\tret = PyTuple_New(2);\n\tif (ret == NULL) return NULL;\t\n\tif (PyObject_AsReadBuffer(self, (const void **)&buffer, &buflen)<0) {\n\t\tPy_DECREF(ret); return NULL;\n\t}\n\tmod = PyImport_ImportModule(\"scipy.base.multiarray\");\n\tif (mod == NULL) return NULL;\n\tobj = PyObject_GetAttrString(mod, \"scalar\");\n\tPy_DECREF(mod);\n\tif (obj == NULL) return NULL;\n\tPyTuple_SET_ITEM(ret, 0, obj);\n\tobj = PyObject_GetAttrString((PyObject *)self, \"dtypestr\");\n\tif PyArray_IsScalar(self, Object) {\n\t\tmod = ((PyObjectScalarObject *)self)->obval;\n\t\tPyTuple_SET_ITEM(ret, 1,\n\t\t\t\t Py_BuildValue(\"NO\", obj, mod));\n\t}\n\telse {\n\t\tmod = PyString_FromStringAndSize(buffer, buflen);\n\t\tPyTuple_SET_ITEM(ret, 1, \n\t\t\t\t Py_BuildValue(\"NN\", obj, mod));\n\t}\n\treturn ret;\n}\n\n/* ignores everything */\nstatic PyObject *\ngentype_setstate(PyObject *self, PyObject *args)\n{\n\tPy_INCREF(Py_None);\n\treturn (Py_None);\n}\n\nstatic PyObject *\ngentype_dump(PyObject *self, PyObject *args)\n{\n\tPyObject *file=NULL;\n\tint ret;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &file))\n\t\treturn NULL;\n\tret = PyArray_Dump(self, file, 2);\n\tif (ret < 0) return NULL;\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyObject *\ngentype_dumps(PyObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\"))\n\t\treturn NULL;\n\treturn PyArray_Dumps(self, 2);\n}\n\n\n/* setting flags cannot be done for scalars */\nstatic PyObject *\ngentype_setflags(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic int _array_typecode_fromstr(char *, int *, PyArray_Typecode *);\n\n/* need to fill in doc-strings for these methods on import -- copy from \n array docstrings \n*/\nstatic PyMethodDef gentype_methods[] = {\n {\"tolist\",\t (PyCFunction)gentype_tolist,\t1, NULL},\n {\"toscalar\", (PyCFunction)gentype_toscalar, METH_VARARGS, NULL},\n\t{\"tofile\", (PyCFunction)gentype_tofile, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"tostring\", (PyCFunction)gentype_tostring, METH_VARARGS, NULL},\n {\"byteswap\", (PyCFunction)gentype_byteswap,1, NULL},\n {\"astype\", (PyCFunction)gentype_astype, 1, NULL},\n\t{\"getfield\", (PyCFunction)gentype_getfield, \n\t METH_VARARGS | METH_KEYWORDS, NULL},\n {\"copy\", (PyCFunction)gentype_copy, 1, NULL}, \n {\"resize\", (PyCFunction)gentype_resize, 1, NULL}, \n\n\t{\"__array__\", (PyCFunction)gentype_getarray, 1, doc_getarray},\n\t{\"__array_wrap__\", (PyCFunction)gentype_wraparray, 1, doc_sc_wraparray},\n\n /* for the copy module */\n {\"__copy__\", (PyCFunction)gentype_copy, 1, NULL},\n {\"__deepcopy__\", (PyCFunction)gentype___deepcopy__, 1, NULL},\n\n\n {\"__reduce__\", (PyCFunction) gentype_reduce, 1, NULL},\t\n\t/* For consistency does nothing */\n\t{\"__setstate__\", (PyCFunction) gentype_setstate, 1, NULL},\n\n\t{\"dumps\", (PyCFunction) gentype_dumps, 1, NULL},\n\t{\"dump\", (PyCFunction) gentype_dump, 1, NULL},\n\n\t/* Methods for array */\n\t{\"transpose\",\t(PyCFunction)gentype_transpose, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"take\",\t(PyCFunction)gentype_take, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"put\",\t(PyCFunction)gentype_put, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"putmask\",\t(PyCFunction)gentype_putmask, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"repeat\",\t(PyCFunction)gentype_repeat, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"choose\",\t(PyCFunction)gentype_choose, \n\t METH_VARARGS, NULL},\t\n\t{\"sort\",\t(PyCFunction)gentype_sort, \n\t METH_VARARGS, NULL},\n\t{\"argsort\",\t(PyCFunction)gentype_argsort, \n\t METH_VARARGS, NULL},\n\t{\"searchsorted\", (PyCFunction)gentype_searchsorted, \n\t METH_VARARGS, NULL},\t\n\t{\"argmax\",\t(PyCFunction)gentype_argmax, \n\t METH_VARARGS, NULL},\n\t{\"argmin\", (PyCFunction)gentype_argmin,\n\t METH_VARARGS, NULL},\n\t{\"reshape\",\t(PyCFunction)gentype_reshape, \n\t METH_VARARGS, NULL},\n\t{\"squeeze\",\t(PyCFunction)gentype_squeeze, \n\t METH_VARARGS, NULL},\n\t{\"view\", (PyCFunction)gentype_view, \n\t METH_VARARGS, NULL},\n\t{\"swapaxes\", (PyCFunction)gentype_swapaxes,\n\t METH_VARARGS, NULL},\n\t{\"max\", (PyCFunction)gentype_max,\n\t METH_VARARGS, NULL},\n\t{\"min\", (PyCFunction)gentype_min,\n\t METH_VARARGS, NULL},\n\t{\"ptp\", (PyCFunction)gentype_ptp,\n\t METH_VARARGS, NULL},\n\t{\"mean\", (PyCFunction)gentype_mean,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"trace\", (PyCFunction)gentype_trace,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"diagonal\", (PyCFunction)gentype_diagonal,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"clip\", (PyCFunction)gentype_clip,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"conj\", (PyCFunction)gentype_conj,\n\t METH_VARARGS, NULL},\n\t{\"conjugate\", (PyCFunction)gentype_conjugate,\n\t METH_VARARGS, NULL},\n\t{\"nonzero\", (PyCFunction)gentype_nonzero,\n\t METH_VARARGS, NULL},\n\t{\"std\", (PyCFunction)gentype_std,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"sum\", (PyCFunction)gentype_sum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumsum\", (PyCFunction)gentype_cumsum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"prod\", (PyCFunction)gentype_prod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumprod\", (PyCFunction)gentype_cumprod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"all\", (PyCFunction)gentype_all,\n\t METH_VARARGS, NULL},\n\t{\"any\", (PyCFunction)gentype_any,\n\t METH_VARARGS, NULL},\n\t{\"compress\", (PyCFunction)gentype_compress,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"flatten\", (PyCFunction)gentype_flatten,\n\t METH_VARARGS, NULL},\n\t{\"ravel\", (PyCFunction)gentype_ravel,\n\t METH_VARARGS, NULL},\n\t{\"setflags\", (PyCFunction)gentype_setflags,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t/* add other methods!!! */\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\nstatic int\ngentype_getreadbuf(PyObject *self, int segment, void **ptrptr)\n{\n\tint numbytes;\n\tPyArray_Typecode outcode;\n\t\n\tif (segment != 0) {\n\t\tPyErr_SetString(PyExc_SystemError, \n\t\t\t\t\"Accessing non-existent array segment\");\n\t\treturn -1;\n\t}\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tnumbytes = outcode.itemsize;\n\tif PyArray_IsScalar(self, Flexible) {\n\t\tif PyArray_IsScalar(self, String)\n\t\t\t*ptrptr = PyString_AS_STRING(self);\n\t\telse if PyArray_IsScalar(self, Unicode)\n\t\t\t*ptrptr = (char *)PyUnicode_AS_DATA(self);\n\t\telse if PyArray_IsScalar(self, Void)\n\t\t\t*ptrptr = ((PyVoidScalarObject *)self)->obval;\n\t}\n\telse \n\t\t*ptrptr = (void *)&(((PyScalarObject *)self)->obval);\n\n\treturn numbytes;\n}\n\nstatic int\ngentype_getsegcount(PyObject *self, int *lenp)\n{\n\tPyArray_Typecode outcode;\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tif (lenp)\n\t\t*lenp = outcode.itemsize;\n\treturn 1;\n}\n\nstatic int\ngentype_getcharbuf(PyObject *self, int segment, const char **ptrptr)\n{\n\tif (PyArray_IsScalar(self, String) ||\t\\\n\t PyArray_IsScalar(self, Unicode))\n\t\treturn gentype_getreadbuf(self, segment, (void **)ptrptr);\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"Non-character array cannot be interpreted \"\\\n\t\t\t\t\"as character buffer.\");\n\t\treturn -1;\n\t}\n}\n\n\nstatic PyBufferProcs gentype_as_buffer = {\n (getreadbufferproc)gentype_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)0, /*bf_getwritebuffer*/\n (getsegcountproc)gentype_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)gentype_getcharbuf, /*bf_getcharbuffer*/\n};\n\n\n#define BASEFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES\n#define LEAFFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES\n\nstatic PyTypeObject PyGenericArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"generic_arrtype\",\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n\n/* works for VOID and UNICODE */\n\nstatic void\nflexible_dealloc(PyObject *v) \n{\n\tPyDataMem_FREE(((PyVoidScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nstring_arrtype_dealloc(PyObject *v)\n{\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nobject_arrtype_dealloc(PyObject *v)\n{\n\tPy_DECREF(((PyObjectScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\n/* string and unicode inherit from Python Type first and so GET_ITEM is different to\n get to the Python Type.\n */\n\n/**begin repeat \n#name=byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, object#\n#TYPE=BYTE, SHORT, INT, LONG, LONGLONG, UBYTE, USHORT, UINT, ULONG, ULONGLONG, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE, STRING, UNICODE, OBJECT#\n#num=1*16,0,0,1#\n*/\nstatic PyObject *\n@name@_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\n\tif (type->tp_bases && (PyTuple_GET_SIZE(type->tp_bases)==2)) {\n\t\tPyTypeObject *sup;\n\t\tPyObject *ret;\n\t\t/* We are inheriting from a Python type as well so\n\t\t give it first dibs on conversion */\n\t\tsup = (PyTypeObject *)PyTuple_GET_ITEM(type->tp_bases, @num@);\n\t\tret = sup->tp_new(type, args, kwds);\n\t\tif (ret) return ret;\n\t\tPyErr_Clear();\n\t\t/* now do default conversion */\n\t}\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\ttypecode.type_num = PyArray_@TYPE@;\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n/**end repeat**/\n\n/* bool->tp_new only returns Py_True or Py_False */\nstatic PyObject *\nbool_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\nstatic PyObject *\nvoid_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj, *arr;\n\tulonglong memu=1;\n\tPyObject *new=NULL;\n\tPyArray_Typecode typecode = {PyArray_VOID, 0, 0};\n\tchar *destptr;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\t/* For a VOID scalar first see if obj is an integer or long \n\t and create new memory of that size (filled with 0) for the scalar\n\t*/\n\n\tif (PyLong_Check(obj) || PyInt_Check(obj) || \\\n\t PyArray_IsScalar(obj, Integer) ||\n\t (PyArray_Check(obj) && PyArray_NDIM(obj)==0 &&\t\\\n\t PyArray_ISINTEGER(obj))) {\n\t\tnew = obj->ob_type->tp_as_number->nb_long(obj);\n\t}\n\tif (new && PyLong_Check(new)) {\n\t\tPyObject *ret;\n\t\tmemu = PyLong_AsUnsignedLongLong(new);\n\t\tPy_DECREF(new);\n\t\tif (PyErr_Occurred() || (memu > MAX_INT)) {\n\t\t\tPyErr_Clear();\n\t\t\tPyErr_Format(PyExc_OverflowError, \n\t\t\t\t \"size must be smaller than %d\",\n\t\t\t\t (int) MAX_INT);\n\t\t\treturn NULL;\n\t\t}\n\t\tdestptr = PyDataMem_NEW((int) memu);\n\t\tif (destptr == NULL) return PyErr_NoMemory();\n\t\tret = type->tp_alloc(type, 0);\n\t\tif (ret == NULL) {\n\t\t\tPyDataMem_FREE(destptr);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\t((PyVoidScalarObject *)ret)->obval = destptr;\n\t\t((PyVoidScalarObject *)ret)->ob_size = (int) memu;\n\t\tmemset(destptr, '\\0', (size_t) memu);\n\t\treturn ret;\n\t}\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\n\n/**************** Define Hash functions ********************/\n\n/**begin repeat\n#lname=bool,ubyte,ushort#\n#name=Bool,UByte, UShort#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return (long)(((Py@name@ScalarObject *)obj)->obval);\n}\n/**end repeat**/\n\n/**begin repeat\n#lname=byte,short,uint,ulong#\n#name=Byte,Short,UInt,ULong#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((Py@name@ScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n/**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\nstatic long\nint_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyIntScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n/**begin repeat\n#char=,u#\n#Char=,U#\n#ext=&& (x >= LONG_MIN),#\n*/\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n/* we assume SIZEOF_LONGLONG=2*SIZEOF_LONG */\nstatic long\n@char@longlong_arrtype_hash(PyObject *obj)\n{\n long y;\n @char@longlong x = (((Py@Char@LongLongScalarObject *)obj)->obval);\n\n if ((x <= LONG_MAX)@ext@) {\n y = (long) x;\n }\n else {\n union Mask {\n long hashvals[2];\n @char@longlong v;\n } both;\n\n both.v = x;\n y = both.hashvals[0] + (1000003)*both.hashvals[1];\n }\n if (y == -1) y = -2;\n return y;\n}\n#endif\n/**end repeat**/\n\n#if SIZEOF_LONG==SIZEOF_LONGLONG\nstatic long\nulonglong_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyULongLongScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n\n\n/* Wrong thing to do for longdouble, but....*/\n/**begin repeat\n#lname=float, longdouble#\n#name=Float, LongDouble#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return _Py_HashDouble((double) ((Py@name@ScalarObject *)obj)->obval);\n}\n\n/* borrowed from complex_hash */\nstatic long\nc@lname@_arrtype_hash(PyObject *obj)\n{\n long hashreal, hashimag, combined;\n hashreal = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).real);\n\n if (hashreal == -1) return -1;\n hashimag = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).imag);\n if (hashimag == -1) return -1;\n\n combined = hashreal + 1000003 * hashimag;\n if (combined == -1) combined = -2;\n return combined;\n}\n/**end repeat**/\n\nstatic long\nobject_arrtype_hash(PyObject *obj)\n{\n return PyObject_Hash(((PyObjectScalarObject *)obj)->obval);\n}\n\n/* just hash the pointer */\nstatic long\nvoid_arrtype_hash(PyObject *obj)\n{\n return _Py_HashPointer((void *)(((PyVoidScalarObject *)obj)->obval));\n}\n\n/**begin repeat\n#name=bool, string, unicode, void, object#\n#NAME=Bool, String, Unicode, Void, Object#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n/**begin repeat\n#NAME=Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble#\n#name=int*5, uint*5, float*3, complex*3#\n#CNAME=(CHAR, SHORT, INT, LONG, LONGLONG)*2, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@\" STRBITSOF_@CNAME@ \"_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n\n/**end repeat**/\n\n\n\n\nstatic PyNumberMethods longdoubletype_as_number;\nstatic PyNumberMethods clongdoubletype_as_number;\n\nstatic void \ninitialize_numeric_types(void)\n{\n\tPyGenericArrType_Type.tp_dealloc = (destructor)gentype_dealloc;\n\tPyGenericArrType_Type.tp_as_number = &gentype_as_number;\n\tPyGenericArrType_Type.tp_as_buffer = &gentype_as_buffer;\n\tPyGenericArrType_Type.tp_flags = BASEFLAGS;\n\tPyGenericArrType_Type.tp_methods = gentype_methods;\n\tPyGenericArrType_Type.tp_getset = gentype_getsets;\n\tPyGenericArrType_Type.tp_new = NULL;\n\tPyGenericArrType_Type.tp_free = PyObject_Del;\n\tPyGenericArrType_Type.tp_repr = gentype_repr;\n\tPyGenericArrType_Type.tp_str = gentype_str;\n\tPyGenericArrType_Type.tp_richcompare = gentype_richcompare;\n\n\t/**begin repeat\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, \nComplexFloating, Flexible, Character#\n\t*/\n Py@NAME@ArrType_Type.tp_flags = BASEFLAGS;\n\t/**end repeat**/\n\n\t/**begin repeat\n#name=bool, byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, void, object#\n#NAME=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, String, Unicode, Void, Object#\n\t*/\n\tPy@NAME@ArrType_Type.tp_flags = LEAFFLAGS;\n\tPy@NAME@ArrType_Type.tp_new = @name@_arrtype_new;\n\tPy@NAME@ArrType_Type.tp_richcompare = gentype_richcompare;\n\t/**end repeat**/\n\t/* Allow the Void type to be subclassed -- for adding new types */\n\tPyVoidArrType_Type.tp_flags = BASEFLAGS;\n\n /**begin repeat\n#name=bool, byte, short, ubyte, ushort, uint, ulong, ulonglong, float, longdouble, cfloat, clongdouble, void, object#\n#NAME=Bool, Byte, Short, UByte, UShort, UInt, ULong, ULongLong, Float, LongDouble, CFloat, CLongDouble, Void, Object#\n */\n Py@NAME@ArrType_Type.tp_hash = @name@_arrtype_hash;\n /**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\n /* We won't be inheriting from Python Int type. */\n PyIntArrType_Type.tp_hash = int_arrtype_hash;\n#endif\n\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n /* We won't be inheriting from Python Int type. */\n PyLongLongArrType_Type.tp_hash = longlong_arrtype_hash;\n#endif\n\n\t/* These need to be coded specially because getitem does not\n\t return a normal Python type\n\t*/\n\tPyLongDoubleArrType_Type.tp_as_number = &longdoubletype_as_number;\n\tPyCLongDoubleArrType_Type.tp_as_number = &clongdoubletype_as_number;\n\n\t/**begin repeat\n#name=int, long, hex, oct, float, repr, str#\n#kind=tp_as_number->nb*5, tp*2#\n\t*/\n\tPyLongDoubleArrType_Type.@kind@_@name@ = longdoubletype_@name@;\n\tPyCLongDoubleArrType_Type.@kind@_@name@ = clongdoubletype_@name@;\n\t/**end repeat**/\n\n\tPyStringArrType_Type.tp_itemsize = sizeof(char);\n\tPyStringArrType_Type.tp_dealloc = string_arrtype_dealloc;\n\tPyFlexibleArrType_Type.tp_dealloc = flexible_dealloc;\n\tPyObjectArrType_Type.tp_dealloc = object_arrtype_dealloc;\n\n\tPyArrayIter_Type.tp_iter = PyObject_SelfIter;\n\tPyArrayMapIter_Type.tp_iter = PyObject_SelfIter;\n}\n\n\nstatic PyTypeObject *typeobjects[] = {\n\t&PyBoolArrType_Type,\n\t&PyByteArrType_Type,\n\t&PyUByteArrType_Type,\n\t&PyShortArrType_Type,\n\t&PyUShortArrType_Type,\n\t&PyIntArrType_Type,\n\t&PyUIntArrType_Type,\n\t&PyLongArrType_Type,\n\t&PyULongArrType_Type,\n\t&PyLongLongArrType_Type,\n\t&PyULongLongArrType_Type,\n\t&PyFloatArrType_Type,\n\t&PyDoubleArrType_Type,\n\t&PyLongDoubleArrType_Type,\n\t&PyCFloatArrType_Type,\n\t&PyCDoubleArrType_Type,\n\t&PyCLongDoubleArrType_Type,\n\t&PyObjectArrType_Type,\n\t&PyStringArrType_Type,\n\t&PyUnicodeArrType_Type,\n\t&PyVoidArrType_Type\n};\n\n\nstatic int\nPyArray_TypenumFromTypeObject(PyObject *type) \n{\n\tint typenum, i;\n\n\ttypenum = PyArray_NOTYPE;\n i = 0;\n\twhile(i < PyArray_NTYPES) {\n\t\tif (type == (PyObject *)typeobjects[i]) {\n\t\t\ttypenum = i;\n\t\t\tbreak;\n\t\t}\n i++;\n\t}\n\tif (typenum != PyArray_NOTYPE)\n\t\treturn typenum;\n\n\t/* Find registered types */\n\t\n\t/* here */\n\n\t/* Convert generic types to specific types */\n\tif ((type == (PyObject *) &PyNumericArrType_Type) || \\\n\t (type == (PyObject *) &PyInexactArrType_Type) || \\\n\t (type == (PyObject *) &PyFloatingArrType_Type))\n\t\treturn PyArray_DOUBLE;\n\telse if (type == (PyObject *)&PyComplexFloatingArrType_Type)\n\t\treturn PyArray_CDOUBLE;\n\telse if ((type == (PyObject *)&PyIntegerArrType_Type) ||\t\\\n\t\t (type == (PyObject *)&PySignedIntegerArrType_Type))\n\t\treturn PyArray_LONG;\n\telse if (type == (PyObject *) &PyUnsignedIntegerArrType_Type)\n\t\treturn PyArray_ULONG;\n else if (type == (PyObject *) &PyCharacterArrType_Type)\n\t\treturn PyArray_STRING;\n\telse if (type == (PyObject *) &PyFlexibleArrType_Type)\n\t\treturn PyArray_VOID;\n\telse if (type == (PyObject *)&PyBool_Type)\n\t\ttypenum = PyArray_BOOL;\n\telse if (type == (PyObject *)&PyInt_Type)\n\t\ttypenum = PyArray_LONG;\n\telse if (type == (PyObject *)&PyFloat_Type)\n\t\ttypenum = PyArray_DOUBLE;\t\n\telse if (type == (PyObject *)&PyComplex_Type)\n\t\ttypenum = PyArray_CDOUBLE;\n\telse if (type == (PyObject *)&PyString_Type)\n\t\ttypenum = PyArray_STRING;\n\telse if (type == (PyObject *)&PyUnicode_Type)\n\t\ttypenum = PyArray_UNICODE;\n\telse if (type == (PyObject *)&PyBuffer_Type)\n\t\ttypenum = PyArray_VOID;\n\telse\n\t\ttypenum = PyArray_OBJECT;\n\treturn typenum;\n}\n\nstatic void \nPyArray_TypecodeFromTypeObject(PyObject *type, PyArray_Typecode *typecode) {\n\tint itemsize = 0;\n\tint type_num;\n\n\ttype_num = PyArray_TypenumFromTypeObject(type);\n\ttypecode->type_num = type_num;\n\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n itemsize = 0;\n\t}\n\telse {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type_num);\n\t\tif (descr != NULL)\n\t\t\titemsize = descr->elsize;\n\t}\n\ttypecode->itemsize = itemsize;\n\treturn;\n}\n\nstatic void \nPyArray_TypecodeFromScalar(PyObject *sc, PyArray_Typecode *typecode)\n{\n\tint type_num;\n\n PyArray_TypecodeFromTypeObject((PyObject *)sc->ob_type, typecode);\n if (typecode->itemsize == 0) {\n type_num = typecode->type_num;\n\t\tif (type_num == PyArray_STRING) \n\t\t\ttypecode->itemsize = PyString_GET_SIZE(sc);\n\t\telse if (type_num == PyArray_UNICODE)\n\t\t\ttypecode->itemsize = PyUnicode_GET_DATA_SIZE(sc);\n\t\telse if (type_num == PyArray_VOID) {\n\t\t\ttypecode->itemsize = \\\n\t\t\t\t((PyVoidScalarObject *)sc)->ob_size;\n\t\t}\n }\n\treturn;\n}\n\nstatic PyObject *\nPyArray_TypeObjectFromType(int type)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr == NULL) return NULL;\n\tPy_INCREF((PyObject *)descr->typeobj);\n\treturn (PyObject *)descr->typeobj;\n}\n\n", "source_code_before": "/* -*- c -*- */\n\n/**begin repeat\n\n#name=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, Object,#\n#type=Bool, signed char, short, int, long, longlong, unsigned char, unsigned short, unsigned int, unsigned long, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, PyObject *,char#\n*/\ntypedef struct {\n\tPyObject_HEAD;\n\t@type@ obval;\n} Py@name@ScalarObject;\n\n/**end repeat**/\n\n/* Inheritance established later when tp_bases is set (or tp_base for \n single inheritance) */\n\n/**begin repeat\n\n#name=numeric, integer, signedinteger, unsignedinteger, inexact, floating, complexfloating, flexible, \ncharacter#\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, ComplexFloating, Flexible, Character#\n*/\n\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n\n#define PyStringScalarObject PyStringObject\n#define PyUnicodeScalarObject PyUnicodeObject\n\ntypedef struct {\n\tPyObject_VAR_HEAD;\n\tchar *obval;\n} PyVoidScalarObject;\n\n/* 0-dim array from array-scalar object */\n\nstatic PyObject *\nPyArray_FromScalar(PyObject *scalar, PyArray_Typecode *outcode)\n{\n\tPyArray_Typecode typecode;\n\tPyObject *r;\n\tchar *memptr;\n\tPyObject *ret;\n\n\t/* convert to 0-dim array of scalar typecode */\n\tPyArray_TypecodeFromScalar(scalar, &typecode);\n\tr = PyArray_New(&PyArray_Type, 0, NULL, typecode.type_num,\n\t\t\tNULL, NULL, typecode.itemsize, 0, NULL);\n\tif (r==NULL) return NULL;\n\n\tswitch(typecode.type_num) {\n\tcase PyArray_STRING:\n\t\tmemptr = PyString_AS_STRING(scalar);\n\t\tbreak;\n\tcase PyArray_UNICODE:\n\t\tmemptr = (char *)PyUnicode_AS_DATA(scalar);\n\t\tbreak;\n\tcase PyArray_VOID:\n\t\tmemptr = (((PyVoidScalarObject *)scalar)->obval);\n\t\tbreak;\n\tdefault:\n\t\tmemptr = &(((PyScalarObject *)scalar)->obval);\n\t\tbreak;\n\t}\n\n\tmemcpy(PyArray_DATA(r), memptr, PyArray_ITEMSIZE(r));\n\tif (PyArray_ISOBJECT(r)) {\n\t\tPy_INCREF(*((PyObject **)memptr));\n\t}\n\t\n\tif (outcode == NULL || \\\n\t outcode->type_num == PyArray_NOTYPE ||\t\\\n\t outcode->type_num == PyArray_TYPE(r))\n\t\treturn r;\n\n\t/* cast if necessary to desired output typecode */\n\tret = PyArray_CastToType((PyArrayObject *)r, outcode);\n\tPy_DECREF(r);\n\treturn ret;\n}\n\n\nstatic void\ngentype_dealloc(PyObject *v) \n{\n\tv->ob_type->tp_free(v);\n}\n\n\nstatic PyObject *\ngentype_power(PyObject *m1, PyObject *m2, PyObject *m3)\n{\n\tPyObject *arr, *ret, *arg2;\n\tchar *msg=\"unsupported operand type(s) for ** or pow()\";\n\t\n\tif (!PyArray_IsScalar(m1,Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m2,Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(m1, arr,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(arr, m2,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=arg2=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\targ2 = PyArray_FromScalar(m2, NULL);\t\n\tif (arr == NULL || arg2 == NULL) {\n\t\tPy_XDECREF(arr); Py_XDECREF(arg2); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_power(arr, arg2, Py_None);\n\tPy_DECREF(arr);\n\tPy_DECREF(arg2);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_generic_method(PyObject *self, PyObject *args, PyObject *kwds, \n\t\t char *str)\n{\n\tPyObject *arr, *meth, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tmeth = PyObject_GetAttrString(arr, str);\n\tif (kwds == NULL) \n\t\tret = PyObject_CallObject(meth, args);\n\telse\n\t\tret = PyObject_Call(meth, args, kwds);\n\tPy_DECREF(meth);\n\tPy_DECREF(arr);\n\treturn PyArray_Return((PyArrayObject *)ret);\n}\n\n/**begin repeat\n\n#name=add, subtract, divide, remainder, divmod, lshift, rshift, and, xor, or, floor_divide, true_divide#\n#PYNAME=Add, Subtract, Divide, Remainder, Divmod, Lshift, Rshift, And, Xor, Or, FloorDivide, TrueDivide#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\t\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n else {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_multiply(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\tlong repeat;\n\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m1->ob_type->tp_as_number == NULL) ||\n\t\t\t (m1->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m2 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m2);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m1, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\\\n\t\t\t\t\tnb_multiply(m1, arr);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m2->ob_type->tp_as_number == NULL) ||\n\t\t\t (m2->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m1 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m1);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m2, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\t\\\n\t\t\t\t\tnb_multiply(arr, m2);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\t\t\t\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret =NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\t/* Both are array scalar objects */\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_multiply(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n\n}\n\n\n\n/**begin repeat\n\n#name=negative, absolute, invert, int, long, float, oct, hex#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1)\n{\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n/**end repeat**/\n\nstatic int\ngentype_nonzero_number(PyObject *m1)\n{\n\tPyObject *arr;\n\tint ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return -1;\n\tret = arr->ob_type->tp_as_number->nb_nonzero(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_str(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Str(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_repr(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Repr(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic void\nformat_longdouble(char *buf, size_t buflen, longdouble val, int precision)\n{\n register char *cp;\n\n PyOS_snprintf(buf, buflen, \"%.*\" LONGDOUBLE_FMT, precision, val);\n cp = buf;\n if (*cp == '-')\n cp++;\n for (; *cp != '\\0'; cp++) {\n if (!isdigit(Py_CHARMASK(*cp)))\n break;\n }\n if (*cp == '\\0') {\n *cp++ = '.';\n *cp++ = '0';\n *cp++ = '\\0';\n }\n}\n\n#if SIZEOF_LONGDOUBLE == SIZEOF_DOUBLE\n#define PREC_REPR 15\n#define PREC_STR 15\n#else\n#define PREC_REPR 21\n#define PREC_STR 21\n#endif\n\nstatic PyObject *\nlongdoubletype_repr(PyObject *self)\n{\n static char buf[100];\n format_longdouble(buf, sizeof(buf), ((PyLongDoubleScalarObject *)self)->obval, PREC_REPR);\n return PyString_FromString(buf);\n}\n\nstatic PyObject *\nclongdoubletype_repr(PyObject *self)\n{\n static char buf1[100];\n static char buf2[100];\n\tstatic char buf3[202];\n clongdouble x;\n x = ((PyCLongDoubleScalarObject *)self)->obval;\n format_longdouble(buf1, sizeof(buf1), x.real, PREC_REPR);\n format_longdouble(buf2, sizeof(buf2), x.imag, PREC_REPR);\n\n\tsnprintf(buf3, sizeof(buf3), \"(%s+%sj)\", buf1, buf2);\n\treturn PyString_FromString(buf3);\n}\n\n#define longdoubletype_str longdoubletype_repr\n#define clongdoubletype_str clongdoubletype_repr\n\n/** Could improve this with a PyLong_FromLongDouble(longdouble ldval)\n but this would need some more work...\n**/\n\n/**begin repeat\n\n#name=(int, long, hex, oct, float)*2#\n#KIND=(Long*4, Float)*2#\n#char=,,,,,c*5#\n#CHAR=,,,,,C*5#\n#POST=,,,,,.real*5#\n*/\nstatic PyObject *\n@char@longdoubletype_@name@(PyObject *self)\n{\n\tdouble dval;\n\tPyObject *obj, *ret;\n\t\n\tdval = (double)(((Py@CHAR@LongDoubleScalarObject *)self)->obval)@POST@;\n\tobj = Py@KIND@_FromDouble(dval);\n\tret = obj->ob_type->tp_as_number->nb_@name@(obj);\n\tPy_DECREF(obj);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *gentype_copy(PyObject *, PyObject *);\n\nstatic PyNumberMethods gentype_as_number = {\n (binaryfunc)gentype_add,\t\t /*nb_add*/\n (binaryfunc)gentype_subtract,\t\t /*nb_subtract*/\n (binaryfunc)gentype_multiply,\t\t /*nb_multiply*/\n (binaryfunc)gentype_divide,\t\t /*nb_divide*/\n (binaryfunc)gentype_remainder,\t /*nb_remainder*/\n (binaryfunc)gentype_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)gentype_power,\t\t /*nb_power*/\n (unaryfunc)gentype_negative,\t \n (unaryfunc)gentype_copy,\t\t /*nb_pos*/ \n (unaryfunc)gentype_absolute,\t\t /*(unaryfunc)gentype_abs,*/\n (inquiry)gentype_nonzero_number,\t\t /*nb_nonzero*/\n (unaryfunc)gentype_invert,\t\t /*nb_invert*/\n (binaryfunc)gentype_lshift,\t /*nb_lshift*/\n (binaryfunc)gentype_rshift,\t /*nb_rshift*/\n (binaryfunc)gentype_and,\t /*nb_and*/\n (binaryfunc)gentype_xor,\t /*nb_xor*/\n (binaryfunc)gentype_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)gentype_int,\t\t /*nb_int*/\n (unaryfunc)gentype_long,\t\t /*nb_long*/\n (unaryfunc)gentype_float,\t\t /*nb_float*/\n (unaryfunc)gentype_oct,\t\t /*nb_oct*/\n (unaryfunc)gentype_hex,\t\t /*nb_hex*/\n 0, /*inplace_add*/\n 0, /*inplace_subtract*/\n 0, /*inplace_multiply*/\n 0, /*inplace_divide*/\n 0, /*inplace_remainder*/\n 0, /*inplace_power*/\n 0, /*inplace_lshift*/\n 0, /*inplace_rshift*/\n 0, /*inplace_and*/\n 0, /*inplace_xor*/\n 0, /*inplace_or*/\n (binaryfunc)gentype_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)gentype_true_divide,\t /*nb_true_divide*/\n 0, /*nb_inplace_floor_divide*/\n 0, /*nb_inplace_true_divide*/\n\n};\n\nstatic PyObject *\ngentype_richcompare(PyObject *self, PyObject *other, int cmp_op) \n{\n\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_richcompare(arr, other, cmp_op);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_ndim_get(PyObject *self)\n{\n\treturn PyInt_FromLong(0);\n}\n\nstatic PyObject *\ngentype_flags_get(PyObject *self)\n{\n\tPyObject *dict;\n\tdict = PyDict_New();\t\n\n#define ADDFLAG(flag, val) PyDict_SetItemString(dict, #flag, Py_##val);\n\n ADDFLAG(CONTIGUOUS, True);\n ADDFLAG(OWN_DATA, True);\n ADDFLAG(FORTRAN, True);\n ADDFLAG(ALIGNED, True);\n ADDFLAG(NOTSWAPPED, True);\n ADDFLAG(WRITEABLE, False);\n ADDFLAG(UPDATEIFCOPY, False);\n\treturn dict;\n#undef ADDFLAG\n}\n\nstatic PyObject *\ngentype_shape_get(PyObject *self)\n{\n\treturn PyTuple_New(0);\n}\n\n/*\nstatic int\ngentype_shape_set(PyObject *self, PyObject *val)\n{\n\tif (!PyTuple_Check(val) || PyTuple_GET_SIZE(val) > 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \\\n\t\t\t\t\"invalid shape for scalar\");\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n*/\n\n\nstatic PyObject *\ngentype_data_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\n\treturn PyBuffer_FromObject(self, 0, typecode.itemsize);\n}\n\n\nstatic PyObject *\ngentype_itemsize_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.itemsize);\n}\n\nstatic PyObject *\ngentype_size_get(PyObject *self)\n{\n\treturn PyInt_FromLong(1);\n}\n\n\nstatic PyObject *\ngentype_typechar_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_Descr *descr;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tdescr = PyArray_DescrFromType(typecode.type_num);\n\tif (PyArray_IsScalar(self, Flexible)) \n\t\treturn PyString_FromFormat(\"%c%d\", (int)(descr->type),\n\t\t\t\t\t typecode.itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(descr->type), 1);\n}\n\nstatic PyObject *\ngentype_typestr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"dtypestr\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_descr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"__array_descr__\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\n\nstatic PyObject *\ngentype_typenum_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.type_num);\n}\n\nstatic PyObject *\ngentype_type_get(PyObject *self)\n{\n\treturn (PyObject *)self->ob_type;\n}\n\n\nstatic PyObject *\ngentype_base_get(PyObject *self)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\n\nstatic PyObject *\ngentype_real_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\tPyArray_TypecodeFromScalar(self, &typecode);\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval),\n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize >> 1, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"real\");\n\t\tif (ret != NULL) return ret;\n\t}\n\tPy_INCREF(self);\n\treturn (PyObject *)self;\n}\n\nstatic PyObject *\ngentype_imag_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\ttypecode.itemsize >>= 1;\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval)\n\t\t\t\t + typecode.itemsize, \n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"imag\");\n\t\tif (ret == NULL) {\n\t\t\tPyErr_Clear();\n\t\t\tobj = PyInt_FromLong(0);\n\t\t\tret = PyArray_Scalar((char *)&obj, PyArray_OBJECT, \n\t\t\t\t\t sizeof(void *), 0);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t\treturn ret;\n\t}\n\telse {\n\t\tPyObject *ret;\n\t\tchar *temp;\n\t\ttemp = PyDataMem_NEW(typecode.itemsize);\n\t\tmemset(temp, '\\0', typecode.itemsize);\n\t\tret = PyArray_Scalar(temp, typecode.type_num,\n\t\t\t\t typecode.itemsize, 0);\n\t\tPyDataMem_FREE(temp);\n\t\treturn ret;\n\t}\n}\n\nstatic PyObject *\ngentype_flat_get(PyObject *self)\n{\n\tPyObject *ret, *arr;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = PyArray_IterNew(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyGetSetDef gentype_getsets[] = {\n {\"ndim\", \n\t (getter)gentype_ndim_get, \n\t (setter) 0, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)gentype_flags_get, \n\t (setter)0, \n\t \"integer value of flags\"},\n {\"shape\", \n\t (getter)gentype_shape_get, \n\t (setter)0, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)gentype_shape_get, \n\t (setter) 0, \n\t \"tuple of bytes steps in each dimension\"},\n {\"data\",\n\t (getter)gentype_data_get, \n\t (setter) 0, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)gentype_itemsize_get, \n\t (setter)0, \n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)gentype_size_get,\n (setter)0,\n \"number of elements in the gentype\"},\n\t{\"base\",\n\t (getter)gentype_base_get,\n\t (setter)0,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)gentype_type_get, \n\t (setter)0, \n\t \"get gentype type class\"},\n\t{\"dtypechar\",\n\t (getter)gentype_typechar_get,\n\t (setter)0,\n\t \"get gentype type character code\"},\n\t{\"dtypenum\",\n\t (getter)gentype_typenum_get,\n\t (setter)0,\n\t \"get gentype type number code\"},\n\t{\"dtypestr\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)gentype_real_get, \n\t (setter)0,\n\t \"real part of scalar\"},\n {\"imag\", \n\t (getter)gentype_imag_get, \n\t (setter)0, \n\t \"imaginary part of scalar\"},\n\t{\"flat\", \n\t (getter)gentype_flat_get, \n\t (setter)0, \n\t \"a 1-d view of scalar\"}, \n\t{\"__array_data__\", \n\t (getter)gentype_data_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)gentype_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t/* Does not have __array_priority__ because it is not a subtype.\n\t */\n \t{NULL, NULL, NULL, NULL} /* Sentinel */\n};\n\n/* 0-dim array from scalar object */\n\nstatic char doc_getarray[] = \"sc.__array__(|type) return 0-dim array\";\n\nstatic PyObject *\ngentype_getarray(PyObject *scalar, PyObject *args) \n{\n\tPyArray_Typecode outcode = {PyArray_NOTYPE, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", &PyArray_TypecodeConverter,\n\t\t\t &outcode)) return NULL;\n\treturn PyArray_FromScalar(scalar, &outcode);\n}\n\nstatic char doc_sc_wraparray[] = \"sc.__array_wrap__(obj) return scalar from array\";\n\nstatic PyObject *\ngentype_wraparray(PyObject *scalar, PyObject *args)\n{\n\tPyObject *arr;\n\n\tif (PyTuple_Size(args) < 1) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"only accepts 1 argument.\");\n\t\treturn NULL;\n\t}\n\tarr = PyTuple_GET_ITEM(args, 0);\n\tif (!PyArray_Check(arr)) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"can only be called with ndarray object\");\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_Scalar(PyArray_DATA(arr), PyArray_TYPE(arr),\n\t\t\t PyArray_ITEMSIZE(arr), !PyArray_ISNOTSWAPPED(arr));\n}\n\n\n/**begin repeat\n\n#name=tolist, toscalar, tostring, astype, copy, resize, __deepcopy__, choose, sort, argsort, searchsorted, argmax, argmin, reshape, view, swapaxes, max, min, ptp, conj, conjugate, nonzero, all, any, flatten, ravel#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args)\n{\n\treturn gentype_generic_method(self, args, NULL, \"@name@\");\n}\n/**end repeat**/\n\nstatic PyObject *\ngentype_squeeze(PyObject *self, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\tPy_INCREF(self);\n\treturn self;\n}\n\nstatic int\ngentype_getreadbuf(PyObject *, int, void **);\n\nstatic PyObject *\ngentype_byteswap(PyObject *self, PyObject *args)\n{\n\tBool inplace=FALSE;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter, &inplace))\n\t\treturn NULL;\n\t\n\tif (inplace) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"cannot byteswap a scalar in-place\");\n\t\treturn NULL;\n\t}\n\telse {\n\t\t/* get the data, copyswap it and pass it to a new Array scalar\n\t\t */\n\t\tchar *data;\n\t\tint numbytes;\n\t\tPyArray_Typecode type;\n\t\tPyArray_Descr *descr;\n\t\tPyObject *new;\n\t\tchar *newmem;\n\n\t\tnumbytes = gentype_getreadbuf(self, 0, (void **)&data);\n\t\tPyArray_TypecodeFromScalar(self, &type);\n\t\tnewmem = malloc(type.itemsize);\n\t\tif (newmem == NULL) return PyErr_NoMemory();\n\t\telse memcpy(newmem, data, type.itemsize);\n\t\tdescr = PyArray_DescrFromType(type.type_num);\n\t\tdescr->copyswap(newmem, NULL, 1, type.itemsize);\t\t\n\t\tnew = PyArray_Scalar(newmem, type.type_num, type.itemsize, 0);\n\t\tfree(newmem);\n\t\treturn new;\n\t}\n}\n\n/**begin repeat\n\n#name=transpose, getfield, take, put, putmask, repeat, tofile, mean, trace, diagonal, clip, std, sum, cumsum, prod, cumprod, compress#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\treturn gentype_generic_method(self, args, kwds, \"@name@\");\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_reduce(PyObject *self, PyObject *args)\n{\n\tPyObject *ret=NULL, *obj=NULL, *mod=NULL;\n\tconst char *buffer; \n\tint buflen;\n\n\t/* Return a tuple of (callable object, arguments) */\n\n\tret = PyTuple_New(2);\n\tif (ret == NULL) return NULL;\t\n\tif (PyObject_AsReadBuffer(self, (const void **)&buffer, &buflen)<0) {\n\t\tPy_DECREF(ret); return NULL;\n\t}\n\tmod = PyImport_ImportModule(\"scipy.base.multiarray\");\n\tif (mod == NULL) return NULL;\n\tobj = PyObject_GetAttrString(mod, \"scalar\");\n\tPy_DECREF(mod);\n\tif (obj == NULL) return NULL;\n\tPyTuple_SET_ITEM(ret, 0, obj);\n\tobj = PyObject_GetAttrString((PyObject *)self, \"dtypestr\");\n\tif PyArray_IsScalar(self, Object) {\n\t\tmod = ((PyObjectScalarObject *)self)->obval;\n\t\tPyTuple_SET_ITEM(ret, 1,\n\t\t\t\t Py_BuildValue(\"NO\", obj, mod));\n\t}\n\telse {\n\t\tmod = PyString_FromStringAndSize(buffer, buflen);\n\t\tPyTuple_SET_ITEM(ret, 1, \n\t\t\t\t Py_BuildValue(\"NN\", obj, mod));\n\t}\n\treturn ret;\n}\n\n/* ignores everything */\nstatic PyObject *\ngentype_setstate(PyObject *self, PyObject *args)\n{\n\tPy_INCREF(Py_None);\n\treturn (Py_None);\n}\n\nstatic PyObject *\ngentype_dump(PyObject *self, PyObject *args)\n{\n\tPyObject *file=NULL;\n\tint ret;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &file))\n\t\treturn NULL;\n\tret = PyArray_Dump(self, file, 2);\n\tif (ret < 0) return NULL;\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyObject *\ngentype_dumps(PyObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\"))\n\t\treturn NULL;\n\treturn PyArray_Dumps(self, 2);\n}\n\n\n/* setting flags cannot be done for scalars */\nstatic PyObject *\ngentype_setflags(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic int _array_typecode_fromstr(char *, int *, PyArray_Typecode *);\n\n/* need to fill in doc-strings for these methods on import -- copy from \n array docstrings \n*/\nstatic PyMethodDef gentype_methods[] = {\n {\"tolist\",\t (PyCFunction)gentype_tolist,\t1, NULL},\n {\"toscalar\", (PyCFunction)gentype_toscalar, METH_VARARGS, NULL},\n\t{\"tofile\", (PyCFunction)gentype_tofile, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"tostring\", (PyCFunction)gentype_tostring, METH_VARARGS, NULL},\n {\"byteswap\", (PyCFunction)gentype_byteswap,1, NULL},\n {\"astype\", (PyCFunction)gentype_astype, 1, NULL},\n\t{\"getfield\", (PyCFunction)gentype_getfield, \n\t METH_VARARGS | METH_KEYWORDS, NULL},\n {\"copy\", (PyCFunction)gentype_copy, 1, NULL}, \n {\"resize\", (PyCFunction)gentype_resize, 1, NULL}, \n\n\t{\"__array__\", (PyCFunction)gentype_getarray, 1, doc_getarray},\n\t{\"__array_wrap__\", (PyCFunction)gentype_wraparray, 1, doc_sc_wraparray},\n\n /* for the copy module */\n {\"__copy__\", (PyCFunction)gentype_copy, 1, NULL},\n {\"__deepcopy__\", (PyCFunction)gentype___deepcopy__, 1, NULL},\n\n\n {\"__reduce__\", (PyCFunction) gentype_reduce, 1, NULL},\t\n\t/* For consistency does nothing */\n\t{\"__setstate__\", (PyCFunction) gentype_setstate, 1, NULL},\n\n\t{\"dumps\", (PyCFunction) gentype_dumps, 1, NULL},\n\t{\"dump\", (PyCFunction) gentype_dump, 1, NULL},\n\n\t/* Methods for array */\n\t{\"transpose\",\t(PyCFunction)gentype_transpose, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"take\",\t(PyCFunction)gentype_take, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"put\",\t(PyCFunction)gentype_put, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"putmask\",\t(PyCFunction)gentype_putmask, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"repeat\",\t(PyCFunction)gentype_repeat, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"choose\",\t(PyCFunction)gentype_choose, \n\t METH_VARARGS, NULL},\t\n\t{\"sort\",\t(PyCFunction)gentype_sort, \n\t METH_VARARGS, NULL},\n\t{\"argsort\",\t(PyCFunction)gentype_argsort, \n\t METH_VARARGS, NULL},\n\t{\"searchsorted\", (PyCFunction)gentype_searchsorted, \n\t METH_VARARGS, NULL},\t\n\t{\"argmax\",\t(PyCFunction)gentype_argmax, \n\t METH_VARARGS, NULL},\n\t{\"argmin\", (PyCFunction)gentype_argmin,\n\t METH_VARARGS, NULL},\n\t{\"reshape\",\t(PyCFunction)gentype_reshape, \n\t METH_VARARGS, NULL},\n\t{\"squeeze\",\t(PyCFunction)gentype_squeeze, \n\t METH_VARARGS, NULL},\n\t{\"view\", (PyCFunction)gentype_view, \n\t METH_VARARGS, NULL},\n\t{\"swapaxes\", (PyCFunction)gentype_swapaxes,\n\t METH_VARARGS, NULL},\n\t{\"max\", (PyCFunction)gentype_max,\n\t METH_VARARGS, NULL},\n\t{\"min\", (PyCFunction)gentype_min,\n\t METH_VARARGS, NULL},\n\t{\"ptp\", (PyCFunction)gentype_ptp,\n\t METH_VARARGS, NULL},\n\t{\"mean\", (PyCFunction)gentype_mean,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"trace\", (PyCFunction)gentype_trace,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"diagonal\", (PyCFunction)gentype_diagonal,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"clip\", (PyCFunction)gentype_clip,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"conj\", (PyCFunction)gentype_conj,\n\t METH_VARARGS, NULL},\n\t{\"conjugate\", (PyCFunction)gentype_conjugate,\n\t METH_VARARGS, NULL},\n\t{\"nonzero\", (PyCFunction)gentype_nonzero,\n\t METH_VARARGS, NULL},\n\t{\"std\", (PyCFunction)gentype_std,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"sum\", (PyCFunction)gentype_sum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumsum\", (PyCFunction)gentype_cumsum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"prod\", (PyCFunction)gentype_prod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumprod\", (PyCFunction)gentype_cumprod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"all\", (PyCFunction)gentype_all,\n\t METH_VARARGS, NULL},\n\t{\"any\", (PyCFunction)gentype_any,\n\t METH_VARARGS, NULL},\n\t{\"compress\", (PyCFunction)gentype_compress,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"flatten\", (PyCFunction)gentype_flatten,\n\t METH_VARARGS, NULL},\n\t{\"ravel\", (PyCFunction)gentype_ravel,\n\t METH_VARARGS, NULL},\n\t{\"setflags\", (PyCFunction)gentype_setflags,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t/* add other methods!!! */\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\nstatic int\ngentype_getreadbuf(PyObject *self, int segment, void **ptrptr)\n{\n\tint numbytes;\n\tPyArray_Typecode outcode;\n\t\n\tif (segment != 0) {\n\t\tPyErr_SetString(PyExc_SystemError, \n\t\t\t\t\"Accessing non-existent array segment\");\n\t\treturn -1;\n\t}\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tnumbytes = outcode.itemsize;\n\tif PyArray_IsScalar(self, Flexible) {\n\t\tif PyArray_IsScalar(self, String)\n\t\t\t*ptrptr = PyString_AS_STRING(self);\n\t\telse if PyArray_IsScalar(self, Unicode)\n\t\t\t*ptrptr = (char *)PyUnicode_AS_DATA(self);\n\t\telse if PyArray_IsScalar(self, Void)\n\t\t\t*ptrptr = ((PyVoidScalarObject *)self)->obval;\n\t}\n\telse \n\t\t*ptrptr = (void *)&(((PyScalarObject *)self)->obval);\n\n\treturn numbytes;\n}\n\nstatic int\ngentype_getsegcount(PyObject *self, int *lenp)\n{\n\tPyArray_Typecode outcode;\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tif (lenp)\n\t\t*lenp = outcode.itemsize;\n\treturn 1;\n}\n\nstatic int\ngentype_getcharbuf(PyObject *self, int segment, const char **ptrptr)\n{\n\tif (PyArray_IsScalar(self, String) ||\t\\\n\t PyArray_IsScalar(self, Unicode))\n\t\treturn gentype_getreadbuf(self, segment, (void **)ptrptr);\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"Non-character array cannot be interpreted \"\\\n\t\t\t\t\"as character buffer.\");\n\t\treturn -1;\n\t}\n}\n\n\nstatic PyBufferProcs gentype_as_buffer = {\n (getreadbufferproc)gentype_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)0, /*bf_getwritebuffer*/\n (getsegcountproc)gentype_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)gentype_getcharbuf, /*bf_getcharbuffer*/\n};\n\n\n#define BASEFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES\n#define LEAFFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES\n\nstatic PyTypeObject PyGenericArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"generic_arrtype\",\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n\n/* works for VOID and UNICODE */\n\nstatic void\nflexible_dealloc(PyObject *v) \n{\n\tPyDataMem_FREE(((PyVoidScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nstring_arrtype_dealloc(PyObject *v)\n{\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nobject_arrtype_dealloc(PyObject *v)\n{\n\tPy_DECREF(((PyObjectScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\n/* string and unicode inherit from Python Type first and so GET_ITEM is different to\n get to the Python Type.\n */\n\n/**begin repeat \n#name=byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, object#\n#TYPE=BYTE, SHORT, INT, LONG, LONGLONG, UBYTE, USHORT, UINT, ULONG, ULONGLONG, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE, STRING, UNICODE, OBJECT#\n#num=1*16,0,0,1#\n*/\nstatic PyObject *\n@name@_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\n\tif (type->tp_bases && (PyTuple_GET_SIZE(type->tp_bases)==2)) {\n\t\tPyTypeObject *sup;\n\t\tPyObject *ret;\n\t\t/* We are inheriting from a Python type as well so\n\t\t give it first dibs on conversion */\n\t\tsup = (PyTypeObject *)PyTuple_GET_ITEM(type->tp_bases, @num@);\n\t\tret = sup->tp_new(type, args, kwds);\n\t\tif (ret) return ret;\n\t\tPyErr_Clear();\n\t\t/* now do default conversion */\n\t}\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\ttypecode.type_num = PyArray_@TYPE@;\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n/**end repeat**/\n\n/* bool->tp_new only returns Py_True or Py_False */\nstatic PyObject *\nbool_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\nstatic PyObject *\nvoid_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj, *arr;\n\tulonglong memu=1;\n\tPyObject *new=NULL;\n\tPyArray_Typecode typecode = {PyArray_VOID, 0, 0};\n\tchar *destptr;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\t/* For a VOID scalar first see if obj is an integer or long \n\t and create new memory of that size (filled with 0) for the scalar\n\t*/\n\n\tif (PyLong_Check(obj) || PyInt_Check(obj) || \\\n\t PyArray_IsScalar(obj, Integer) ||\n\t (PyArray_Check(obj) && PyArray_NDIM(obj)==0 &&\t\\\n\t PyArray_ISINTEGER(obj))) {\n\t\tnew = obj->ob_type->tp_as_number->nb_long(obj);\n\t}\n\tif (new && PyLong_Check(new)) {\n\t\tPyObject *ret;\n\t\tmemu = PyLong_AsUnsignedLongLong(new);\n\t\tPy_DECREF(new);\n\t\tif (PyErr_Occurred() || (memu > MAX_INT)) {\n\t\t\tPyErr_Clear();\n\t\t\tPyErr_Format(PyExc_OverflowError, \n\t\t\t\t \"size must be smaller than %d\",\n\t\t\t\t (int) MAX_INT);\n\t\t\treturn NULL;\n\t\t}\n\t\tdestptr = PyDataMem_NEW((int) memu);\n\t\tif (destptr == NULL) return PyErr_NoMemory();\n\t\tret = type->tp_alloc(type, 0);\n\t\tif (ret == NULL) {\n\t\t\tPyDataMem_FREE(destptr);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\t((PyVoidScalarObject *)ret)->obval = destptr;\n\t\t((PyVoidScalarObject *)ret)->ob_size = (int) memu;\n\t\tmemset(destptr, '\\0', (size_t) memu);\n\t\treturn ret;\n\t}\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\n\n/**************** Define Hash functions ********************/\n\n/**begin repeat\n#lname=bool,ubyte,ushort#\n#name=Bool,UByte, UShort#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return (long)(((Py@name@ScalarObject *)obj)->obval);\n}\n/**end repeat**/\n\n/**begin repeat\n#lname=byte,short,uint,ulong#\n#name=Byte,Short,UInt,ULong#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((Py@name@ScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n/**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\nstatic long\nint_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyIntScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n/**begin repeat\n#char=,u#\n#Char=,U#\n#ext=&& (x >= LONG_MIN),#\n*/\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n/* we assume SIZEOF_LONGLONG=2*SIZEOF_LONG */\nstatic long\n@char@longlong_arrtype_hash(PyObject *obj)\n{\n long y;\n @char@longlong x = (((Py@Char@LongLongScalarObject *)obj)->obval);\n\n if ((x <= LONG_MAX)@ext@) {\n y = (long) x;\n }\n else {\n union Mask {\n long hashvals[2];\n @char@longlong v;\n } both;\n\n both.v = x;\n y = both.hashvals[0] + (1000003)*both.hashvals[1];\n }\n if (y == -1) y = -2;\n return y;\n}\n#endif\n/**end repeat**/\n\n#if SIZEOF_LONG==SIZEOF_LONGLONG\nstatic long\nulonglong_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyULongLongScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n\n\n/* Wrong thing to do for longdouble, but....*/\n/**begin repeat\n#lname=float, longdouble#\n#name=Float, LongDouble#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return _Py_HashDouble((double) ((Py@name@ScalarObject *)obj)->obval);\n}\n\n/* borrowed from complex_hash */\nstatic long\nc@lname@_arrtype_hash(PyObject *obj)\n{\n long hashreal, hashimag, combined;\n hashreal = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).real);\n\n if (hashreal == -1) return -1;\n hashimag = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).imag);\n if (hashimag == -1) return -1;\n\n combined = hashreal + 1000003 * hashimag;\n if (combined == -1) combined = -2;\n return combined;\n}\n/**end repeat**/\n\nstatic long\nobject_arrtype_hash(PyObject *obj)\n{\n return PyObject_Hash(((PyObjectScalarObject *)obj)->obval);\n}\n\n/* just hash the pointer */\nstatic long\nvoid_arrtype_hash(PyObject *obj)\n{\n return _Py_HashPointer((void *)(((PyVoidScalarObject *)obj)->obval));\n}\n\n/**begin repeat\n#name=bool, string, unicode, void, object#\n#NAME=Bool, String, Unicode, Void, Object#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n/**begin repeat\n#NAME=Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble#\n#name=int*5, uint*5, float*3, complex*3#\n#CNAME=(CHAR, SHORT, INT, LONG, LONGLONG)*2, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@\" STRBITSOF_@CNAME@ \"_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n\n/**end repeat**/\n\n\n\n\nstatic PyNumberMethods longdoubletype_as_number;\nstatic PyNumberMethods clongdoubletype_as_number;\n\nstatic void \ninitialize_numeric_types(void)\n{\n\tPyGenericArrType_Type.tp_dealloc = (destructor)gentype_dealloc;\n\tPyGenericArrType_Type.tp_as_number = &gentype_as_number;\n\tPyGenericArrType_Type.tp_as_buffer = &gentype_as_buffer;\n\tPyGenericArrType_Type.tp_flags = BASEFLAGS;\n\tPyGenericArrType_Type.tp_methods = gentype_methods;\n\tPyGenericArrType_Type.tp_getset = gentype_getsets;\n\tPyGenericArrType_Type.tp_new = NULL;\n\tPyGenericArrType_Type.tp_free = PyObject_Del;\n\tPyGenericArrType_Type.tp_repr = gentype_repr;\n\tPyGenericArrType_Type.tp_str = gentype_str;\n\tPyGenericArrType_Type.tp_richcompare = gentype_richcompare;\n\n\t/**begin repeat\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, \nComplexFloating, Flexible, Character#\n\t*/\n Py@NAME@ArrType_Type.tp_flags = BASEFLAGS;\n\t/**end repeat**/\n\n\t/**begin repeat\n#name=bool, byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, void, object#\n#NAME=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, String, Unicode, Void, Object#\n\t*/\n\tPy@NAME@ArrType_Type.tp_flags = LEAFFLAGS;\n\tPy@NAME@ArrType_Type.tp_new = @name@_arrtype_new;\n\tPy@NAME@ArrType_Type.tp_richcompare = gentype_richcompare;\n\t/**end repeat**/\n\t/* Allow the Void type to be subclassed -- for adding new types */\n\tPyVoidArrType_Type.tp_flags = BASEFLAGS;\n\n /**begin repeat\n#name=bool, byte, short, ubyte, ushort, uint, ulong, ulonglong, float, longdouble, cfloat, clongdouble, void, object#\n#NAME=Bool, Byte, Short, UByte, UShort, UInt, ULong, ULongLong, Float, LongDouble, CFloat, CLongDouble, Void, Object#\n */\n Py@NAME@ArrType_Type.tp_hash = @name@_arrtype_hash;\n /**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\n /* We won't be inheriting from Python Int type. */\n PyIntArrType_Type.tp_hash = int_arrtype_hash;\n#endif\n\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n /* We won't be inheriting from Python Int type. */\n PyLongLongArrType_Type.tp_hash = longlong_arrtype_hash;\n#endif\n\n\t/* These need to be coded specially because getitem does not\n\t return a normal Python type\n\t*/\n\tPyLongDoubleArrType_Type.tp_as_number = &longdoubletype_as_number;\n\tPyCLongDoubleArrType_Type.tp_as_number = &clongdoubletype_as_number;\n\n\t/**begin repeat\n#name=int, long, hex, oct, float, repr, str#\n#kind=tp_as_number->nb*5, tp*2#\n\t*/\n\tPyLongDoubleArrType_Type.@kind@_@name@ = longdoubletype_@name@;\n\tPyCLongDoubleArrType_Type.@kind@_@name@ = clongdoubletype_@name@;\n\t/**end repeat**/\n\n\tPyStringArrType_Type.tp_itemsize = sizeof(char);\n\tPyStringArrType_Type.tp_dealloc = string_arrtype_dealloc;\n\tPyFlexibleArrType_Type.tp_dealloc = flexible_dealloc;\n\tPyObjectArrType_Type.tp_dealloc = object_arrtype_dealloc;\n\n\tPyArrayIter_Type.tp_iter = PyObject_SelfIter;\n\tPyArrayMapIter_Type.tp_iter = PyObject_SelfIter;\n}\n\n\nstatic PyTypeObject *typeobjects[] = {\n\t&PyBoolArrType_Type,\n\t&PyByteArrType_Type,\n\t&PyUByteArrType_Type,\n\t&PyShortArrType_Type,\n\t&PyUShortArrType_Type,\n\t&PyIntArrType_Type,\n\t&PyUIntArrType_Type,\n\t&PyLongArrType_Type,\n\t&PyULongArrType_Type,\n\t&PyLongLongArrType_Type,\n\t&PyULongLongArrType_Type,\n\t&PyFloatArrType_Type,\n\t&PyDoubleArrType_Type,\n\t&PyLongDoubleArrType_Type,\n\t&PyCFloatArrType_Type,\n\t&PyCDoubleArrType_Type,\n\t&PyCLongDoubleArrType_Type,\n\t&PyObjectArrType_Type,\n\t&PyStringArrType_Type,\n\t&PyUnicodeArrType_Type,\n\t&PyVoidArrType_Type\n};\n\n\nstatic int\nPyArray_TypenumFromTypeObject(PyObject *type) \n{\n\tint typenum, i;\n\n\ttypenum = PyArray_NOTYPE;\n i = 0;\n\twhile(i < PyArray_NTYPES) {\n\t\tif (type == (PyObject *)typeobjects[i]) {\n\t\t\ttypenum = i;\n\t\t\tbreak;\n\t\t}\n i++;\n\t}\n\tif (typenum != PyArray_NOTYPE)\n\t\treturn typenum;\n\n\t/* Find registered types */\n\t\n\t/* here */\n\n\t/* Convert generic types to specific types */\n\tif ((type == (PyObject *) &PyNumericArrType_Type) || \\\n\t (type == (PyObject *) &PyInexactArrType_Type) || \\\n\t (type == (PyObject *) &PyFloatingArrType_Type))\n\t\treturn PyArray_DOUBLE;\n\telse if (type == (PyObject *)&PyComplexFloatingArrType_Type)\n\t\treturn PyArray_CDOUBLE;\n\telse if ((type == (PyObject *)&PyIntegerArrType_Type) ||\t\\\n\t\t (type == (PyObject *)&PySignedIntegerArrType_Type))\n\t\treturn PyArray_LONG;\n\telse if (type == (PyObject *) &PyUnsignedIntegerArrType_Type)\n\t\treturn PyArray_ULONG;\n else if (type == (PyObject *) &PyCharacterArrType_Type)\n\t\treturn PyArray_STRING;\n\telse if (type == (PyObject *) &PyFlexibleArrType_Type)\n\t\treturn PyArray_VOID;\n\telse if (type == (PyObject *)&PyBool_Type)\n\t\ttypenum = PyArray_BOOL;\n\telse if (type == (PyObject *)&PyInt_Type)\n\t\ttypenum = PyArray_LONG;\n\telse if (type == (PyObject *)&PyFloat_Type)\n\t\ttypenum = PyArray_DOUBLE;\t\n\telse if (type == (PyObject *)&PyComplex_Type)\n\t\ttypenum = PyArray_CDOUBLE;\n\telse if (type == (PyObject *)&PyString_Type)\n\t\ttypenum = PyArray_STRING;\n\telse if (type == (PyObject *)&PyUnicode_Type)\n\t\ttypenum = PyArray_UNICODE;\n\telse if (type == (PyObject *)&PyBuffer_Type)\n\t\ttypenum = PyArray_VOID;\n\telse\n\t\ttypenum = PyArray_OBJECT;\n\treturn typenum;\n}\n\nstatic void \nPyArray_TypecodeFromTypeObject(PyObject *type, PyArray_Typecode *typecode) {\n\tint itemsize = 0;\n\tint type_num;\n\n\ttype_num = PyArray_TypenumFromTypeObject(type);\n\ttypecode->type_num = type_num;\n\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n itemsize = 0;\n\t}\n\telse {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type_num);\n\t\tif (descr != NULL)\n\t\t\titemsize = descr->elsize;\n\t}\n\ttypecode->itemsize = itemsize;\n\treturn;\n}\n\nstatic void \nPyArray_TypecodeFromScalar(PyObject *sc, PyArray_Typecode *typecode)\n{\n\tint type_num;\n\n PyArray_TypecodeFromTypeObject((PyObject *)sc->ob_type, typecode);\n if (typecode->itemsize == 0) {\n type_num = typecode->type_num;\n\t\tif (type_num == PyArray_STRING) \n\t\t\ttypecode->itemsize = PyString_GET_SIZE(sc);\n\t\telse if (type_num == PyArray_UNICODE)\n\t\t\ttypecode->itemsize = PyUnicode_GET_DATA_SIZE(sc);\n\t\telse if (type_num == PyArray_VOID) {\n\t\t\ttypecode->itemsize = \\\n\t\t\t\t((PyVoidScalarObject *)sc)->ob_size;\n\t\t}\n }\n\treturn;\n}\n\nstatic PyObject *\nPyArray_TypeObjectFromType(int type)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr == NULL) return NULL;\n\tPy_INCREF((PyObject *)descr->typeobj);\n\treturn (PyObject *)descr->typeobj;\n}\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ "\tstatic int flags=CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED | \\", "\t\tNOTSWAPPED;", " static PyObject *module=NULL;", "", " if (module==NULL) {", " module = PyImport_ImportModule(\"scipy.base._internal\");", " if (module == NULL) return NULL;", " }", " return PyObject_CallMethod(module, \"flagsobj\", \"Oii\",", " self, flags, 1);", "" ], "deleted": [ "\tPyObject *dict;", "\tdict = PyDict_New();", "", "#define ADDFLAG(flag, val) PyDict_SetItemString(dict, #flag, Py_##val);", "", " ADDFLAG(CONTIGUOUS, True);", " ADDFLAG(OWN_DATA, True);", " ADDFLAG(FORTRAN, True);", " ADDFLAG(ALIGNED, True);", " ADDFLAG(NOTSWAPPED, True);", " ADDFLAG(WRITEABLE, False);", " ADDFLAG(UPDATEIFCOPY, False);", "\treturn dict;", "#undef ADDFLAG" ] } }, { "old_path": "scipy/base/src/umathmodule.c.src", "new_path": "scipy/base/src/umathmodule.c.src", "filename": "umathmodule.c.src", "extension": "src", "change_type": "MODIFY", "diff": "@@ -1265,12 +1265,54 @@ static void\n #define BOOL_negative BOOL_logical_not\n \n \n+/**begin repeat\n+#TYPE=BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG#\n+#typ=byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong#\n+*/\n+static void\n+@TYPE@_remainder(char **args, intp *dimensions, intp *steps, void *func) \n+{\n+\tregister intp i;\n+\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n+\tchar *i1=args[0], *i2=args[1], *op=args[2];\n+\tdouble x, y, res;\n+\tfor(i=0; i>*10#\n-#kind=remainder*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n+#kind=fmod*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n \n */\n static void \n@@ -1581,7 +1623,7 @@ static struct PyMethodDef methods[] = {\n };\n \n DL_EXPORT(void) initumath(void) {\n-\tPyObject *m, *d, *s, *c_api;\n+\tPyObject *m, *d, *s, *s2, *c_api;\n \tdouble pinf, pzero, mynan;\n \n \t/* Create the module and add the functions */\n@@ -1662,11 +1704,13 @@ DL_EXPORT(void) initumath(void) {\n PyModule_AddObject(m, \"NAN\", PyFloat_FromDouble(mynan));\n \n \ts = PyDict_GetItemString(d, \"conjugate\");\n+\ts2 = PyDict_GetItemString(d, \"remainder\");\n \t/* Setup the array object's numerical structures with appropriate \n \t ufuncs in d*/\n \tPyArray_SetNumericOps(d);\n \n \tPyDict_SetItemString(d, \"conj\", s);\n+\tPyDict_SetItemString(d, \"mod\", s2);\n \n err: \n \t/* Check for errors */\n", "added_lines": 46, "deleted_lines": 2, "source_code": "/* -*- c -*- */\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#define _UMATHMODULE\n#include \"scipy/ufuncobject.h\"\n#include \"abstract.h\"\n#include \n\n\n/* A whole slew of basic math functions are provided originally 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#ifndef M_PI\n#define M_PI 3.14159265358979323846264338328\n#endif\n\n#ifndef HAVE_INVERSE_HYPERBOLIC\nstatic double acosh(double x)\n{\n\treturn log(x + sqrt((x-1.0)*(x+1.0)));\n}\n\nstatic double asinh(double xx)\n{\n\tdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*log(x + sqrt(x*x+1.0));\n}\n\nstatic double atanh(double x)\n{\n\treturn 0.5*log((1.0+x)/(1.0-x));\n}\n#endif\n\n#ifdef HAVE_HYPOT\n#if !defined(NeXT) && !defined(_MSC_VER)\nextern double hypot(double, double);\n#endif\n#else\ndouble hypot(double x, double y)\n{\n\tdouble yx;\n\n\tx = fabs(x);\n\ty = fabs(y);\n\tif (x < y) {\n\t\tdouble temp = x;\n\t\tx = y;\n\t\ty = temp;\n\t}\n\tif (x == 0.)\n\t\treturn 0.;\n\telse {\n\t\tyx = y/x;\n\t\treturn x*sqrt(1.+yx*yx);\n\t}\n}\n#endif\n\n\n\n/* Define isnan, isinf, isfinite, signbit if needed */\n/* Use fpclassify if possible */\n/* isnan, isinf --\n these will use macros and then fpclassify if available before\n defaulting to a dumb convert-to-double version...\n\n isfinite -- define a macro if not already available\n signbit -- if macro available use it, otherwise define a function\n and a dumb convert-to-double version for other types.\n*/\n\n#if defined(fpclassify)\n\n#if !defined(isnan)\n#define isnan(x) (fpclassify(x) == FP_NAN)\n#endif\n#if !defined(isinf)\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n#endif\n\n#else /* check to see if already have a function like this */\n\n#if !defined(HAVE_ISNAN)\n\n#if !defined(isnan)\n#include \"_isnan.c\"\n#endif\n\n#if !defined(isinf)\n#define isinf(x) (!isnan((x)) && isnan((x)-(x)))\n#endif\n\n#endif /* HAVE_ISNAN */\n#endif /* !defined(isnan) */\n\n\n/* Define signbit if needed */\n#if !defined(signbit)\n#include \"_signbit.c\"\n#endif\n\n\n/* Now defined the extended type macros */\n\n/* We assume that isnan and isinf are defined in the same \n way: as functions, with extended functions, or macros\n*/\n\n#if !defined(isnan)\n\n#if !defined(HAVE_LONGDOUBLE_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanl(x) isnan((double)(x))\n#define isinfl(x) (!isnanl((x)) && isnanl((x)-(x)))\n#endif\n\n#if !defined(HAVE_FLOAT_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanf(x) isnan((double)(x))\n#define isinff(x) (!isnanf((x)) && isnanf((x)-(x)))\n#endif\n\n#else /* !defined(isnan) */\n\n#define isnanl(x) isnan((x))\n#define isnanf(x) isnan((x))\n#define isinfl(x) isinf((x))\n#define isinff(x) isinf((x))\n\n#endif /* !defined(isnan) */\n\n\n\n#if !defined(signbit)\n#define signbitl(x) ((longdouble) signbit((double)(x)))\n#define signbitf(x) ((float) signbit((double) (x)))\n#else\n#define signbitl(x) signbit((x))\n#define signbitf(x) signbit((x))\n#endif\n\n#if !defined(isfinite)\n#define isfinite(x) (!(isinf((x)) || isnan((x))))\n#endif\n#define isfinitef(x) (!(isinff((x)) || isnanf((x))))\n#define isfinitel(x) (!(isinfl((x)) || isnanl((x))))\n\n\n/* First, the C functions that do the real work */\n\n/* if C99 extensions not availble\n\nthen define dummy functions that use the double versions for\n\nsin, cos, tan\nsinh, cosh, tanh, \nfabs, floor, ceil, fmod, sqrt, log10, log, exp, fabs\nasin, acos, atan, \nasinh, acosh, atanh\n\nhypot, atan2, pow\n\n*/\n\n/**begin repeat\n\n#kind=(sin,cos,tan,sinh,cosh,tanh,fabs,floor,ceil,sqrt,log10,log,exp,asin,acos,atan,asinh,acosh,atanh)*2#\n#typ=longdouble*19, float*19#\n#c=l*19,f*19#\n#TYPE=LONGDOUBLE*19, FLOAT*19#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x) {\n\treturn (@typ@) @kind@((double)x);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n\n#kind=(atan2,hypot,pow,fmod)*2#\n#typ=longdouble*4, float*4#\n#c=l*4,f*4#\n#TYPE=LONGDOUBLE*4,FLOAT*4#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x, @typ@ y) {\n\treturn (@typ@) @kind@((double)x, (double) y);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n#kind=modf*2#\n#typ=longdouble, float#\n#c=l,f#\n#TYPE=LONGDOUBLE, FLOAT#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ modf@c@(@typ@ x, @typ@ *iptr) {\n double nx, niptr, y;\n nx = (double) x;\n y = modf(nx, &niptr);\n *iptr = (@typ@) niptr;\n return (@typ@) y;\n}\n#endif\n/**end repeat**/\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n#ifdef HAVE_FLOAT_FUNCS\nstatic float acoshf(float x)\n{\n\treturn logf(x + sqrtf((x-1.0)*(x+1.0)));\n}\n\nstatic float asinhf(float xx)\n{\n\tfloat x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logf(x + sqrtf(x*x+1.0));\n}\n\nstatic float atanhf(float x)\n{\n\treturn 0.5*logf((1.0+x)/(1.0-x));\n}\n#else\nstatic float acoshf(float x)\n{\n return (float)acosh((double)(x));\n}\n\nstatic float asinhf(float x)\n{\n return (float)asinh((double)(x));\n}\n\nstatic float atanhf(float x)\n{\n return (float)atanh((double)(x));\n}\n#endif\n#endif\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE)\n#ifdef HAVE_LONGDOUBLE_FUNCS\nstatic longdouble acoshl(longdouble x)\n{\n\treturn logl(x + sqrtl((x-1.0)*(x+1.0)));\n}\n\nstatic longdouble asinhl(longdouble xx)\n{\n\tlongdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logl(x + sqrtl(x*x+1.0));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n\treturn 0.5*logl((1.0+x)/(1.0-x));\n}\n#else\nstatic longdouble acoshl(longdouble x)\n{\n return (longdouble)acosh((double)(x));\n}\n\nstatic longdouble asinhl(longdouble x)\n{\n return (longdouble)asinh((double)(x));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n return (longdouble)atanh((double)(x));\n}\n#endif\n#endif\n\n\n\n\n/* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n segfaults if ufuncobject.c is compiled with a different compiler\n than an extension that makes use of the UFUNC API\n*/\n\n/**begin repeat\n\n#typ=float, double, longdouble#\n#c=f,,l#\n*/\n\n/* constants */\nstatic c@typ@ nc_1@c@ = {1., 0.};\nstatic c@typ@ nc_half@c@ = {0.5, 0.};\nstatic c@typ@ nc_i@c@ = {0., 1.};\nstatic c@typ@ nc_i2@c@ = {0., 0.5};\n/*\nstatic c@typ@ nc_mi@c@ = {0., -1.};\nstatic c@typ@ nc_pi2@c@ = {M_PI/2., 0.};\n*/\n\nstatic void\nnc_sum@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real + b->real;\n\tr->imag = a->imag + b->imag;\n\treturn;\n}\n\nstatic void\nnc_diff@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real - b->real;\n\tr->imag = a->imag - b->imag;\n\treturn;\n}\n\nstatic void\nnc_neg@c@(c@typ@ *a, c@typ@ *r)\n{\n\tr->real = -a->real;\n\tr->imag = -a->imag;\n\treturn;\n}\n\nstatic void\nnc_prod@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\tr->real = ar*br - ai*bi;\n\tr->imag = ar*bi + ai*br;\n\treturn;\n}\n\nstatic void\nnc_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = (ar*br + ai*bi)/d;\n\tr->imag = (ai*br - ar*bi)/d;\n\treturn;\n}\n\nstatic void\nnc_floor_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = floor@c@((ar*br + ai*bi)/d);\n\tr->imag = 0;\n\treturn;\n}\n\nstatic void \nnc_sqrt@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ s,d;\n\tif (x->real == 0. && x->imag == 0.)\n\t\t*r = *x;\n\telse {\n\t\ts = sqrt@c@(0.5*(fabs@c@(x->real) + hypot@c@(x->real,x->imag)));\n\t\td = 0.5*x->imag/s;\n\t\tif (x->real > 0.) {\n\t\t\tr->real = s;\n\t\t\tr->imag = d;\n\t\t}\n\t\telse if (x->imag >= 0.) {\n\t\t\tr->real = d;\n\t\t\tr->imag = s;\n\t\t}\n\t\telse {\n\t\t\tr->real = -d;\n\t\t\tr->imag = -s;\n\t\t}\n\t}\n\treturn;\n}\n\nstatic void \nnc_log@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ l = hypot@c@(x->real,x->imag);\n\tr->imag = atan2@c@(x->imag, x->real);\n\tr->real = log@c@(l);\n\treturn;\n}\n\nstatic void \nnc_exp@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ a = exp@c@(x->real);\n\tr->real = a*cos@c@(x->imag);\n\tr->imag = a*sin@c@(x->imag);\n\treturn;\n}\n\nstatic void\nnc_pow@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\t\n\tif (br == 0. && bi == 0.) {\n\t\tr->real = 1.;\n\t\tr->imag = 0.;\n\t}\n\telse if (ar == 0. && ai == 0.) {\n\t\tr->real = 0.;\n\t\tr->imag = 0.;\n\t}\n\telse {\n\t\tnc_log@c@(a, r);\n\t\tnc_prod@c@(r, b, r);\n\t\tnc_exp@c@(r, r);\n\t}\n\treturn;\n}\n\n\nstatic void \nnc_prodi@c@(c@typ@ *x, c@typ@ *r)\n{\n\tr->real = -x->imag;\n\tr->imag = x->real;\n\treturn;\n}\n\n\nstatic void \nnc_acos@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x,x,r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn; \n\t/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));\n\t*/\n}\n\nstatic void \nnc_acosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\treturn;\n\t/*\n\t return nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));\n\t*/\n}\n\nstatic void \nnc_asin@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(x, pa);\n\tnc_sum@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/* \n\t return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));\n\t*/\n}\n\n\nstatic void \nnc_asinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_sum@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_diff@c@(r, x, r);\n\tnc_log@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/*\n\t return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));\n\t*/\n}\n\nstatic void \nnc_atan@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_i@c@, x, pa);\n\tnc_sum@c@(&nc_i@c@, x, r);\n\tnc_quot@c@(r, pa, r);\n\tnc_log@c@(r,r);\n\tnc_prod@c@(&nc_i2@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));\n\t*/\n}\n\nstatic void \nnc_atanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_1@c@, x, r);\n\tnc_sum@c@(&nc_1@c@, x, pa);\n\tnc_quot@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prod@c@(&nc_half@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));\n\t*/\n}\n\nstatic void\nnc_cos@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos@c@(xr)*cosh@c@(xi);\n\tr->imag = -sin@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void \nnc_cosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos(xi)*cosh(xr);\n\tr->imag = sin(xi)*sinh(xr);\n\treturn;\n}\n\n\n#define M_LOG10_E 0.434294481903251827651128918916605082294397\n\nstatic void \nnc_log10@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_log@c@(x, r);\n\tr->real *= M_LOG10_E;\n\tr->imag *= M_LOG10_E;\n\treturn;\n}\n\nstatic void \nnc_sin@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = sin@c@(xr)*cosh@c@(xi);\n\tr->imag = cos@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void\nnc_sinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag; \n\tr->real = cos@c@(xi)*sinh@c@(xr);\n\tr->imag = sin@c@(xi)*cosh@c@(xr);\n\treturn;\n}\n\nstatic void \nnc_tan@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ sr,cr,shi,chi;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsr = sin@c@(xr);\n\tcr = cos@c@(xr);\n\tshi = sinh(xi);\n\tchi = cosh(xi);\n\trs = sr*chi;\n\tis = cr*shi;\n\trc = cr*chi;\n\tic = -sr*shi;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\nstatic void \nnc_tanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ si,ci,shr,chr;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsi = sin@c@(xi);\n\tci = cos@c@(xi);\n\tshr = sinh@c@(xr);\n\tchr = cosh@c@(xr);\n\trs = ci*shr;\n\tis = si*chr;\n\trc = ci*chr;\n\tic = si*shr;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\n/**end repeat**/\n\n\n/**begin repeat\n\n#TYPE=(BOOL, BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE)*2#\n#OP=||, +*13, ^, -*13#\n#kind=add*14, subtract*14#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble)*2#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else\n\tah = al = bh = bl = 0;\n#endif\n\n /* 128-bit product: z*2**64 + (x+y)*2**32 + w */\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n\t/* *c = ((x + y)<<32) + w; */\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>32) || (y>>32) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 32);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>64) || (y>>64) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 64);\n#else\n\treturn 0;\n#endif\n\t\n}\n\nstatic int slonglong_overflow(longlong a0, longlong b0)\n{\n\tulonglong a, b;\n ulonglong ah, al, bh, bl, w, x, y, z;\n\n /* Convert to non-negative quantities */\n\tif (a0 < 0) { a = -a0; } else { a = a0; }\n\tif (b0 < 0) { b = -b0; } else { b = b0; }\n\n\n#if SIZEOF_LONGLONG == 64\n\tah = (a >> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else \n\tah = al = bh = bl = 0;\n#endif\n\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n /* \n\t ulonglong c = ((x + y)<<32) + w;\n\t if ((a0 < 0) ^ (b0 < 0))\n\t *c = -c;\n\t else \n\t *c = c\n\t */\n\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>31) || (y>>31) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 31);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>63) || (y>>63) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 63);\n#else\n\treturn 0;\n#endif\n}\n\n/** end direct numarray code **/\n\nstatic void\nBOOL_multiply(char **args, intp *dimensions, intp *steps, void *func) {\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nULONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tulonglong temp;\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\telse if (temp < MIN_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nLONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tlonglong temp;\n\tfor (i=0; i, >=, <, <=, ==, !=, &&, ||, &, |, ^#\n**/\nstatic void\nBOOL_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tBool in1, in2;\n\tfor(i=0; i*16, >=*16, <*16, <=*16#\n#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*4#\n#kind= greater*16, greater_equal*16, less*16, less_equal*16#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i>*10#\n#kind=fmod*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i*17, <*17#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*2#\n#kind= maximum*17, minimum*17#\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i\n\n\n/* A whole slew of basic math functions are provided originally 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#ifndef M_PI\n#define M_PI 3.14159265358979323846264338328\n#endif\n\n#ifndef HAVE_INVERSE_HYPERBOLIC\nstatic double acosh(double x)\n{\n\treturn log(x + sqrt((x-1.0)*(x+1.0)));\n}\n\nstatic double asinh(double xx)\n{\n\tdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*log(x + sqrt(x*x+1.0));\n}\n\nstatic double atanh(double x)\n{\n\treturn 0.5*log((1.0+x)/(1.0-x));\n}\n#endif\n\n#ifdef HAVE_HYPOT\n#if !defined(NeXT) && !defined(_MSC_VER)\nextern double hypot(double, double);\n#endif\n#else\ndouble hypot(double x, double y)\n{\n\tdouble yx;\n\n\tx = fabs(x);\n\ty = fabs(y);\n\tif (x < y) {\n\t\tdouble temp = x;\n\t\tx = y;\n\t\ty = temp;\n\t}\n\tif (x == 0.)\n\t\treturn 0.;\n\telse {\n\t\tyx = y/x;\n\t\treturn x*sqrt(1.+yx*yx);\n\t}\n}\n#endif\n\n\n\n/* Define isnan, isinf, isfinite, signbit if needed */\n/* Use fpclassify if possible */\n/* isnan, isinf --\n these will use macros and then fpclassify if available before\n defaulting to a dumb convert-to-double version...\n\n isfinite -- define a macro if not already available\n signbit -- if macro available use it, otherwise define a function\n and a dumb convert-to-double version for other types.\n*/\n\n#if defined(fpclassify)\n\n#if !defined(isnan)\n#define isnan(x) (fpclassify(x) == FP_NAN)\n#endif\n#if !defined(isinf)\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n#endif\n\n#else /* check to see if already have a function like this */\n\n#if !defined(HAVE_ISNAN)\n\n#if !defined(isnan)\n#include \"_isnan.c\"\n#endif\n\n#if !defined(isinf)\n#define isinf(x) (!isnan((x)) && isnan((x)-(x)))\n#endif\n\n#endif /* HAVE_ISNAN */\n#endif /* !defined(isnan) */\n\n\n/* Define signbit if needed */\n#if !defined(signbit)\n#include \"_signbit.c\"\n#endif\n\n\n/* Now defined the extended type macros */\n\n/* We assume that isnan and isinf are defined in the same \n way: as functions, with extended functions, or macros\n*/\n\n#if !defined(isnan)\n\n#if !defined(HAVE_LONGDOUBLE_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanl(x) isnan((double)(x))\n#define isinfl(x) (!isnanl((x)) && isnanl((x)-(x)))\n#endif\n\n#if !defined(HAVE_FLOAT_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanf(x) isnan((double)(x))\n#define isinff(x) (!isnanf((x)) && isnanf((x)-(x)))\n#endif\n\n#else /* !defined(isnan) */\n\n#define isnanl(x) isnan((x))\n#define isnanf(x) isnan((x))\n#define isinfl(x) isinf((x))\n#define isinff(x) isinf((x))\n\n#endif /* !defined(isnan) */\n\n\n\n#if !defined(signbit)\n#define signbitl(x) ((longdouble) signbit((double)(x)))\n#define signbitf(x) ((float) signbit((double) (x)))\n#else\n#define signbitl(x) signbit((x))\n#define signbitf(x) signbit((x))\n#endif\n\n#if !defined(isfinite)\n#define isfinite(x) (!(isinf((x)) || isnan((x))))\n#endif\n#define isfinitef(x) (!(isinff((x)) || isnanf((x))))\n#define isfinitel(x) (!(isinfl((x)) || isnanl((x))))\n\n\n/* First, the C functions that do the real work */\n\n/* if C99 extensions not availble\n\nthen define dummy functions that use the double versions for\n\nsin, cos, tan\nsinh, cosh, tanh, \nfabs, floor, ceil, fmod, sqrt, log10, log, exp, fabs\nasin, acos, atan, \nasinh, acosh, atanh\n\nhypot, atan2, pow\n\n*/\n\n/**begin repeat\n\n#kind=(sin,cos,tan,sinh,cosh,tanh,fabs,floor,ceil,sqrt,log10,log,exp,asin,acos,atan,asinh,acosh,atanh)*2#\n#typ=longdouble*19, float*19#\n#c=l*19,f*19#\n#TYPE=LONGDOUBLE*19, FLOAT*19#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x) {\n\treturn (@typ@) @kind@((double)x);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n\n#kind=(atan2,hypot,pow,fmod)*2#\n#typ=longdouble*4, float*4#\n#c=l*4,f*4#\n#TYPE=LONGDOUBLE*4,FLOAT*4#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x, @typ@ y) {\n\treturn (@typ@) @kind@((double)x, (double) y);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n#kind=modf*2#\n#typ=longdouble, float#\n#c=l,f#\n#TYPE=LONGDOUBLE, FLOAT#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ modf@c@(@typ@ x, @typ@ *iptr) {\n double nx, niptr, y;\n nx = (double) x;\n y = modf(nx, &niptr);\n *iptr = (@typ@) niptr;\n return (@typ@) y;\n}\n#endif\n/**end repeat**/\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n#ifdef HAVE_FLOAT_FUNCS\nstatic float acoshf(float x)\n{\n\treturn logf(x + sqrtf((x-1.0)*(x+1.0)));\n}\n\nstatic float asinhf(float xx)\n{\n\tfloat x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logf(x + sqrtf(x*x+1.0));\n}\n\nstatic float atanhf(float x)\n{\n\treturn 0.5*logf((1.0+x)/(1.0-x));\n}\n#else\nstatic float acoshf(float x)\n{\n return (float)acosh((double)(x));\n}\n\nstatic float asinhf(float x)\n{\n return (float)asinh((double)(x));\n}\n\nstatic float atanhf(float x)\n{\n return (float)atanh((double)(x));\n}\n#endif\n#endif\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE)\n#ifdef HAVE_LONGDOUBLE_FUNCS\nstatic longdouble acoshl(longdouble x)\n{\n\treturn logl(x + sqrtl((x-1.0)*(x+1.0)));\n}\n\nstatic longdouble asinhl(longdouble xx)\n{\n\tlongdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logl(x + sqrtl(x*x+1.0));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n\treturn 0.5*logl((1.0+x)/(1.0-x));\n}\n#else\nstatic longdouble acoshl(longdouble x)\n{\n return (longdouble)acosh((double)(x));\n}\n\nstatic longdouble asinhl(longdouble x)\n{\n return (longdouble)asinh((double)(x));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n return (longdouble)atanh((double)(x));\n}\n#endif\n#endif\n\n\n\n\n/* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n segfaults if ufuncobject.c is compiled with a different compiler\n than an extension that makes use of the UFUNC API\n*/\n\n/**begin repeat\n\n#typ=float, double, longdouble#\n#c=f,,l#\n*/\n\n/* constants */\nstatic c@typ@ nc_1@c@ = {1., 0.};\nstatic c@typ@ nc_half@c@ = {0.5, 0.};\nstatic c@typ@ nc_i@c@ = {0., 1.};\nstatic c@typ@ nc_i2@c@ = {0., 0.5};\n/*\nstatic c@typ@ nc_mi@c@ = {0., -1.};\nstatic c@typ@ nc_pi2@c@ = {M_PI/2., 0.};\n*/\n\nstatic void\nnc_sum@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real + b->real;\n\tr->imag = a->imag + b->imag;\n\treturn;\n}\n\nstatic void\nnc_diff@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real - b->real;\n\tr->imag = a->imag - b->imag;\n\treturn;\n}\n\nstatic void\nnc_neg@c@(c@typ@ *a, c@typ@ *r)\n{\n\tr->real = -a->real;\n\tr->imag = -a->imag;\n\treturn;\n}\n\nstatic void\nnc_prod@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\tr->real = ar*br - ai*bi;\n\tr->imag = ar*bi + ai*br;\n\treturn;\n}\n\nstatic void\nnc_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = (ar*br + ai*bi)/d;\n\tr->imag = (ai*br - ar*bi)/d;\n\treturn;\n}\n\nstatic void\nnc_floor_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = floor@c@((ar*br + ai*bi)/d);\n\tr->imag = 0;\n\treturn;\n}\n\nstatic void \nnc_sqrt@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ s,d;\n\tif (x->real == 0. && x->imag == 0.)\n\t\t*r = *x;\n\telse {\n\t\ts = sqrt@c@(0.5*(fabs@c@(x->real) + hypot@c@(x->real,x->imag)));\n\t\td = 0.5*x->imag/s;\n\t\tif (x->real > 0.) {\n\t\t\tr->real = s;\n\t\t\tr->imag = d;\n\t\t}\n\t\telse if (x->imag >= 0.) {\n\t\t\tr->real = d;\n\t\t\tr->imag = s;\n\t\t}\n\t\telse {\n\t\t\tr->real = -d;\n\t\t\tr->imag = -s;\n\t\t}\n\t}\n\treturn;\n}\n\nstatic void \nnc_log@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ l = hypot@c@(x->real,x->imag);\n\tr->imag = atan2@c@(x->imag, x->real);\n\tr->real = log@c@(l);\n\treturn;\n}\n\nstatic void \nnc_exp@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ a = exp@c@(x->real);\n\tr->real = a*cos@c@(x->imag);\n\tr->imag = a*sin@c@(x->imag);\n\treturn;\n}\n\nstatic void\nnc_pow@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\t\n\tif (br == 0. && bi == 0.) {\n\t\tr->real = 1.;\n\t\tr->imag = 0.;\n\t}\n\telse if (ar == 0. && ai == 0.) {\n\t\tr->real = 0.;\n\t\tr->imag = 0.;\n\t}\n\telse {\n\t\tnc_log@c@(a, r);\n\t\tnc_prod@c@(r, b, r);\n\t\tnc_exp@c@(r, r);\n\t}\n\treturn;\n}\n\n\nstatic void \nnc_prodi@c@(c@typ@ *x, c@typ@ *r)\n{\n\tr->real = -x->imag;\n\tr->imag = x->real;\n\treturn;\n}\n\n\nstatic void \nnc_acos@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x,x,r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn; \n\t/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));\n\t*/\n}\n\nstatic void \nnc_acosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\treturn;\n\t/*\n\t return nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));\n\t*/\n}\n\nstatic void \nnc_asin@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(x, pa);\n\tnc_sum@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/* \n\t return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));\n\t*/\n}\n\n\nstatic void \nnc_asinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_sum@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_diff@c@(r, x, r);\n\tnc_log@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/*\n\t return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));\n\t*/\n}\n\nstatic void \nnc_atan@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_i@c@, x, pa);\n\tnc_sum@c@(&nc_i@c@, x, r);\n\tnc_quot@c@(r, pa, r);\n\tnc_log@c@(r,r);\n\tnc_prod@c@(&nc_i2@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));\n\t*/\n}\n\nstatic void \nnc_atanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_1@c@, x, r);\n\tnc_sum@c@(&nc_1@c@, x, pa);\n\tnc_quot@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prod@c@(&nc_half@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));\n\t*/\n}\n\nstatic void\nnc_cos@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos@c@(xr)*cosh@c@(xi);\n\tr->imag = -sin@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void \nnc_cosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos(xi)*cosh(xr);\n\tr->imag = sin(xi)*sinh(xr);\n\treturn;\n}\n\n\n#define M_LOG10_E 0.434294481903251827651128918916605082294397\n\nstatic void \nnc_log10@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_log@c@(x, r);\n\tr->real *= M_LOG10_E;\n\tr->imag *= M_LOG10_E;\n\treturn;\n}\n\nstatic void \nnc_sin@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = sin@c@(xr)*cosh@c@(xi);\n\tr->imag = cos@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void\nnc_sinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag; \n\tr->real = cos@c@(xi)*sinh@c@(xr);\n\tr->imag = sin@c@(xi)*cosh@c@(xr);\n\treturn;\n}\n\nstatic void \nnc_tan@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ sr,cr,shi,chi;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsr = sin@c@(xr);\n\tcr = cos@c@(xr);\n\tshi = sinh(xi);\n\tchi = cosh(xi);\n\trs = sr*chi;\n\tis = cr*shi;\n\trc = cr*chi;\n\tic = -sr*shi;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\nstatic void \nnc_tanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ si,ci,shr,chr;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsi = sin@c@(xi);\n\tci = cos@c@(xi);\n\tshr = sinh@c@(xr);\n\tchr = cosh@c@(xr);\n\trs = ci*shr;\n\tis = si*chr;\n\trc = ci*chr;\n\tic = si*shr;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\n/**end repeat**/\n\n\n/**begin repeat\n\n#TYPE=(BOOL, BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE)*2#\n#OP=||, +*13, ^, -*13#\n#kind=add*14, subtract*14#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble)*2#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else\n\tah = al = bh = bl = 0;\n#endif\n\n /* 128-bit product: z*2**64 + (x+y)*2**32 + w */\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n\t/* *c = ((x + y)<<32) + w; */\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>32) || (y>>32) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 32);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>64) || (y>>64) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 64);\n#else\n\treturn 0;\n#endif\n\t\n}\n\nstatic int slonglong_overflow(longlong a0, longlong b0)\n{\n\tulonglong a, b;\n ulonglong ah, al, bh, bl, w, x, y, z;\n\n /* Convert to non-negative quantities */\n\tif (a0 < 0) { a = -a0; } else { a = a0; }\n\tif (b0 < 0) { b = -b0; } else { b = b0; }\n\n\n#if SIZEOF_LONGLONG == 64\n\tah = (a >> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else \n\tah = al = bh = bl = 0;\n#endif\n\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n /* \n\t ulonglong c = ((x + y)<<32) + w;\n\t if ((a0 < 0) ^ (b0 < 0))\n\t *c = -c;\n\t else \n\t *c = c\n\t */\n\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>31) || (y>>31) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 31);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>63) || (y>>63) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 63);\n#else\n\treturn 0;\n#endif\n}\n\n/** end direct numarray code **/\n\nstatic void\nBOOL_multiply(char **args, intp *dimensions, intp *steps, void *func) {\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nULONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tulonglong temp;\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\telse if (temp < MIN_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nLONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tlonglong temp;\n\tfor (i=0; i, >=, <, <=, ==, !=, &&, ||, &, |, ^#\n**/\nstatic void\nBOOL_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tBool in1, in2;\n\tfor(i=0; i*16, >=*16, <*16, <=*16#\n#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*4#\n#kind= greater*16, greater_equal*16, less*16, less_equal*16#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i>*10#\n#kind=remainder*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i*17, <*17#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*2#\n#kind= maximum*17, minimum*17#\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i0] = 1\n y[x==0] = 0\n return y\n\n", "source_code_before": "\nimport numeric as _nx\nfrom numeric import asarray, empty, empty_like, isinf, signbit\nimport umath\n\n__all__ = ['fix','mod','isneginf','isposinf','sign']\n\ndef fix(x, y=None):\n \"\"\" Round x to nearest integer towards zero.\n \"\"\"\n x = asarray(x) \n if y is None:\n y = _nx.floor(x)\n else:\n _nx.floor(x,y)\n y[x<0] = y[x<0]+1\n return y\n\ndef mod(x,y,z=None):\n \"\"\" x - y*floor(x/y)\n \n For numeric arrays, x % y has the same sign as x while\n mod(x,y) has the same sign as y.\n \"\"\"\n x = asarray(x)\n y = asarray(y) \n if z is None:\n z = empty_like(x)\n tmp = _nx.floor(x*1.0/y)\n return _nx.subtract(x, y*tmp, z)\n\ndef isposinf(x, y=None):\n if y is None:\n y = empty(x.shape, dtype='?')\n umath.logical_and(isinf(x), ~signbit(x), y)\n return y\n \ndef isneginf(x, y=None):\n if y is None:\n y = empty(x.shape, dtype='?')\n umath.logical_and(isinf(x), signbit(x), y)\n return y\n\ndef sign(x, y=None):\n \"\"\"sign(x) gives an array with shape of x with elexents defined by sign\n function: where x is less than 0 return -1, where x greater than 0, a=1,\n elsewhere a=0.\n \"\"\"\n x = asarray(x) \n if y is None:\n y = empty(x.shape, dtype=_nx.int_)\n y[x<0] = -1\n y[x>0] = 1\n y[x==0] = 0\n return y\n\n", "methods": [ { "name": "fix", "long_name": "fix( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 56, "parameters": [ "x", "y" ], "start_line": 8, "end_line": 17, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "isposinf", "long_name": "isposinf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 45, "parameters": [ "x", "y" ], "start_line": 19, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "isneginf", "long_name": "isneginf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 44, "parameters": [ "x", "y" ], "start_line": 25, "end_line": 29, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "sign", "long_name": "sign( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 62, "parameters": [ "x", "y" ], "start_line": 31, "end_line": 42, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "fix", "long_name": "fix( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 56, "parameters": [ "x", "y" ], "start_line": 8, "end_line": 17, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "mod", "long_name": "mod( x , y , z = None )", "filename": "ufunclike.py", "nloc": 7, "complexity": 2, "token_count": 62, "parameters": [ "x", "y", "z" ], "start_line": 19, "end_line": 30, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "isposinf", "long_name": "isposinf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 45, "parameters": [ "x", "y" ], "start_line": 32, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "isneginf", "long_name": "isneginf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 44, "parameters": [ "x", "y" ], "start_line": 38, "end_line": 42, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "sign", "long_name": "sign( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 62, "parameters": [ "x", "y" ], "start_line": 44, "end_line": 55, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "mod", "long_name": "mod( x , y , z = None )", "filename": "ufunclike.py", "nloc": 7, "complexity": 2, "token_count": 62, "parameters": [ "x", "y", "z" ], "start_line": 19, "end_line": 30, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "nloc": 30, "complexity": 8, "token_count": 240, "diff_parsed": { "added": [ "__all__ = ['fix','isneginf','isposinf','sign']" ], "deleted": [ "__all__ = ['fix','mod','isneginf','isposinf','sign']", "def mod(x,y,z=None):", " \"\"\" x - y*floor(x/y)", "", " For numeric arrays, x % y has the same sign as x while", " mod(x,y) has the same sign as y.", " \"\"\"", " x = asarray(x)", " y = asarray(y)", " if z is None:", " z = empty_like(x)", " tmp = _nx.floor(x*1.0/y)", " return _nx.subtract(x, y*tmp, z)", "" ] } } ] }, { "hash": "0048ff0be5ab79784e703361c39c3697e1b244aa", "msg": "Added mingw32ccompiler and lib2def to support building with Python 2.3 under Windows (msys/mingw32).", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-12T09:58:13+00:00", "author_timezone": 0, "committer_date": "2005-10-12T09:58:13+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "33e2d21b6e75d11572dbadb7a8a0038cd02206eb" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 11, "insertions": 341, "lines": 352, "files": 3, "dmm_unit_size": 0.15384615384615385, "dmm_unit_complexity": 0.4378698224852071, "dmm_unit_interfacing": 0.39644970414201186, "modified_files": [ { "old_path": "scipy/distutils/ccompiler.py", "new_path": "scipy/distutils/ccompiler.py", "filename": "ccompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -223,17 +223,17 @@ def CCompiler_get_version(self, force=0, ok_status=[0]):\n CCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n \n-#if 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+if 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\n", "added_lines": 11, "deleted_lines": 11, "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 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 # This method is effective only with Python >=2.3 distutils.\n # Any changes here should be applied also to fcompiler.compile\n # method to support pre Python 2.3 distutils.\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 _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 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 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 # This method is effective only with Python >=2.3 distutils.\n # Any changes here should be applied also to fcompiler.compile\n # method to support pre Python 2.3 distutils.\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 _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 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\n#if 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", "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": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "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": 114, "end_line": 135, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "_compiler_to_string", "long_name": "_compiler_to_string( compiler )", "filename": "ccompiler.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 140, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "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": 160, "end_line": 175, "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": 181, "end_line": 196, "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": 201, "end_line": 221, "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": 240, "end_line": 278, "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": 284, "end_line": 293, "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": 303, "end_line": 351, "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": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "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": 114, "end_line": 135, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "_compiler_to_string", "long_name": "_compiler_to_string( compiler )", "filename": "ccompiler.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 140, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "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": 160, "end_line": 175, "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": 181, "end_line": 196, "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": 201, "end_line": 221, "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": 240, "end_line": 278, "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": 284, "end_line": 293, "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": 303, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 293, "complexity": 80, "token_count": 2151, "diff_parsed": { "added": [ "if sys.platform == 'win32':", " compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',", " \"Mingw32 port of GNU C Compiler for Win32\"\\", " \"(for MSC built Python)\")", " if os.environ.get('OSTYPE','')=='msys' or \\", " os.environ.get('MSYSTEM','')=='MINGW32':", " # On windows platforms, we want to default to mingw32 (gcc)", " # because msvc can't build blitz stuff.", " log.info('Setting mingw32 as default compiler for nt.')", " ccompiler._default_compilers = (('nt', 'mingw32'),) \\", " + ccompiler._default_compilers" ], "deleted": [ "#if sys.platform == 'win32':", "# compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',", "# \"Mingw32 port of GNU C Compiler for Win32\"\\", "# \"(for MSC built Python)\")", "# if os.environ.get('OSTYPE','')=='msys' or \\", "# os.environ.get('MSYSTEM','')=='MINGW32':", "# # On windows platforms, we want to default to mingw32 (gcc)", "# # because msvc can't build blitz stuff.", "# log.info('Setting mingw32 as default compiler for nt.')", "# ccompiler._default_compilers = (('nt', 'mingw32'),) \\", "# + ccompiler._default_compilers" ] } }, { "old_path": null, "new_path": "scipy/distutils/lib2def.py", "filename": "lib2def.py", "extension": "py", "change_type": "ADD", "diff": "@@ -0,0 +1,116 @@\n+import re\n+import sys\n+import os\n+import string\n+\n+__doc__ = \"\"\"This module generates a DEF file from the symbols in\n+an MSVC-compiled DLL import library. It correctly discriminates between\n+data and functions. The data is collected from the output of the program\n+nm(1).\n+\n+Usage:\n+ python lib2def.py [libname.lib] [output.def]\n+or\n+ python lib2def.py [libname.lib] > output.def\n+\n+libname.lib defaults to python.lib and output.def defaults to stdout\n+\n+Author: Robert Kern \n+Last Update: April 30, 1999\n+\"\"\"\n+\n+__version__ = '0.1a'\n+\n+import sys\n+\n+py_ver = \"%d%d\" % tuple(sys.version_info[:2])\n+\n+DEFAULT_NM = 'nm -Cs'\n+\n+DEF_HEADER = \"\"\"LIBRARY\t\tpython%s.dll\n+;CODE\t\tPRELOAD MOVEABLE DISCARDABLE\n+;DATA\t\tPRELOAD SINGLE\n+\n+EXPORTS\n+\"\"\" % py_ver\n+# the header of the DEF file\n+\n+FUNC_RE = re.compile(r\"^(.*) in python%s\\.dll\" % py_ver, re.MULTILINE)\n+DATA_RE = re.compile(r\"^_imp__(.*) in python%s\\.dll\" % py_ver, re.MULTILINE)\n+\n+def parse_cmd():\n+ \"\"\"Parses the command-line arguments.\n+\n+libfile, deffile = parse_cmd()\"\"\"\n+ if len(sys.argv) == 3:\n+ if sys.argv[1][-4:] == '.lib' and sys.argv[2][-4:] == '.def':\n+ libfile, deffile = sys.argv[1:]\n+ elif sys.argv[1][-4:] == '.def' and sys.argv[2][-4:] == '.lib':\n+ deffile, libfile = sys.argv[1:]\n+ else:\n+ print \"I'm assuming that your first argument is the library\"\n+ print \"and the second is the DEF file.\"\n+ elif len(sys.argv) == 2:\n+ if sys.argv[1][-4:] == '.def':\n+ deffile = sys.argv[1]\n+ libfile = 'python%s.lib' % py_ver\n+ elif sys.argv[1][-4:] == '.lib':\n+ deffile = None\n+ libfile = sys.argv[1]\n+ else:\n+ libfile = 'python%s.lib' % py_ver\n+ deffile = None\n+ return libfile, deffile\n+\n+def getnm(nm_cmd = 'nm -Cs python%s.lib' % py_ver):\n+ \"\"\"Returns the output of nm_cmd via a pipe.\n+\n+nm_output = getnam(nm_cmd = 'nm -Cs py_lib')\"\"\"\n+ f = os.popen(nm_cmd)\n+ nm_output = f.read()\n+ f.close()\n+ return nm_output\n+\n+def parse_nm(nm_output):\n+ \"\"\"Returns a tuple of lists: dlist for the list of data\n+symbols and flist for the list of function symbols.\n+\n+dlist, flist = parse_nm(nm_output)\"\"\"\n+ data = DATA_RE.findall(nm_output)\n+ func = FUNC_RE.findall(nm_output)\n+\n+ flist = []\n+ for sym in data:\n+ if sym in func and (sym[:2] == 'Py' or sym[:3] == '_Py' or sym[:4] == 'init'):\n+ flist.append(sym)\n+\n+ dlist = []\n+ for sym in data:\n+ if sym not in flist and (sym[:2] == 'Py' or sym[:3] == '_Py'):\n+ dlist.append(sym)\n+ \n+ dlist.sort()\n+ flist.sort()\n+ return dlist, flist\n+\n+def output_def(dlist, flist, header, file = sys.stdout):\n+ \"\"\"Outputs the final DEF file to a file defaulting to stdout.\n+\n+output_def(dlist, flist, header, file = sys.stdout)\"\"\"\n+ for data_sym in dlist:\n+ header = header + '\\t%s DATA\\n' % data_sym\n+ header = header + '\\n' # blank line\n+ for func_sym in flist:\n+ header = header + '\\t%s\\n' % func_sym\n+ file.write(header)\n+\n+if __name__ == '__main__':\n+ libfile, deffile = parse_cmd()\n+ if deffile is None:\n+ deffile = sys.stdout\n+ else:\n+ deffile = open(deffile, 'w')\n+ nm_cmd = '%s %s' % (DEFAULT_NM, libfile)\n+ nm_output = getnm(nm_cmd)\n+ dlist, flist = parse_nm(nm_output)\n+ output_def(dlist, flist, DEF_HEADER, deffile)\n", "added_lines": 116, "deleted_lines": 0, "source_code": "import re\nimport sys\nimport os\nimport string\n\n__doc__ = \"\"\"This module generates a DEF file from the symbols in\nan MSVC-compiled DLL import library. It correctly discriminates between\ndata and functions. The data is collected from the output of the program\nnm(1).\n\nUsage:\n python lib2def.py [libname.lib] [output.def]\nor\n python lib2def.py [libname.lib] > output.def\n\nlibname.lib defaults to python.lib and output.def defaults to stdout\n\nAuthor: Robert Kern \nLast Update: April 30, 1999\n\"\"\"\n\n__version__ = '0.1a'\n\nimport sys\n\npy_ver = \"%d%d\" % tuple(sys.version_info[:2])\n\nDEFAULT_NM = 'nm -Cs'\n\nDEF_HEADER = \"\"\"LIBRARY\t\tpython%s.dll\n;CODE\t\tPRELOAD MOVEABLE DISCARDABLE\n;DATA\t\tPRELOAD SINGLE\n\nEXPORTS\n\"\"\" % py_ver\n# the header of the DEF file\n\nFUNC_RE = re.compile(r\"^(.*) in python%s\\.dll\" % py_ver, re.MULTILINE)\nDATA_RE = re.compile(r\"^_imp__(.*) in python%s\\.dll\" % py_ver, re.MULTILINE)\n\ndef parse_cmd():\n \"\"\"Parses the command-line arguments.\n\nlibfile, deffile = parse_cmd()\"\"\"\n if len(sys.argv) == 3:\n if sys.argv[1][-4:] == '.lib' and sys.argv[2][-4:] == '.def':\n libfile, deffile = sys.argv[1:]\n elif sys.argv[1][-4:] == '.def' and sys.argv[2][-4:] == '.lib':\n deffile, libfile = sys.argv[1:]\n else:\n print \"I'm assuming that your first argument is the library\"\n print \"and the second is the DEF file.\"\n elif len(sys.argv) == 2:\n if sys.argv[1][-4:] == '.def':\n deffile = sys.argv[1]\n libfile = 'python%s.lib' % py_ver\n elif sys.argv[1][-4:] == '.lib':\n deffile = None\n libfile = sys.argv[1]\n else:\n libfile = 'python%s.lib' % py_ver\n deffile = None\n return libfile, deffile\n\ndef getnm(nm_cmd = 'nm -Cs python%s.lib' % py_ver):\n \"\"\"Returns the output of nm_cmd via a pipe.\n\nnm_output = getnam(nm_cmd = 'nm -Cs py_lib')\"\"\"\n f = os.popen(nm_cmd)\n nm_output = f.read()\n f.close()\n return nm_output\n\ndef parse_nm(nm_output):\n \"\"\"Returns a tuple of lists: dlist for the list of data\nsymbols and flist for the list of function symbols.\n\ndlist, flist = parse_nm(nm_output)\"\"\"\n data = DATA_RE.findall(nm_output)\n func = FUNC_RE.findall(nm_output)\n\n flist = []\n for sym in data:\n if sym in func and (sym[:2] == 'Py' or sym[:3] == '_Py' or sym[:4] == 'init'):\n flist.append(sym)\n\n dlist = []\n for sym in data:\n if sym not in flist and (sym[:2] == 'Py' or sym[:3] == '_Py'):\n dlist.append(sym)\n \n dlist.sort()\n flist.sort()\n return dlist, flist\n\ndef output_def(dlist, flist, header, file = sys.stdout):\n \"\"\"Outputs the final DEF file to a file defaulting to stdout.\n\noutput_def(dlist, flist, header, file = sys.stdout)\"\"\"\n for data_sym in dlist:\n header = header + '\\t%s DATA\\n' % data_sym\n header = header + '\\n' # blank line\n for func_sym in flist:\n header = header + '\\t%s\\n' % func_sym\n file.write(header)\n\nif __name__ == '__main__':\n libfile, deffile = parse_cmd()\n if deffile is None:\n deffile = sys.stdout\n else:\n deffile = open(deffile, 'w')\n nm_cmd = '%s %s' % (DEFAULT_NM, libfile)\n nm_output = getnm(nm_cmd)\n dlist, flist = parse_nm(nm_output)\n output_def(dlist, flist, DEF_HEADER, deffile)\n", "source_code_before": null, "methods": [ { "name": "parse_cmd", "long_name": "parse_cmd( )", "filename": "lib2def.py", "nloc": 20, "complexity": 9, "token_count": 179, "parameters": [], "start_line": 41, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "getnm", "long_name": "getnm( nm_cmd = 'nm -Cs python%s.lib' % py_ver )", "filename": "lib2def.py", "nloc": 5, "complexity": 1, "token_count": 32, "parameters": [ "nm_cmd" ], "start_line": 65, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "parse_nm", "long_name": "parse_nm( nm_output )", "filename": "lib2def.py", "nloc": 14, "complexity": 10, "token_count": 121, "parameters": [ "nm_output" ], "start_line": 74, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "output_def", "long_name": "output_def( dlist , flist , header , file = sys . stdout )", "filename": "lib2def.py", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "dlist", "flist", "header", "file" ], "start_line": 96, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 } ], "methods_before": [], "changed_methods": [ { "name": "parse_nm", "long_name": "parse_nm( nm_output )", "filename": "lib2def.py", "nloc": 14, "complexity": 10, "token_count": 121, "parameters": [ "nm_output" ], "start_line": 74, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "parse_cmd", "long_name": "parse_cmd( )", "filename": "lib2def.py", "nloc": 20, "complexity": 9, "token_count": 179, "parameters": [], "start_line": 41, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "getnm", "long_name": "getnm( nm_cmd = 'nm -Cs python%s.lib' % py_ver )", "filename": "lib2def.py", "nloc": 5, "complexity": 1, "token_count": 32, "parameters": [ "nm_cmd" ], "start_line": 65, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "output_def", "long_name": "output_def( dlist , flist , header , file = sys . stdout )", "filename": "lib2def.py", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "dlist", "flist", "header", "file" ], "start_line": 96, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 } ], "nloc": 87, "complexity": 23, "token_count": 520, "diff_parsed": { "added": [ "import re", "import sys", "import os", "import string", "", "__doc__ = \"\"\"This module generates a DEF file from the symbols in", "an MSVC-compiled DLL import library. It correctly discriminates between", "data and functions. The data is collected from the output of the program", "nm(1).", "", "Usage:", " python lib2def.py [libname.lib] [output.def]", "or", " python lib2def.py [libname.lib] > output.def", "", "libname.lib defaults to python.lib and output.def defaults to stdout", "", "Author: Robert Kern ", "Last Update: April 30, 1999", "\"\"\"", "", "__version__ = '0.1a'", "", "import sys", "", "py_ver = \"%d%d\" % tuple(sys.version_info[:2])", "", "DEFAULT_NM = 'nm -Cs'", "", "DEF_HEADER = \"\"\"LIBRARY\t\tpython%s.dll", ";CODE\t\tPRELOAD MOVEABLE DISCARDABLE", ";DATA\t\tPRELOAD SINGLE", "", "EXPORTS", "\"\"\" % py_ver", "# the header of the DEF file", "", "FUNC_RE = re.compile(r\"^(.*) in python%s\\.dll\" % py_ver, re.MULTILINE)", "DATA_RE = re.compile(r\"^_imp__(.*) in python%s\\.dll\" % py_ver, re.MULTILINE)", "", "def parse_cmd():", " \"\"\"Parses the command-line arguments.", "", "libfile, deffile = parse_cmd()\"\"\"", " if len(sys.argv) == 3:", " if sys.argv[1][-4:] == '.lib' and sys.argv[2][-4:] == '.def':", " libfile, deffile = sys.argv[1:]", " elif sys.argv[1][-4:] == '.def' and sys.argv[2][-4:] == '.lib':", " deffile, libfile = sys.argv[1:]", " else:", " print \"I'm assuming that your first argument is the library\"", " print \"and the second is the DEF file.\"", " elif len(sys.argv) == 2:", " if sys.argv[1][-4:] == '.def':", " deffile = sys.argv[1]", " libfile = 'python%s.lib' % py_ver", " elif sys.argv[1][-4:] == '.lib':", " deffile = None", " libfile = sys.argv[1]", " else:", " libfile = 'python%s.lib' % py_ver", " deffile = None", " return libfile, deffile", "", "def getnm(nm_cmd = 'nm -Cs python%s.lib' % py_ver):", " \"\"\"Returns the output of nm_cmd via a pipe.", "", "nm_output = getnam(nm_cmd = 'nm -Cs py_lib')\"\"\"", " f = os.popen(nm_cmd)", " nm_output = f.read()", " f.close()", " return nm_output", "", "def parse_nm(nm_output):", " \"\"\"Returns a tuple of lists: dlist for the list of data", "symbols and flist for the list of function symbols.", "", "dlist, flist = parse_nm(nm_output)\"\"\"", " data = DATA_RE.findall(nm_output)", " func = FUNC_RE.findall(nm_output)", "", " flist = []", " for sym in data:", " if sym in func and (sym[:2] == 'Py' or sym[:3] == '_Py' or sym[:4] == 'init'):", " flist.append(sym)", "", " dlist = []", " for sym in data:", " if sym not in flist and (sym[:2] == 'Py' or sym[:3] == '_Py'):", " dlist.append(sym)", "", " dlist.sort()", " flist.sort()", " return dlist, flist", "", "def output_def(dlist, flist, header, file = sys.stdout):", " \"\"\"Outputs the final DEF file to a file defaulting to stdout.", "", "output_def(dlist, flist, header, file = sys.stdout)\"\"\"", " for data_sym in dlist:", " header = header + '\\t%s DATA\\n' % data_sym", " header = header + '\\n' # blank line", " for func_sym in flist:", " header = header + '\\t%s\\n' % func_sym", " file.write(header)", "", "if __name__ == '__main__':", " libfile, deffile = parse_cmd()", " if deffile is None:", " deffile = sys.stdout", " else:", " deffile = open(deffile, 'w')", " nm_cmd = '%s %s' % (DEFAULT_NM, libfile)", " nm_output = getnm(nm_cmd)", " dlist, flist = parse_nm(nm_output)", " output_def(dlist, flist, DEF_HEADER, deffile)" ], "deleted": [] } }, { "old_path": null, "new_path": "scipy/distutils/mingw32ccompiler.py", "filename": "mingw32ccompiler.py", "extension": "py", "change_type": "ADD", "diff": "@@ -0,0 +1,214 @@\n+\"\"\"\n+Support code for building Python extensions on Windows.\n+\n+ # NT stuff\n+ # 1. Make sure libpython.a exists for gcc. If not, build it.\n+ # 2. Force windows to use gcc (we're struggling with MSVC and g77 support) \n+ # 3. Force windows to use g77\n+\n+\"\"\"\n+\n+import os\n+import sys\n+import log\n+\n+# Overwrite certain distutils.ccompiler functions:\n+import scipy.distutils.ccompiler\n+\n+# NT stuff\n+# 1. Make sure libpython.a exists for gcc. If not, build it.\n+# 2. Force windows to use gcc (we're struggling with MSVC and g77 support) \n+# --> this is done in scipy/distutils/ccompiler.py\n+# 3. Force windows to use g77\n+\n+import distutils.cygwinccompiler\n+from distutils.version import StrictVersion\n+from scipy.distutils.ccompiler import gen_preprocess_options, gen_lib_options\n+from distutils.errors import DistutilsExecError, CompileError, UnknownFileError\n+\n+from distutils.unixccompiler import UnixCCompiler \n+ \n+# the same as cygwin plus some additional parameters\n+class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):\n+ \"\"\" A modified MingW32 compiler compatible with an MSVC built Python.\n+ \n+ \"\"\"\n+ \n+ compiler_type = 'mingw32'\n+ \n+ def __init__ (self,\n+ verbose=0,\n+ dry_run=0,\n+ force=0):\n+ \n+ distutils.cygwinccompiler.CygwinCCompiler.__init__ (self, \n+ verbose,dry_run, force)\n+ \n+ # we need to support 3.2 which doesn't match the standard\n+ # get_versions methods regex\n+ if self.gcc_version is None:\n+ import re\n+ out = os.popen('gcc -dumpversion','r')\n+ out_string = out.read()\n+ out.close()\n+ result = re.search('(\\d+\\.\\d+)',out_string)\n+ if result:\n+ self.gcc_version = StrictVersion(result.group(1)) \n+\n+ # A real mingw32 doesn't need to specify a different entry point,\n+ # but cygwin 2.91.57 in no-cygwin-mode needs it.\n+ if self.gcc_version <= \"2.91.57\":\n+ entry_point = '--entry _DllMain@12'\n+ else:\n+ entry_point = ''\n+\n+ if self.linker_dll == 'dllwrap':\n+ self.linker = 'dllwrap --driver-name g++'\n+ elif self.linker_dll == 'gcc':\n+ self.linker = 'g++' \n+\n+ # **changes: eric jones 4/11/01\n+ # 1. Check for import library on Windows. Build if it doesn't exist.\n+\n+ build_import_library()\n+\n+ # **changes: eric jones 4/11/01\n+ # 2. increased optimization and turned off all warnings\n+ # 3. also added --driver-name g++\n+ #self.set_executables(compiler='gcc -mno-cygwin -O2 -w',\n+ # compiler_so='gcc -mno-cygwin -mdll -O2 -w',\n+ # linker_exe='gcc -mno-cygwin',\n+ # linker_so='%s --driver-name g++ -mno-cygwin -mdll -static %s' \n+ # % (self.linker, entry_point))\n+ if self.gcc_version <= \"3.0.0\":\n+ self.set_executables(compiler='gcc -mno-cygwin -O2 -w',\n+ compiler_so='gcc -mno-cygwin -mdll -O2 -w -Wstrict-prototypes',\n+ linker_exe='g++ -mno-cygwin',\n+ linker_so='%s -mno-cygwin -mdll -static %s' \n+ % (self.linker, entry_point))\n+ else: \n+ self.set_executables(compiler='gcc -mno-cygwin -O2 -Wall',\n+ compiler_so='gcc -O2 -Wall -Wstrict-prototypes',\n+ linker_exe='g++ ',\n+ linker_so='g++ -shared')\n+ # added for python2.3 support\n+ # we can't pass it through set_executables because pre 2.2 would fail\n+ self.compiler_cxx = ['g++']\n+ \n+ # Maybe we should also append -mthreads, but then the finished\n+ # dlls need another dll (mingwm10.dll see Mingw32 docs)\n+ # (-mthreads: Support thread-safe exception handling on `Mingw32') \n+ \n+ # no additional libraries needed \n+ self.dll_libraries=[]\n+ return\n+\n+ # __init__ ()\n+\n+ def link(self,\n+ target_desc,\n+ objects,\n+ output_filename,\n+ output_dir,\n+ libraries,\n+ library_dirs,\n+ runtime_library_dirs,\n+ export_symbols = None,\n+ debug=0,\n+ extra_preargs=None,\n+ extra_postargs=None,\n+ build_temp=None,\n+ target_lang=None):\n+ args = (self,\n+ target_desc,\n+ objects,\n+ output_filename,\n+ output_dir,\n+ libraries,\n+ library_dirs,\n+ runtime_library_dirs,\n+ None, #export_symbols, we do this in our def-file\n+ debug,\n+ extra_preargs,\n+ extra_postargs,\n+ build_temp,\n+ target_lang)\n+ if self.gcc_version < \"3.0.0\":\n+ func = distutils.cygwinccompiler.CygwinCCompiler.link\n+ else:\n+ func = UnixCCompiler.link\n+ func(*args[:func.im_func.func_code.co_argcount])\n+ return\n+\n+ def object_filenames (self,\n+ source_filenames,\n+ strip_dir=0,\n+ output_dir=''):\n+ if output_dir is None: output_dir = ''\n+ obj_names = []\n+ for src_name in source_filenames:\n+ # use normcase to make sure '.rc' is really '.rc' and not '.RC'\n+ (base, ext) = os.path.splitext (os.path.normcase(src_name))\n+ \n+ # added these lines to strip off windows drive letters\n+ # without it, .o files are placed next to .c files\n+ # instead of the build directory\n+ drv,base = os.path.splitdrive(base)\n+ if drv:\n+ base = base[1:]\n+ \n+ if ext not in (self.src_extensions + ['.rc','.res']):\n+ raise UnknownFileError, \\\n+ \"unknown file type '%s' (from '%s')\" % \\\n+ (ext, src_name)\n+ if strip_dir:\n+ base = os.path.basename (base)\n+ if ext == '.res' or ext == '.rc':\n+ # these need to be compiled to object files\n+ obj_names.append (os.path.join (output_dir,\n+ base + ext + self.obj_extension))\n+ else:\n+ obj_names.append (os.path.join (output_dir,\n+ base + self.obj_extension))\n+ return obj_names\n+ \n+ # object_filenames ()\n+\n+ \n+def build_import_library():\n+ \"\"\" Build the import libraries for Mingw32-gcc on Windows\n+ \"\"\"\n+ if os.name != 'nt':\n+ return\n+ lib_name = \"python%d%d.lib\" % tuple(sys.version_info[:2]) \n+ lib_file = os.path.join(sys.prefix,'libs',lib_name)\n+ out_name = \"libpython%d%d.a\" % tuple(sys.version_info[:2])\n+ out_file = os.path.join(sys.prefix,'libs',out_name)\n+ if not os.path.isfile(lib_file):\n+ log.warn('Cannot build import library: \"%s\" not found' % (lib_file))\n+ return\n+ if os.path.isfile(out_file):\n+ log.debug('Skip building import library: \"%s\" exists' % (out_file))\n+ return\n+ log.info('Building import library: \"%s\"' % (out_file))\n+\n+ from scipy.distutils import lib2def\n+\n+ def_name = \"python%d%d.def\" % tuple(sys.version_info[:2]) \n+ def_file = os.path.join(sys.prefix,'libs',def_name)\n+ nm_cmd = '%s %s' % (lib2def.DEFAULT_NM, lib_file)\n+ nm_output = lib2def.getnm(nm_cmd)\n+ dlist, flist = lib2def.parse_nm(nm_output)\n+ lib2def.output_def(dlist, flist, lib2def.DEF_HEADER, open(def_file, 'w'))\n+ \n+ dll_name = \"python%d%d.dll\" % tuple(sys.version_info[:2])\n+ args = (dll_name,def_file,out_file)\n+ cmd = 'dlltool --dllname %s --def %s --output-lib %s' % args\n+ status = os.system(cmd)\n+ # for now, fail silently\n+ if status:\n+ log.warn('Failed to build import library for gcc. Linking will fail.')\n+ #if not success:\n+ # msg = \"Couldn't find import library, and failed to build it.\"\n+ # raise DistutilsPlatformError, msg\n+ return\n", "added_lines": 214, "deleted_lines": 0, "source_code": "\"\"\"\nSupport code for building Python extensions on Windows.\n\n # NT stuff\n # 1. Make sure libpython.a exists for gcc. If not, build it.\n # 2. Force windows to use gcc (we're struggling with MSVC and g77 support) \n # 3. Force windows to use g77\n\n\"\"\"\n\nimport os\nimport sys\nimport log\n\n# Overwrite certain distutils.ccompiler functions:\nimport scipy.distutils.ccompiler\n\n# NT stuff\n# 1. Make sure libpython.a exists for gcc. If not, build it.\n# 2. Force windows to use gcc (we're struggling with MSVC and g77 support) \n# --> this is done in scipy/distutils/ccompiler.py\n# 3. Force windows to use g77\n\nimport distutils.cygwinccompiler\nfrom distutils.version import StrictVersion\nfrom scipy.distutils.ccompiler import gen_preprocess_options, gen_lib_options\nfrom distutils.errors import DistutilsExecError, CompileError, UnknownFileError\n\nfrom distutils.unixccompiler import UnixCCompiler \n \n# the same as cygwin plus some additional parameters\nclass Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):\n \"\"\" A modified MingW32 compiler compatible with an MSVC built Python.\n \n \"\"\"\n \n compiler_type = 'mingw32'\n \n def __init__ (self,\n verbose=0,\n dry_run=0,\n force=0):\n \n distutils.cygwinccompiler.CygwinCCompiler.__init__ (self, \n verbose,dry_run, force)\n \n # we need to support 3.2 which doesn't match the standard\n # get_versions methods regex\n if self.gcc_version is None:\n import re\n out = os.popen('gcc -dumpversion','r')\n out_string = out.read()\n out.close()\n result = re.search('(\\d+\\.\\d+)',out_string)\n if result:\n self.gcc_version = StrictVersion(result.group(1)) \n\n # A real mingw32 doesn't need to specify a different entry point,\n # but cygwin 2.91.57 in no-cygwin-mode needs it.\n if self.gcc_version <= \"2.91.57\":\n entry_point = '--entry _DllMain@12'\n else:\n entry_point = ''\n\n if self.linker_dll == 'dllwrap':\n self.linker = 'dllwrap --driver-name g++'\n elif self.linker_dll == 'gcc':\n self.linker = 'g++' \n\n # **changes: eric jones 4/11/01\n # 1. Check for import library on Windows. Build if it doesn't exist.\n\n build_import_library()\n\n # **changes: eric jones 4/11/01\n # 2. increased optimization and turned off all warnings\n # 3. also added --driver-name g++\n #self.set_executables(compiler='gcc -mno-cygwin -O2 -w',\n # compiler_so='gcc -mno-cygwin -mdll -O2 -w',\n # linker_exe='gcc -mno-cygwin',\n # linker_so='%s --driver-name g++ -mno-cygwin -mdll -static %s' \n # % (self.linker, entry_point))\n if self.gcc_version <= \"3.0.0\":\n self.set_executables(compiler='gcc -mno-cygwin -O2 -w',\n compiler_so='gcc -mno-cygwin -mdll -O2 -w -Wstrict-prototypes',\n linker_exe='g++ -mno-cygwin',\n linker_so='%s -mno-cygwin -mdll -static %s' \n % (self.linker, entry_point))\n else: \n self.set_executables(compiler='gcc -mno-cygwin -O2 -Wall',\n compiler_so='gcc -O2 -Wall -Wstrict-prototypes',\n linker_exe='g++ ',\n linker_so='g++ -shared')\n # added for python2.3 support\n # we can't pass it through set_executables because pre 2.2 would fail\n self.compiler_cxx = ['g++']\n \n # Maybe we should also append -mthreads, but then the finished\n # dlls need another dll (mingwm10.dll see Mingw32 docs)\n # (-mthreads: Support thread-safe exception handling on `Mingw32') \n \n # no additional libraries needed \n self.dll_libraries=[]\n return\n\n # __init__ ()\n\n def link(self,\n target_desc,\n objects,\n output_filename,\n output_dir,\n libraries,\n library_dirs,\n runtime_library_dirs,\n export_symbols = None,\n debug=0,\n extra_preargs=None,\n extra_postargs=None,\n build_temp=None,\n target_lang=None):\n args = (self,\n target_desc,\n objects,\n output_filename,\n output_dir,\n libraries,\n library_dirs,\n runtime_library_dirs,\n None, #export_symbols, we do this in our def-file\n debug,\n extra_preargs,\n extra_postargs,\n build_temp,\n target_lang)\n if self.gcc_version < \"3.0.0\":\n func = distutils.cygwinccompiler.CygwinCCompiler.link\n else:\n func = UnixCCompiler.link\n func(*args[:func.im_func.func_code.co_argcount])\n return\n\n def object_filenames (self,\n source_filenames,\n strip_dir=0,\n output_dir=''):\n if output_dir is None: output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n # use normcase to make sure '.rc' is really '.rc' and not '.RC'\n (base, ext) = os.path.splitext (os.path.normcase(src_name))\n \n # added these lines to strip off windows drive letters\n # without it, .o files are placed next to .c files\n # instead of the build directory\n drv,base = os.path.splitdrive(base)\n if drv:\n base = base[1:]\n \n if ext not in (self.src_extensions + ['.rc','.res']):\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % \\\n (ext, src_name)\n if strip_dir:\n base = os.path.basename (base)\n if ext == '.res' or ext == '.rc':\n # these need to be compiled to object files\n obj_names.append (os.path.join (output_dir,\n base + ext + self.obj_extension))\n else:\n obj_names.append (os.path.join (output_dir,\n base + self.obj_extension))\n return obj_names\n \n # object_filenames ()\n\n \ndef build_import_library():\n \"\"\" Build the import libraries for Mingw32-gcc on Windows\n \"\"\"\n if os.name != 'nt':\n return\n lib_name = \"python%d%d.lib\" % tuple(sys.version_info[:2]) \n lib_file = os.path.join(sys.prefix,'libs',lib_name)\n out_name = \"libpython%d%d.a\" % tuple(sys.version_info[:2])\n out_file = os.path.join(sys.prefix,'libs',out_name)\n if not os.path.isfile(lib_file):\n log.warn('Cannot build import library: \"%s\" not found' % (lib_file))\n return\n if os.path.isfile(out_file):\n log.debug('Skip building import library: \"%s\" exists' % (out_file))\n return\n log.info('Building import library: \"%s\"' % (out_file))\n\n from scipy.distutils import lib2def\n\n def_name = \"python%d%d.def\" % tuple(sys.version_info[:2]) \n def_file = os.path.join(sys.prefix,'libs',def_name)\n nm_cmd = '%s %s' % (lib2def.DEFAULT_NM, lib_file)\n nm_output = lib2def.getnm(nm_cmd)\n dlist, flist = lib2def.parse_nm(nm_output)\n lib2def.output_def(dlist, flist, lib2def.DEF_HEADER, open(def_file, 'w'))\n \n dll_name = \"python%d%d.dll\" % tuple(sys.version_info[:2])\n args = (dll_name,def_file,out_file)\n cmd = 'dlltool --dllname %s --def %s --output-lib %s' % args\n status = os.system(cmd)\n # for now, fail silently\n if status:\n log.warn('Failed to build import library for gcc. Linking will fail.')\n #if not success:\n # msg = \"Couldn't find import library, and failed to build it.\"\n # raise DistutilsPlatformError, msg\n return\n", "source_code_before": null, "methods": [ { "name": "__init__", "long_name": "__init__( self , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "mingw32ccompiler.py", "nloc": 37, "complexity": 7, "token_count": 203, "parameters": [ "self", "verbose", "dry_run", "force" ], "start_line": 39, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 66, "top_nesting_level": 1 }, { "name": "link", "long_name": "link( self , target_desc , objects , output_filename , output_dir , libraries , library_dirs , runtime_library_dirs , export_symbols = None , debug = 0 , extra_preargs = None , extra_postargs = None , build_temp = None , target_lang = None )", "filename": "mingw32ccompiler.py", "nloc": 34, "complexity": 2, "token_count": 113, "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": 108, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "object_filenames", "long_name": "object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "mingw32ccompiler.py", "nloc": 24, "complexity": 8, "token_count": 169, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 143, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "build_import_library", "long_name": "build_import_library( )", "filename": "mingw32ccompiler.py", "nloc": 28, "complexity": 5, "token_count": 256, "parameters": [], "start_line": 178, "end_line": 214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 } ], "methods_before": [], "changed_methods": [ { "name": "__init__", "long_name": "__init__( self , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "mingw32ccompiler.py", "nloc": 37, "complexity": 7, "token_count": 203, "parameters": [ "self", "verbose", "dry_run", "force" ], "start_line": 39, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 66, "top_nesting_level": 1 }, { "name": "link", "long_name": "link( self , target_desc , objects , output_filename , output_dir , libraries , library_dirs , runtime_library_dirs , export_symbols = None , debug = 0 , extra_preargs = None , extra_postargs = None , build_temp = None , target_lang = None )", "filename": "mingw32ccompiler.py", "nloc": 34, "complexity": 2, "token_count": 113, "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": 108, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "object_filenames", "long_name": "object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "mingw32ccompiler.py", "nloc": 24, "complexity": 8, "token_count": 169, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 143, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "build_import_library", "long_name": "build_import_library( )", "filename": "mingw32ccompiler.py", "nloc": 28, "complexity": 5, "token_count": 256, "parameters": [], "start_line": 178, "end_line": 214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 } ], "nloc": 146, "complexity": 22, "token_count": 808, "diff_parsed": { "added": [ "\"\"\"", "Support code for building Python extensions on Windows.", "", " # NT stuff", " # 1. Make sure libpython.a exists for gcc. If not, build it.", " # 2. Force windows to use gcc (we're struggling with MSVC and g77 support)", " # 3. Force windows to use g77", "", "\"\"\"", "", "import os", "import sys", "import log", "", "# Overwrite certain distutils.ccompiler functions:", "import scipy.distutils.ccompiler", "", "# NT stuff", "# 1. Make sure libpython.a exists for gcc. If not, build it.", "# 2. Force windows to use gcc (we're struggling with MSVC and g77 support)", "# --> this is done in scipy/distutils/ccompiler.py", "# 3. Force windows to use g77", "", "import distutils.cygwinccompiler", "from distutils.version import StrictVersion", "from scipy.distutils.ccompiler import gen_preprocess_options, gen_lib_options", "from distutils.errors import DistutilsExecError, CompileError, UnknownFileError", "", "from distutils.unixccompiler import UnixCCompiler", "", "# the same as cygwin plus some additional parameters", "class Mingw32CCompiler(distutils.cygwinccompiler.CygwinCCompiler):", " \"\"\" A modified MingW32 compiler compatible with an MSVC built Python.", "", " \"\"\"", "", " compiler_type = 'mingw32'", "", " def __init__ (self,", " verbose=0,", " dry_run=0,", " force=0):", "", " distutils.cygwinccompiler.CygwinCCompiler.__init__ (self,", " verbose,dry_run, force)", "", " # we need to support 3.2 which doesn't match the standard", " # get_versions methods regex", " if self.gcc_version is None:", " import re", " out = os.popen('gcc -dumpversion','r')", " out_string = out.read()", " out.close()", " result = re.search('(\\d+\\.\\d+)',out_string)", " if result:", " self.gcc_version = StrictVersion(result.group(1))", "", " # A real mingw32 doesn't need to specify a different entry point,", " # but cygwin 2.91.57 in no-cygwin-mode needs it.", " if self.gcc_version <= \"2.91.57\":", " entry_point = '--entry _DllMain@12'", " else:", " entry_point = ''", "", " if self.linker_dll == 'dllwrap':", " self.linker = 'dllwrap --driver-name g++'", " elif self.linker_dll == 'gcc':", " self.linker = 'g++'", "", " # **changes: eric jones 4/11/01", " # 1. Check for import library on Windows. Build if it doesn't exist.", "", " build_import_library()", "", " # **changes: eric jones 4/11/01", " # 2. increased optimization and turned off all warnings", " # 3. also added --driver-name g++", " #self.set_executables(compiler='gcc -mno-cygwin -O2 -w',", " # compiler_so='gcc -mno-cygwin -mdll -O2 -w',", " # linker_exe='gcc -mno-cygwin',", " # linker_so='%s --driver-name g++ -mno-cygwin -mdll -static %s'", " # % (self.linker, entry_point))", " if self.gcc_version <= \"3.0.0\":", " self.set_executables(compiler='gcc -mno-cygwin -O2 -w',", " compiler_so='gcc -mno-cygwin -mdll -O2 -w -Wstrict-prototypes',", " linker_exe='g++ -mno-cygwin',", " linker_so='%s -mno-cygwin -mdll -static %s'", " % (self.linker, entry_point))", " else:", " self.set_executables(compiler='gcc -mno-cygwin -O2 -Wall',", " compiler_so='gcc -O2 -Wall -Wstrict-prototypes',", " linker_exe='g++ ',", " linker_so='g++ -shared')", " # added for python2.3 support", " # we can't pass it through set_executables because pre 2.2 would fail", " self.compiler_cxx = ['g++']", "", " # Maybe we should also append -mthreads, but then the finished", " # dlls need another dll (mingwm10.dll see Mingw32 docs)", " # (-mthreads: Support thread-safe exception handling on `Mingw32')", "", " # no additional libraries needed", " self.dll_libraries=[]", " return", "", " # __init__ ()", "", " def link(self,", " target_desc,", " objects,", " output_filename,", " output_dir,", " libraries,", " library_dirs,", " runtime_library_dirs,", " export_symbols = None,", " debug=0,", " extra_preargs=None,", " extra_postargs=None,", " build_temp=None,", " target_lang=None):", " args = (self,", " target_desc,", " objects,", " output_filename,", " output_dir,", " libraries,", " library_dirs,", " runtime_library_dirs,", " None, #export_symbols, we do this in our def-file", " debug,", " extra_preargs,", " extra_postargs,", " build_temp,", " target_lang)", " if self.gcc_version < \"3.0.0\":", " func = distutils.cygwinccompiler.CygwinCCompiler.link", " else:", " func = UnixCCompiler.link", " func(*args[:func.im_func.func_code.co_argcount])", " return", "", " def object_filenames (self,", " source_filenames,", " strip_dir=0,", " output_dir=''):", " if output_dir is None: output_dir = ''", " obj_names = []", " for src_name in source_filenames:", " # use normcase to make sure '.rc' is really '.rc' and not '.RC'", " (base, ext) = os.path.splitext (os.path.normcase(src_name))", "", " # added these lines to strip off windows drive letters", " # without it, .o files are placed next to .c files", " # instead of the build directory", " drv,base = os.path.splitdrive(base)", " if drv:", " base = base[1:]", "", " if ext not in (self.src_extensions + ['.rc','.res']):", " raise UnknownFileError, \\", " \"unknown file type '%s' (from '%s')\" % \\", " (ext, src_name)", " if strip_dir:", " base = os.path.basename (base)", " if ext == '.res' or ext == '.rc':", " # these need to be compiled to object files", " obj_names.append (os.path.join (output_dir,", " base + ext + self.obj_extension))", " else:", " obj_names.append (os.path.join (output_dir,", " base + self.obj_extension))", " return obj_names", "", " # object_filenames ()", "", "", "def build_import_library():", " \"\"\" Build the import libraries for Mingw32-gcc on Windows", " \"\"\"", " if os.name != 'nt':", " return", " lib_name = \"python%d%d.lib\" % tuple(sys.version_info[:2])", " lib_file = os.path.join(sys.prefix,'libs',lib_name)", " out_name = \"libpython%d%d.a\" % tuple(sys.version_info[:2])", " out_file = os.path.join(sys.prefix,'libs',out_name)", " if not os.path.isfile(lib_file):", " log.warn('Cannot build import library: \"%s\" not found' % (lib_file))", " return", " if os.path.isfile(out_file):", " log.debug('Skip building import library: \"%s\" exists' % (out_file))", " return", " log.info('Building import library: \"%s\"' % (out_file))", "", " from scipy.distutils import lib2def", "", " def_name = \"python%d%d.def\" % tuple(sys.version_info[:2])", " def_file = os.path.join(sys.prefix,'libs',def_name)", " nm_cmd = '%s %s' % (lib2def.DEFAULT_NM, lib_file)", " nm_output = lib2def.getnm(nm_cmd)", " dlist, flist = lib2def.parse_nm(nm_output)", " lib2def.output_def(dlist, flist, lib2def.DEF_HEADER, open(def_file, 'w'))", "", " dll_name = \"python%d%d.dll\" % tuple(sys.version_info[:2])", " args = (dll_name,def_file,out_file)", " cmd = 'dlltool --dllname %s --def %s --output-lib %s' % args", " status = os.system(cmd)", " # for now, fail silently", " if status:", " log.warn('Failed to build import library for gcc. Linking will fail.')", " #if not success:", " # msg = \"Couldn't find import library, and failed to build it.\"", " # raise DistutilsPlatformError, msg", " return" ], "deleted": [] } } ] }, { "hash": "f3e745b362b58c764bdc8de635d76acd3b5f09c8", "msg": "change floor precision of small-bit integers", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T10:09:27+00:00", "author_timezone": 0, "committer_date": "2005-10-12T10:09:27+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "0048ff0be5ab79784e703361c39c3697e1b244aa" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 2, "insertions": 4, "lines": 6, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/src/umathmodule.c.src", "new_path": "scipy/base/src/umathmodule.c.src", "filename": "umathmodule.c.src", "extension": "src", "change_type": "MODIFY", "diff": "@@ -1268,6 +1268,8 @@ static void\n /**begin repeat\n #TYPE=BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG#\n #typ=byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong#\n+#ftyp=float*4,double*4,longdouble*2#\n+#c=f*4,,,,,l*2#\n */\n static void\n @TYPE@_remainder(char **args, intp *dimensions, intp *steps, void *func) \n@@ -1275,11 +1277,11 @@ static void\n \tregister intp i;\n \tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n \tchar *i1=args[0], *i2=args[1], *op=args[2];\n-\tdouble x, y, res;\n+\t@ftyp@ x, y, res;\n \tfor(i=0; i\n\n\n/* A whole slew of basic math functions are provided originally 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#ifndef M_PI\n#define M_PI 3.14159265358979323846264338328\n#endif\n\n#ifndef HAVE_INVERSE_HYPERBOLIC\nstatic double acosh(double x)\n{\n\treturn log(x + sqrt((x-1.0)*(x+1.0)));\n}\n\nstatic double asinh(double xx)\n{\n\tdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*log(x + sqrt(x*x+1.0));\n}\n\nstatic double atanh(double x)\n{\n\treturn 0.5*log((1.0+x)/(1.0-x));\n}\n#endif\n\n#ifdef HAVE_HYPOT\n#if !defined(NeXT) && !defined(_MSC_VER)\nextern double hypot(double, double);\n#endif\n#else\ndouble hypot(double x, double y)\n{\n\tdouble yx;\n\n\tx = fabs(x);\n\ty = fabs(y);\n\tif (x < y) {\n\t\tdouble temp = x;\n\t\tx = y;\n\t\ty = temp;\n\t}\n\tif (x == 0.)\n\t\treturn 0.;\n\telse {\n\t\tyx = y/x;\n\t\treturn x*sqrt(1.+yx*yx);\n\t}\n}\n#endif\n\n\n\n/* Define isnan, isinf, isfinite, signbit if needed */\n/* Use fpclassify if possible */\n/* isnan, isinf --\n these will use macros and then fpclassify if available before\n defaulting to a dumb convert-to-double version...\n\n isfinite -- define a macro if not already available\n signbit -- if macro available use it, otherwise define a function\n and a dumb convert-to-double version for other types.\n*/\n\n#if defined(fpclassify)\n\n#if !defined(isnan)\n#define isnan(x) (fpclassify(x) == FP_NAN)\n#endif\n#if !defined(isinf)\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n#endif\n\n#else /* check to see if already have a function like this */\n\n#if !defined(HAVE_ISNAN)\n\n#if !defined(isnan)\n#include \"_isnan.c\"\n#endif\n\n#if !defined(isinf)\n#define isinf(x) (!isnan((x)) && isnan((x)-(x)))\n#endif\n\n#endif /* HAVE_ISNAN */\n#endif /* !defined(isnan) */\n\n\n/* Define signbit if needed */\n#if !defined(signbit)\n#include \"_signbit.c\"\n#endif\n\n\n/* Now defined the extended type macros */\n\n/* We assume that isnan and isinf are defined in the same \n way: as functions, with extended functions, or macros\n*/\n\n#if !defined(isnan)\n\n#if !defined(HAVE_LONGDOUBLE_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanl(x) isnan((double)(x))\n#define isinfl(x) (!isnanl((x)) && isnanl((x)-(x)))\n#endif\n\n#if !defined(HAVE_FLOAT_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanf(x) isnan((double)(x))\n#define isinff(x) (!isnanf((x)) && isnanf((x)-(x)))\n#endif\n\n#else /* !defined(isnan) */\n\n#define isnanl(x) isnan((x))\n#define isnanf(x) isnan((x))\n#define isinfl(x) isinf((x))\n#define isinff(x) isinf((x))\n\n#endif /* !defined(isnan) */\n\n\n\n#if !defined(signbit)\n#define signbitl(x) ((longdouble) signbit((double)(x)))\n#define signbitf(x) ((float) signbit((double) (x)))\n#else\n#define signbitl(x) signbit((x))\n#define signbitf(x) signbit((x))\n#endif\n\n#if !defined(isfinite)\n#define isfinite(x) (!(isinf((x)) || isnan((x))))\n#endif\n#define isfinitef(x) (!(isinff((x)) || isnanf((x))))\n#define isfinitel(x) (!(isinfl((x)) || isnanl((x))))\n\n\n/* First, the C functions that do the real work */\n\n/* if C99 extensions not availble\n\nthen define dummy functions that use the double versions for\n\nsin, cos, tan\nsinh, cosh, tanh, \nfabs, floor, ceil, fmod, sqrt, log10, log, exp, fabs\nasin, acos, atan, \nasinh, acosh, atanh\n\nhypot, atan2, pow\n\n*/\n\n/**begin repeat\n\n#kind=(sin,cos,tan,sinh,cosh,tanh,fabs,floor,ceil,sqrt,log10,log,exp,asin,acos,atan,asinh,acosh,atanh)*2#\n#typ=longdouble*19, float*19#\n#c=l*19,f*19#\n#TYPE=LONGDOUBLE*19, FLOAT*19#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x) {\n\treturn (@typ@) @kind@((double)x);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n\n#kind=(atan2,hypot,pow,fmod)*2#\n#typ=longdouble*4, float*4#\n#c=l*4,f*4#\n#TYPE=LONGDOUBLE*4,FLOAT*4#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x, @typ@ y) {\n\treturn (@typ@) @kind@((double)x, (double) y);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n#kind=modf*2#\n#typ=longdouble, float#\n#c=l,f#\n#TYPE=LONGDOUBLE, FLOAT#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ modf@c@(@typ@ x, @typ@ *iptr) {\n double nx, niptr, y;\n nx = (double) x;\n y = modf(nx, &niptr);\n *iptr = (@typ@) niptr;\n return (@typ@) y;\n}\n#endif\n/**end repeat**/\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n#ifdef HAVE_FLOAT_FUNCS\nstatic float acoshf(float x)\n{\n\treturn logf(x + sqrtf((x-1.0)*(x+1.0)));\n}\n\nstatic float asinhf(float xx)\n{\n\tfloat x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logf(x + sqrtf(x*x+1.0));\n}\n\nstatic float atanhf(float x)\n{\n\treturn 0.5*logf((1.0+x)/(1.0-x));\n}\n#else\nstatic float acoshf(float x)\n{\n return (float)acosh((double)(x));\n}\n\nstatic float asinhf(float x)\n{\n return (float)asinh((double)(x));\n}\n\nstatic float atanhf(float x)\n{\n return (float)atanh((double)(x));\n}\n#endif\n#endif\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE)\n#ifdef HAVE_LONGDOUBLE_FUNCS\nstatic longdouble acoshl(longdouble x)\n{\n\treturn logl(x + sqrtl((x-1.0)*(x+1.0)));\n}\n\nstatic longdouble asinhl(longdouble xx)\n{\n\tlongdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logl(x + sqrtl(x*x+1.0));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n\treturn 0.5*logl((1.0+x)/(1.0-x));\n}\n#else\nstatic longdouble acoshl(longdouble x)\n{\n return (longdouble)acosh((double)(x));\n}\n\nstatic longdouble asinhl(longdouble x)\n{\n return (longdouble)asinh((double)(x));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n return (longdouble)atanh((double)(x));\n}\n#endif\n#endif\n\n\n\n\n/* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n segfaults if ufuncobject.c is compiled with a different compiler\n than an extension that makes use of the UFUNC API\n*/\n\n/**begin repeat\n\n#typ=float, double, longdouble#\n#c=f,,l#\n*/\n\n/* constants */\nstatic c@typ@ nc_1@c@ = {1., 0.};\nstatic c@typ@ nc_half@c@ = {0.5, 0.};\nstatic c@typ@ nc_i@c@ = {0., 1.};\nstatic c@typ@ nc_i2@c@ = {0., 0.5};\n/*\nstatic c@typ@ nc_mi@c@ = {0., -1.};\nstatic c@typ@ nc_pi2@c@ = {M_PI/2., 0.};\n*/\n\nstatic void\nnc_sum@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real + b->real;\n\tr->imag = a->imag + b->imag;\n\treturn;\n}\n\nstatic void\nnc_diff@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real - b->real;\n\tr->imag = a->imag - b->imag;\n\treturn;\n}\n\nstatic void\nnc_neg@c@(c@typ@ *a, c@typ@ *r)\n{\n\tr->real = -a->real;\n\tr->imag = -a->imag;\n\treturn;\n}\n\nstatic void\nnc_prod@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\tr->real = ar*br - ai*bi;\n\tr->imag = ar*bi + ai*br;\n\treturn;\n}\n\nstatic void\nnc_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = (ar*br + ai*bi)/d;\n\tr->imag = (ai*br - ar*bi)/d;\n\treturn;\n}\n\nstatic void\nnc_floor_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = floor@c@((ar*br + ai*bi)/d);\n\tr->imag = 0;\n\treturn;\n}\n\nstatic void \nnc_sqrt@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ s,d;\n\tif (x->real == 0. && x->imag == 0.)\n\t\t*r = *x;\n\telse {\n\t\ts = sqrt@c@(0.5*(fabs@c@(x->real) + hypot@c@(x->real,x->imag)));\n\t\td = 0.5*x->imag/s;\n\t\tif (x->real > 0.) {\n\t\t\tr->real = s;\n\t\t\tr->imag = d;\n\t\t}\n\t\telse if (x->imag >= 0.) {\n\t\t\tr->real = d;\n\t\t\tr->imag = s;\n\t\t}\n\t\telse {\n\t\t\tr->real = -d;\n\t\t\tr->imag = -s;\n\t\t}\n\t}\n\treturn;\n}\n\nstatic void \nnc_log@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ l = hypot@c@(x->real,x->imag);\n\tr->imag = atan2@c@(x->imag, x->real);\n\tr->real = log@c@(l);\n\treturn;\n}\n\nstatic void \nnc_exp@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ a = exp@c@(x->real);\n\tr->real = a*cos@c@(x->imag);\n\tr->imag = a*sin@c@(x->imag);\n\treturn;\n}\n\nstatic void\nnc_pow@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\t\n\tif (br == 0. && bi == 0.) {\n\t\tr->real = 1.;\n\t\tr->imag = 0.;\n\t}\n\telse if (ar == 0. && ai == 0.) {\n\t\tr->real = 0.;\n\t\tr->imag = 0.;\n\t}\n\telse {\n\t\tnc_log@c@(a, r);\n\t\tnc_prod@c@(r, b, r);\n\t\tnc_exp@c@(r, r);\n\t}\n\treturn;\n}\n\n\nstatic void \nnc_prodi@c@(c@typ@ *x, c@typ@ *r)\n{\n\tr->real = -x->imag;\n\tr->imag = x->real;\n\treturn;\n}\n\n\nstatic void \nnc_acos@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x,x,r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn; \n\t/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));\n\t*/\n}\n\nstatic void \nnc_acosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\treturn;\n\t/*\n\t return nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));\n\t*/\n}\n\nstatic void \nnc_asin@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(x, pa);\n\tnc_sum@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/* \n\t return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));\n\t*/\n}\n\n\nstatic void \nnc_asinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_sum@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_diff@c@(r, x, r);\n\tnc_log@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/*\n\t return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));\n\t*/\n}\n\nstatic void \nnc_atan@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_i@c@, x, pa);\n\tnc_sum@c@(&nc_i@c@, x, r);\n\tnc_quot@c@(r, pa, r);\n\tnc_log@c@(r,r);\n\tnc_prod@c@(&nc_i2@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));\n\t*/\n}\n\nstatic void \nnc_atanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_1@c@, x, r);\n\tnc_sum@c@(&nc_1@c@, x, pa);\n\tnc_quot@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prod@c@(&nc_half@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));\n\t*/\n}\n\nstatic void\nnc_cos@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos@c@(xr)*cosh@c@(xi);\n\tr->imag = -sin@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void \nnc_cosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos(xi)*cosh(xr);\n\tr->imag = sin(xi)*sinh(xr);\n\treturn;\n}\n\n\n#define M_LOG10_E 0.434294481903251827651128918916605082294397\n\nstatic void \nnc_log10@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_log@c@(x, r);\n\tr->real *= M_LOG10_E;\n\tr->imag *= M_LOG10_E;\n\treturn;\n}\n\nstatic void \nnc_sin@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = sin@c@(xr)*cosh@c@(xi);\n\tr->imag = cos@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void\nnc_sinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag; \n\tr->real = cos@c@(xi)*sinh@c@(xr);\n\tr->imag = sin@c@(xi)*cosh@c@(xr);\n\treturn;\n}\n\nstatic void \nnc_tan@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ sr,cr,shi,chi;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsr = sin@c@(xr);\n\tcr = cos@c@(xr);\n\tshi = sinh(xi);\n\tchi = cosh(xi);\n\trs = sr*chi;\n\tis = cr*shi;\n\trc = cr*chi;\n\tic = -sr*shi;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\nstatic void \nnc_tanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ si,ci,shr,chr;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsi = sin@c@(xi);\n\tci = cos@c@(xi);\n\tshr = sinh@c@(xr);\n\tchr = cosh@c@(xr);\n\trs = ci*shr;\n\tis = si*chr;\n\trc = ci*chr;\n\tic = si*shr;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\n/**end repeat**/\n\n\n/**begin repeat\n\n#TYPE=(BOOL, BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE)*2#\n#OP=||, +*13, ^, -*13#\n#kind=add*14, subtract*14#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble)*2#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else\n\tah = al = bh = bl = 0;\n#endif\n\n /* 128-bit product: z*2**64 + (x+y)*2**32 + w */\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n\t/* *c = ((x + y)<<32) + w; */\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>32) || (y>>32) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 32);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>64) || (y>>64) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 64);\n#else\n\treturn 0;\n#endif\n\t\n}\n\nstatic int slonglong_overflow(longlong a0, longlong b0)\n{\n\tulonglong a, b;\n ulonglong ah, al, bh, bl, w, x, y, z;\n\n /* Convert to non-negative quantities */\n\tif (a0 < 0) { a = -a0; } else { a = a0; }\n\tif (b0 < 0) { b = -b0; } else { b = b0; }\n\n\n#if SIZEOF_LONGLONG == 64\n\tah = (a >> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else \n\tah = al = bh = bl = 0;\n#endif\n\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n /* \n\t ulonglong c = ((x + y)<<32) + w;\n\t if ((a0 < 0) ^ (b0 < 0))\n\t *c = -c;\n\t else \n\t *c = c\n\t */\n\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>31) || (y>>31) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 31);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>63) || (y>>63) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 63);\n#else\n\treturn 0;\n#endif\n}\n\n/** end direct numarray code **/\n\nstatic void\nBOOL_multiply(char **args, intp *dimensions, intp *steps, void *func) {\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nULONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tulonglong temp;\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\telse if (temp < MIN_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nLONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tlonglong temp;\n\tfor (i=0; i, >=, <, <=, ==, !=, &&, ||, &, |, ^#\n**/\nstatic void\nBOOL_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tBool in1, in2;\n\tfor(i=0; i*16, >=*16, <*16, <=*16#\n#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*4#\n#kind= greater*16, greater_equal*16, less*16, less_equal*16#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i>*10#\n#kind=fmod*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i*17, <*17#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*2#\n#kind= maximum*17, minimum*17#\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i\n\n\n/* A whole slew of basic math functions are provided originally 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#ifndef M_PI\n#define M_PI 3.14159265358979323846264338328\n#endif\n\n#ifndef HAVE_INVERSE_HYPERBOLIC\nstatic double acosh(double x)\n{\n\treturn log(x + sqrt((x-1.0)*(x+1.0)));\n}\n\nstatic double asinh(double xx)\n{\n\tdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*log(x + sqrt(x*x+1.0));\n}\n\nstatic double atanh(double x)\n{\n\treturn 0.5*log((1.0+x)/(1.0-x));\n}\n#endif\n\n#ifdef HAVE_HYPOT\n#if !defined(NeXT) && !defined(_MSC_VER)\nextern double hypot(double, double);\n#endif\n#else\ndouble hypot(double x, double y)\n{\n\tdouble yx;\n\n\tx = fabs(x);\n\ty = fabs(y);\n\tif (x < y) {\n\t\tdouble temp = x;\n\t\tx = y;\n\t\ty = temp;\n\t}\n\tif (x == 0.)\n\t\treturn 0.;\n\telse {\n\t\tyx = y/x;\n\t\treturn x*sqrt(1.+yx*yx);\n\t}\n}\n#endif\n\n\n\n/* Define isnan, isinf, isfinite, signbit if needed */\n/* Use fpclassify if possible */\n/* isnan, isinf --\n these will use macros and then fpclassify if available before\n defaulting to a dumb convert-to-double version...\n\n isfinite -- define a macro if not already available\n signbit -- if macro available use it, otherwise define a function\n and a dumb convert-to-double version for other types.\n*/\n\n#if defined(fpclassify)\n\n#if !defined(isnan)\n#define isnan(x) (fpclassify(x) == FP_NAN)\n#endif\n#if !defined(isinf)\n#define isinf(x) (fpclassify(x) == FP_INFINITE)\n#endif\n\n#else /* check to see if already have a function like this */\n\n#if !defined(HAVE_ISNAN)\n\n#if !defined(isnan)\n#include \"_isnan.c\"\n#endif\n\n#if !defined(isinf)\n#define isinf(x) (!isnan((x)) && isnan((x)-(x)))\n#endif\n\n#endif /* HAVE_ISNAN */\n#endif /* !defined(isnan) */\n\n\n/* Define signbit if needed */\n#if !defined(signbit)\n#include \"_signbit.c\"\n#endif\n\n\n/* Now defined the extended type macros */\n\n/* We assume that isnan and isinf are defined in the same \n way: as functions, with extended functions, or macros\n*/\n\n#if !defined(isnan)\n\n#if !defined(HAVE_LONGDOUBLE_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanl(x) isnan((double)(x))\n#define isinfl(x) (!isnanl((x)) && isnanl((x)-(x)))\n#endif\n\n#if !defined(HAVE_FLOAT_FUNCS) || !defined(HAVE_ISNAN)\n#define isnanf(x) isnan((double)(x))\n#define isinff(x) (!isnanf((x)) && isnanf((x)-(x)))\n#endif\n\n#else /* !defined(isnan) */\n\n#define isnanl(x) isnan((x))\n#define isnanf(x) isnan((x))\n#define isinfl(x) isinf((x))\n#define isinff(x) isinf((x))\n\n#endif /* !defined(isnan) */\n\n\n\n#if !defined(signbit)\n#define signbitl(x) ((longdouble) signbit((double)(x)))\n#define signbitf(x) ((float) signbit((double) (x)))\n#else\n#define signbitl(x) signbit((x))\n#define signbitf(x) signbit((x))\n#endif\n\n#if !defined(isfinite)\n#define isfinite(x) (!(isinf((x)) || isnan((x))))\n#endif\n#define isfinitef(x) (!(isinff((x)) || isnanf((x))))\n#define isfinitel(x) (!(isinfl((x)) || isnanl((x))))\n\n\n/* First, the C functions that do the real work */\n\n/* if C99 extensions not availble\n\nthen define dummy functions that use the double versions for\n\nsin, cos, tan\nsinh, cosh, tanh, \nfabs, floor, ceil, fmod, sqrt, log10, log, exp, fabs\nasin, acos, atan, \nasinh, acosh, atanh\n\nhypot, atan2, pow\n\n*/\n\n/**begin repeat\n\n#kind=(sin,cos,tan,sinh,cosh,tanh,fabs,floor,ceil,sqrt,log10,log,exp,asin,acos,atan,asinh,acosh,atanh)*2#\n#typ=longdouble*19, float*19#\n#c=l*19,f*19#\n#TYPE=LONGDOUBLE*19, FLOAT*19#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x) {\n\treturn (@typ@) @kind@((double)x);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n\n#kind=(atan2,hypot,pow,fmod)*2#\n#typ=longdouble*4, float*4#\n#c=l*4,f*4#\n#TYPE=LONGDOUBLE*4,FLOAT*4#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ @kind@@c@(@typ@ x, @typ@ y) {\n\treturn (@typ@) @kind@((double)x, (double) y);\n}\n#endif\n/**end repeat**/\n\n/**begin repeat\n#kind=modf*2#\n#typ=longdouble, float#\n#c=l,f#\n#TYPE=LONGDOUBLE, FLOAT#\n*/\n#ifndef HAVE_@TYPE@_FUNCS\n@typ@ modf@c@(@typ@ x, @typ@ *iptr) {\n double nx, niptr, y;\n nx = (double) x;\n y = modf(nx, &niptr);\n *iptr = (@typ@) niptr;\n return (@typ@) y;\n}\n#endif\n/**end repeat**/\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_FLOAT)\n#ifdef HAVE_FLOAT_FUNCS\nstatic float acoshf(float x)\n{\n\treturn logf(x + sqrtf((x-1.0)*(x+1.0)));\n}\n\nstatic float asinhf(float xx)\n{\n\tfloat x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logf(x + sqrtf(x*x+1.0));\n}\n\nstatic float atanhf(float x)\n{\n\treturn 0.5*logf((1.0+x)/(1.0-x));\n}\n#else\nstatic float acoshf(float x)\n{\n return (float)acosh((double)(x));\n}\n\nstatic float asinhf(float x)\n{\n return (float)asinh((double)(x));\n}\n\nstatic float atanhf(float x)\n{\n return (float)atanh((double)(x));\n}\n#endif\n#endif\n\n\n#if !defined(HAVE_INVERSE_HYPERBOLIC_LONGDOUBLE)\n#ifdef HAVE_LONGDOUBLE_FUNCS\nstatic longdouble acoshl(longdouble x)\n{\n\treturn logl(x + sqrtl((x-1.0)*(x+1.0)));\n}\n\nstatic longdouble asinhl(longdouble xx)\n{\n\tlongdouble x;\n\tint sign;\n\tif (xx < 0.0) {\n\t\tsign = -1;\n\t\tx = -xx;\n\t}\n\telse {\n\t\tsign = 1;\n\t\tx = xx;\n\t}\n\treturn sign*logl(x + sqrtl(x*x+1.0));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n\treturn 0.5*logl((1.0+x)/(1.0-x));\n}\n#else\nstatic longdouble acoshl(longdouble x)\n{\n return (longdouble)acosh((double)(x));\n}\n\nstatic longdouble asinhl(longdouble x)\n{\n return (longdouble)asinh((double)(x));\n}\n\nstatic longdouble atanhl(longdouble x)\n{\n return (longdouble)atanh((double)(x));\n}\n#endif\n#endif\n\n\n\n\n/* Don't pass structures between functions (only pointers) because how\n structures are passed is compiler dependent and could cause\n segfaults if ufuncobject.c is compiled with a different compiler\n than an extension that makes use of the UFUNC API\n*/\n\n/**begin repeat\n\n#typ=float, double, longdouble#\n#c=f,,l#\n*/\n\n/* constants */\nstatic c@typ@ nc_1@c@ = {1., 0.};\nstatic c@typ@ nc_half@c@ = {0.5, 0.};\nstatic c@typ@ nc_i@c@ = {0., 1.};\nstatic c@typ@ nc_i2@c@ = {0., 0.5};\n/*\nstatic c@typ@ nc_mi@c@ = {0., -1.};\nstatic c@typ@ nc_pi2@c@ = {M_PI/2., 0.};\n*/\n\nstatic void\nnc_sum@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real + b->real;\n\tr->imag = a->imag + b->imag;\n\treturn;\n}\n\nstatic void\nnc_diff@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\tr->real = a->real - b->real;\n\tr->imag = a->imag - b->imag;\n\treturn;\n}\n\nstatic void\nnc_neg@c@(c@typ@ *a, c@typ@ *r)\n{\n\tr->real = -a->real;\n\tr->imag = -a->imag;\n\treturn;\n}\n\nstatic void\nnc_prod@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\tr->real = ar*br - ai*bi;\n\tr->imag = ar*bi + ai*br;\n\treturn;\n}\n\nstatic void\nnc_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = (ar*br + ai*bi)/d;\n\tr->imag = (ai*br - ar*bi)/d;\n\treturn;\n}\n\nstatic void\nnc_floor_quot@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag; \n\t@typ@ d = br*br + bi*bi;\n\tr->real = floor@c@((ar*br + ai*bi)/d);\n\tr->imag = 0;\n\treturn;\n}\n\nstatic void \nnc_sqrt@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ s,d;\n\tif (x->real == 0. && x->imag == 0.)\n\t\t*r = *x;\n\telse {\n\t\ts = sqrt@c@(0.5*(fabs@c@(x->real) + hypot@c@(x->real,x->imag)));\n\t\td = 0.5*x->imag/s;\n\t\tif (x->real > 0.) {\n\t\t\tr->real = s;\n\t\t\tr->imag = d;\n\t\t}\n\t\telse if (x->imag >= 0.) {\n\t\t\tr->real = d;\n\t\t\tr->imag = s;\n\t\t}\n\t\telse {\n\t\t\tr->real = -d;\n\t\t\tr->imag = -s;\n\t\t}\n\t}\n\treturn;\n}\n\nstatic void \nnc_log@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ l = hypot@c@(x->real,x->imag);\n\tr->imag = atan2@c@(x->imag, x->real);\n\tr->real = log@c@(l);\n\treturn;\n}\n\nstatic void \nnc_exp@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ a = exp@c@(x->real);\n\tr->real = a*cos@c@(x->imag);\n\tr->imag = a*sin@c@(x->imag);\n\treturn;\n}\n\nstatic void\nnc_pow@c@(c@typ@ *a, c@typ@ *b, c@typ@ *r)\n{\n\t@typ@ ar=a->real, br=b->real, ai=a->imag, bi=b->imag;\n\t\n\tif (br == 0. && bi == 0.) {\n\t\tr->real = 1.;\n\t\tr->imag = 0.;\n\t}\n\telse if (ar == 0. && ai == 0.) {\n\t\tr->real = 0.;\n\t\tr->imag = 0.;\n\t}\n\telse {\n\t\tnc_log@c@(a, r);\n\t\tnc_prod@c@(r, b, r);\n\t\tnc_exp@c@(r, r);\n\t}\n\treturn;\n}\n\n\nstatic void \nnc_prodi@c@(c@typ@ *x, c@typ@ *r)\n{\n\tr->real = -x->imag;\n\tr->imag = x->real;\n\treturn;\n}\n\n\nstatic void \nnc_acos@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x,x,r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn; \n\t/* return nc_neg(nc_prodi(nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))))));\n\t*/\n}\n\nstatic void \nnc_acosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_sum@c@(x, r, r);\n\tnc_log@c@(r, r);\n\treturn;\n\t/*\n\t return nc_log(nc_sum(x,nc_prod(nc_i,\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x))))));\n\t*/\n}\n\nstatic void \nnc_asin@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_prod@c@(x, x, r);\n\tnc_diff@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_prodi@c@(x, pa);\n\tnc_sum@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prodi@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/* \n\t return nc_neg(nc_prodi(nc_log(nc_sum(nc_prod(nc_i,x),\n\t nc_sqrt(nc_diff(nc_1,nc_prod(x,x)))))));\n\t*/\n}\n\n\nstatic void \nnc_asinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_prod@c@(x, x, r);\n\tnc_sum@c@(&nc_1@c@, r, r);\n\tnc_sqrt@c@(r, r);\n\tnc_diff@c@(r, x, r);\n\tnc_log@c@(r, r);\n\tnc_neg@c@(r, r);\n\treturn;\n\t/*\n\t return nc_neg(nc_log(nc_diff(nc_sqrt(nc_sum(nc_1,nc_prod(x,x))),x)));\n\t*/\n}\n\nstatic void \nnc_atan@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_i@c@, x, pa);\n\tnc_sum@c@(&nc_i@c@, x, r);\n\tnc_quot@c@(r, pa, r);\n\tnc_log@c@(r,r);\n\tnc_prod@c@(&nc_i2@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_i2,nc_log(nc_quot(nc_sum(nc_i,x),nc_diff(nc_i,x))));\n\t*/\n}\n\nstatic void \nnc_atanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\tc@typ@ a, *pa=&a;\n\tnc_diff@c@(&nc_1@c@, x, r);\n\tnc_sum@c@(&nc_1@c@, x, pa);\n\tnc_quot@c@(pa, r, r);\n\tnc_log@c@(r, r);\n\tnc_prod@c@(&nc_half@c@, r, r);\n\treturn;\n\t/*\n\t return nc_prod(nc_half,nc_log(nc_quot(nc_sum(nc_1,x),nc_diff(nc_1,x))));\n\t*/\n}\n\nstatic void\nnc_cos@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos@c@(xr)*cosh@c@(xi);\n\tr->imag = -sin@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void \nnc_cosh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = cos(xi)*cosh(xr);\n\tr->imag = sin(xi)*sinh(xr);\n\treturn;\n}\n\n\n#define M_LOG10_E 0.434294481903251827651128918916605082294397\n\nstatic void \nnc_log10@c@(c@typ@ *x, c@typ@ *r)\n{\n\tnc_log@c@(x, r);\n\tr->real *= M_LOG10_E;\n\tr->imag *= M_LOG10_E;\n\treturn;\n}\n\nstatic void \nnc_sin@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag;\n\tr->real = sin@c@(xr)*cosh@c@(xi);\n\tr->imag = cos@c@(xr)*sinh@c@(xi);\n\treturn;\n}\n\nstatic void\nnc_sinh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ xr=x->real, xi=x->imag; \n\tr->real = cos@c@(xi)*sinh@c@(xr);\n\tr->imag = sin@c@(xi)*cosh@c@(xr);\n\treturn;\n}\n\nstatic void \nnc_tan@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ sr,cr,shi,chi;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsr = sin@c@(xr);\n\tcr = cos@c@(xr);\n\tshi = sinh(xi);\n\tchi = cosh(xi);\n\trs = sr*chi;\n\tis = cr*shi;\n\trc = cr*chi;\n\tic = -sr*shi;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\nstatic void \nnc_tanh@c@(c@typ@ *x, c@typ@ *r)\n{\n\t@typ@ si,ci,shr,chr;\n\t@typ@ rs,is,rc,ic;\n\t@typ@ d;\n\t@typ@ xr=x->real, xi=x->imag;\n\tsi = sin@c@(xi);\n\tci = cos@c@(xi);\n\tshr = sinh@c@(xr);\n\tchr = cosh@c@(xr);\n\trs = ci*shr;\n\tis = si*chr;\n\trc = ci*chr;\n\tic = si*shr;\n\td = rc*rc + ic*ic;\n\tr->real = (rs*rc+is*ic)/d;\n\tr->imag = (is*rc-rs*ic)/d;\n\treturn;\n}\n\n/**end repeat**/\n\n\n/**begin repeat\n\n#TYPE=(BOOL, BYTE,UBYTE,SHORT,USHORT,INT,UINT,LONG,ULONG,LONGLONG,ULONGLONG,FLOAT,DOUBLE,LONGDOUBLE)*2#\n#OP=||, +*13, ^, -*13#\n#kind=add*14, subtract*14#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble)*2#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else\n\tah = al = bh = bl = 0;\n#endif\n\n /* 128-bit product: z*2**64 + (x+y)*2**32 + w */\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n\t/* *c = ((x + y)<<32) + w; */\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>32) || (y>>32) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 32);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>64) || (y>>64) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 64);\n#else\n\treturn 0;\n#endif\n\t\n}\n\nstatic int slonglong_overflow(longlong a0, longlong b0)\n{\n\tulonglong a, b;\n ulonglong ah, al, bh, bl, w, x, y, z;\n\n /* Convert to non-negative quantities */\n\tif (a0 < 0) { a = -a0; } else { a = a0; }\n\tif (b0 < 0) { b = -b0; } else { b = b0; }\n\n\n#if SIZEOF_LONGLONG == 64\n\tah = (a >> 32);\n\tal = (a & 0xFFFFFFFFL);\n\tbh = (b >> 32);\n\tbl = (b & 0xFFFFFFFFL);\n#elif SIZEOF_LONGLONG == 128\n\tah = (a >> 64);\n\tal = (a & 0xFFFFFFFFFFFFFFFFL);\n\tbh = (b >> 64);\n\tbl = (b & 0xFFFFFFFFFFFFFFFFL);\n#else \n\tah = al = bh = bl = 0;\n#endif\n\n\tw = al*bl;\n\tx = bh*al;\n\ty = ah*bl;\n\tz = ah*bh;\n\n /* \n\t ulonglong c = ((x + y)<<32) + w;\n\t if ((a0 < 0) ^ (b0 < 0))\n\t *c = -c;\n\t else \n\t *c = c\n\t */\n\n#if SIZEOF_LONGLONG == 64\n\treturn z || (x>>31) || (y>>31) ||\n\t\t(((x & 0xFFFFFFFFL) + (y & 0xFFFFFFFFL) + (w >> 32)) >> 31);\n#elif SIZEOF_LONGLONG == 128\n\treturn z || (x>>63) || (y>>63) ||\n\t\t(((x & 0xFFFFFFFFFFFFFFFFL) + (y & 0xFFFFFFFFFFFFFFFFL) + (w >> 64)) >> 63);\n#else\n\treturn 0;\n#endif\n}\n\n/** end direct numarray code **/\n\nstatic void\nBOOL_multiply(char **args, intp *dimensions, intp *steps, void *func) {\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nULONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tulonglong temp;\n\tfor (i=0; i MAX_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\telse if (temp < MIN_@TYP@) \n\t\t\tgenerate_overflow_error();\n\t\t*((@typ@ *)op) = temp;\n\t} \n}\n\n/**end repeat**/\n\nstatic void \nLONGLONG_multiply(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0], is2=steps[1], os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tlonglong temp;\n\tfor (i=0; i, >=, <, <=, ==, !=, &&, ||, &, |, ^#\n**/\nstatic void\nBOOL_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tBool in1, in2;\n\tfor(i=0; i*16, >=*16, <*16, <=*16#\n#typ=(byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*4#\n#kind= greater*16, greater_equal*16, less*16, less_equal*16#\n*/\n\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i>*10#\n#kind=fmod*10, bitwise_and*10, bitwise_or*10, bitwise_xor*10, left_shift*10, right_shift*10#\n\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i*17, <*17#\n#typ=(Bool, byte, ubyte, short, ushort, int, uint, long, ulong, longlong, ulonglong, float, double, longdouble, float, double, longdouble)*2#\n#kind= maximum*17, minimum*17#\n*/\nstatic void \n@TYPE@_@kind@(char **args, intp *dimensions, intp *steps, void *func) \n{\n\tregister intp i;\n\tintp is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n\tchar *i1=args[0], *i2=args[1], *op=args[2];\n\tfor(i=0; i)\";\n+static char doc_argsort[] = \"a.argsort()\\n\"\\\n+\t\" Return the indexes into a that would sort it along the\"\\\n+\t\" given axis (or if the sorting should be done\"\\\n+\t\" in terms of a.flat\";\n \n static PyObject *\n array_argsort(PyArrayObject *self, PyObject *args) \n@@ -629,7 +640,14 @@ array_argsort(PyArrayObject *self, PyObject *args)\n \treturn _ARET(PyArray_ArgSort(self, axis));\n }\n \n-static char doc_searchsorted[] = \"a.searchsorted(v)\";\n+static char doc_searchsorted[] = \"a.searchsorted(v)\\n\"\\\n+\t\" Assuming that a is a 1-D array, in ascending order and\\n\"\\\n+\t\" represents bin boundaries, then a.searchsorted(values) gives an\\n\"\\\n+\t\" array of bin numbers, giving the bin into which each value would\\n\"\\\n+\t\" be placed. This method is helpful for histograming. \\n\"\\\n+\t\" Note: No warning is given if the boundaries, in a, are not \\n\"\\\n+\t\" in ascending order.\";\n+;\n \n static PyObject *\n array_searchsorted(PyArrayObject *self, PyObject *args) \n", "added_lines": 25, "deleted_lines": 7, "source_code": "\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\nstatic char doc_take[] = \"a.take(indices, axis=None). Selects the elements \"\\\n\t\"in indices from array a along the given axis.\";\n\nstatic PyObject *\narray_take(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint dimension=MAX_DIMS;\n\tPyObject *indices;\n\tstatic char *kwlist[] = {\"indices\", \"axis\", NULL};\n\t\n\tdimension=0;\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist, \n\t\t\t\t\t &indices, PyArray_AxisConverter,\n\t\t\t\t\t &dimension))\n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Take(self, indices, dimension));\n}\n\nstatic char doc_put[] = \"a.put(indices, values) sets a.flat[n] = v[n] \"\\\n\t\"for each n in indices. v can be scalar or shorter than indices, \"\\\n\t\"will repeat.\";\n\nstatic PyObject *\narray_put(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *indices, *values;\n\tstatic char *kwlist[] = {\"indices\", \"values\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO\", kwlist,\n\t\t\t\t\t &indices, &values))\n\t\treturn NULL;\n\treturn PyArray_Put(self, indices, values);\n}\n\nstatic char doc_putmask[] = \"a.putmask(mask, values) sets a.flat[n] = v[n] \"\\\n\t\"for each n where mask.flat[n] is TRUE. v can be scalar.\";\n\nstatic PyObject *\narray_putmask(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *mask, *values;\n\n\tstatic char *kwlist[] = {\"mask\", \"values\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO\", kwlist,\n\t\t\t\t\t &mask, &values))\n\t\treturn NULL;\n\treturn PyArray_PutMask(self, mask, values);\n}\n\n/* Used to reshape a Fortran Array */\nstatic void\n_reverse_shape(PyArray_Dims *newshape)\n{\n\tint i, n = newshape->len;\n\tintp *ptr = newshape->ptr;\n\tintp *eptr;\n\tintp tmp;\n\tint len = n >> 1;\n\n\teptr = ptr+n-1;\n\tfor(i=0; i) return a new view of array with same data.\";\n\nstatic PyObject *\narray_view(PyArrayObject *self, PyObject *args)\n{\n PyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tif (!PyArg_ParseTuple(args, \"|O&\",\n PyArray_TypecodeConverter, &type)) \n return NULL;\n\n\treturn _ARET(PyArray_View(self, &type));\n}\n\nstatic char doc_argmax[] = \"a.argmax(axis=None)\";\n\nstatic PyObject *\narray_argmax(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_ArgMax(self, axis));\n}\n\nstatic char doc_argmin[] = \"a.argmin(axis=None)\";\n\nstatic PyObject *\narray_argmin(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_ArgMin(self, axis));\n}\n\nstatic char doc_max[] = \"a.max(axis=None)\";\n\nstatic PyObject *\narray_max(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Max(self, axis);\n}\n\nstatic char doc_ptp[] = \"a.ptp(axis=None) a.max(axis)-a.min(axis)\";\n\nstatic PyObject *\narray_ptp(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Ptp(self, axis);\n}\n\n\nstatic char doc_min[] = \"a.min(axis=None)\";\n\nstatic PyObject *\narray_min(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Min(self, axis);\n}\n\n\nstatic char doc_swapaxes[] = \"a.swapaxes(axis1, axis2) returns new view with axes swapped.\";\n\nstatic PyObject *\narray_swapaxes(PyArrayObject *self, PyObject *args)\n{\n\tint axis1, axis2;\n\n\tif (!PyArg_ParseTuple(args, \"ii\", &axis1, &axis2)) return NULL;\n\n\treturn PyArray_SwapAxes(self, axis1, axis2);\n}\n\nstatic char doc_getfield[] = \"m.field(type, offset) returns a field \"\\\n\t\" of the given array as a certain type. A field is a view of \"\\\n\t\" the array's data with each itemsize determined by the given type\"\\\n\t\" and the offset into the current array items given.\";\n\nstatic PyObject *\nPyArray_GetField(PyArrayObject *self, PyArray_Typecode *type, \n\t\t\t\t int offset)\n{\n\tPyObject *ret=NULL;\n\tret = PyArray_New(self->ob_type, self->nd, self->dimensions,\n\t\t\t type->type_num, self->strides, \n\t\t\t self->data + offset,\n\t\t\t type->itemsize, self->flags, (PyObject *)self);\n\tif (ret == NULL) return NULL;\n\tPy_INCREF(self);\n\t((PyArrayObject *)ret)->base = (PyObject *)self;\n\tPyArray_UpdateFlags((PyArrayObject *)ret, UPDATE_ALL_FLAGS);\n\treturn ret;\t\n}\n\nstatic PyObject *\narray_getfield(PyArrayObject *self, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\tint offset = 0;\n\tstatic char *kwlist[] = {\"dtype\", \"offset\", 0};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|i\", kwlist,\n\t\t\t\t\t PyArray_TypecodeConverter, \n\t\t\t\t\t &typecode, &offset)) return NULL;\n\n\t\n\tif (typecode.itemsize > self->itemsize) {\n\t\tPyErr_SetString(PyExc_TypeError, \"Field itemsize must be <=\"\\\n\t\t\t\t\"array itemsize.\");\n\t\treturn NULL;\n\t}\n\treturn _ARET(PyArray_GetField(self, &typecode, offset));\n}\n\nstatic PyObject *\nPyArray_Byteswap(PyArrayObject *self, Bool inplace)\n{\n PyArrayObject *ret;\n\tintp size;\n\tPyArray_CopySwapNFunc *copyswapn;\n\tPyArrayIterObject *it;\n\n\tif (inplace) {\n\t\tcopyswapn = self->descr->copyswapn;\n\t\t\n\t\tsize = PyArray_SIZE(self);\n\t\tif (PyArray_ISONESEGMENT(self)) {\n\t\t\tcopyswapn(self->data, NULL, size, 1, self->itemsize);\n\t\t}\n\t\telse { /* Use iterator */\n\t\t\t\n\t\t\tit = (PyArrayIterObject *)\\\n\t\t\t\tPyArray_IterNew((PyObject *)self);\n\t\t\t\n\t\t\twhile (it->index < it->size) {\n\t\t\t\tcopyswapn(it->dataptr, NULL, 1, 1, \n\t\t\t\t\t self->itemsize);\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t}\n\t\t\tPy_DECREF(it);\n\t\t}\n\n\t\tif (self->flags & NOTSWAPPED) self->flags &= ~NOTSWAPPED;\n\t\telse self->flags |= NOTSWAPPED;\n\t\t\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\telse {\n\t\tif ((ret = (PyArrayObject *)PyArray_Copy(self)) == NULL) \n\t\t\treturn NULL;\n\t\t\n\t\tsize = PyArray_SIZE(self);\n\t\t\n\t\t/* set the NOTSWAPPED flag to opposite self */\n\t\t/* ret is always notswapped, \n\t\t PyArray_Copy has already swapped if self was swapped */\n\n\t\tif (self->flags & NOTSWAPPED) {\n\t\t\tret->descr->copyswapn(ret->data, NULL, size, 1, ret->itemsize);\n\t\t\tret->flags &= ~NOTSWAPPED;\n\t\t}\n\t\telse { /* self was swapped, so now ret isn't */\n\t\t\tret->flags |= NOTSWAPPED;\n\t\t}\n\t\t\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic char doc_byteswap[] = \"m.byteswap(False) Swap the bytes in\"\\\n\t\" the array. Return the byteswapped array. If the first argument\"\\\n\t\" is TRUE, byteswap in-place and return a reference to self.\";\n\nstatic PyObject *\narray_byteswap(PyArrayObject *self, PyObject *args) \n{\n\tBool inplace=FALSE;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter, &inplace))\n\t\treturn NULL;\n\t\n\treturn PyArray_Byteswap(self, inplace);\n}\n\nstatic char doc_tolist[] = \"m.tolist().\t Copy the data portion of the array\"\\\n\t\" to a hierarchical python list and return that list.\";\n\nstatic PyObject *\narray_tolist(PyArrayObject *self, PyObject *args) \n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n if (self->nd <= 0) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can't convert a 0d array to a list\");\n return NULL;\n }\n\t\n return PyArray_ToList(self);\n}\n\nstatic char doc_tostring[] = \"m.tostring() Construct a Python string \"\\\n \"containing the raw bytes in the array\";\n\nstatic PyObject *\narray_tostring(PyArrayObject *self, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n return PyArray_ToString(self);\n}\n\nstatic char doc_tofile[] = \"m.tofile(fid, sep=\"\") write the data to a file.\";\n\nstatic PyObject *\narray_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds)\n{\n\tint ret;\n PyObject *file;\n\tFILE *fd;\n char *sep=\"\";\n\tchar *format=\"\";\n\tchar *mode;\n\tstatic char *kwlist[] = {\"file\", \"sep\", \"format\", NULL};\n \n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|ss\", kwlist, \n &file, &sep, &format)) return NULL;\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"wb\";\n\t\telse mode=\"w\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfd = PyFile_AsFile(file);\n\tif (fd == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be a \" \\\n\t\t\t\t\"string or open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_ToFile(self, fd, sep, format);\n\tPy_DECREF(file);\n\tif (ret < 0) return NULL;\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_toscalar[] = \"m.toscalar(). Copy the first data point of \"\\\n\t\"the array to a standard Python scalar and return it.\";\n\nstatic PyObject *\narray_toscalar(PyArrayObject *self, PyObject *args) {\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n return self->descr->getitem(self->data, self);\n}\n\nstatic char doc_cast[] = \"m.astype(t).\tCast array m to type t.\t \\n\\n\"\\\n\t\"t can be either a string representing a typecode, or a python type\"\\\n\t\" object of type int, float, or complex.\";\n\nstatic PyObject *\narray_cast(PyArrayObject *self, PyObject *args) \n{\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\t\n if (!PyArg_ParseTuple(args, \"O&\", PyArray_TypecodeConverter,\n\t\t\t &typecode)) return NULL;\n\n\tif (typecode.type_num == PyArray_NOTYPE ||\t\\\n\t typecode.type_num == PyArray_TYPE(self)) {\n\t\treturn _ARET(PyArray_Copy(self));\n\t}\n\treturn _ARET(PyArray_CastToType(self, &typecode));\n}\t \n\n/* default sub-type implementation */\n\nstatic char doc_wraparray[] = \"m.__array_wrap__(obj) returns an object of \"\\\n\t\"type m from the ndarray object obj\";\n\nstatic PyObject *\narray_wraparray(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *arr;\n\tPyObject *ret;\n\t\n\tif (PyTuple_Size(args) < 1) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"only accepts 1 argument.\");\n\t\treturn NULL;\n\t}\n\tarr = PyTuple_GET_ITEM(args, 0);\n\tif (!PyArray_Check(arr)) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"can only be called with ndarray object\");\n\t\treturn NULL;\n\t}\t\n\n\tret = PyArray_New(self->ob_type, PyArray_NDIM(arr),\n\t\t\t PyArray_DIMS(arr), PyArray_TYPE(arr),\n\t\t\t PyArray_STRIDES(arr), PyArray_DATA(arr),\n\t\t\t PyArray_ITEMSIZE(arr), \n\t\t\t PyArray_FLAGS(arr), (PyObject *)self);\n\tif (ret == NULL) return NULL;\n\tPy_INCREF(arr);\n\tPyArray_BASE(ret) = arr;\n\treturn ret;\n}\n\n/* NO-OP --- just so all subclasses will have one by default. */\nstatic PyObject *\narray_finalize(PyArrayObject *self, PyObject *args)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\n\nstatic char doc_array_getarray[] = \"m.__array__(|type) just returns either a new reference to self if type is not given or a new array of type if type is different from the current type of the array.\";\n\nstatic PyObject *\narray_getarray(PyArrayObject *self, PyObject *args) \n{\n\tPyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_TYPE(self),\n\t\t\t\t PyArray_ITEMSIZE(self),\n\t\t\t\t 0};\n\tPyObject *ret;\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", &PyArray_TypecodeConverter,\n\t\t\t &newtype)) return NULL;\n\n\t/* convert to PyArray_Type or PyBigArray_Type */\n\tif (!PyArray_CheckExact(self) || !PyBigArray_CheckExact(self)) {\n\t\tPyObject *new;\n\t\tPyTypeObject *subtype = &PyArray_Type;\n\n\t\tif (!PyType_IsSubtype(self->ob_type, &PyArray_Type)) {\n\t\t\tsubtype = &PyBigArray_Type;\n\t\t}\n\t\t\n\t\tnew = PyArray_New(subtype, PyArray_NDIM(self),\n\t\t\t\t PyArray_DIMS(self), PyArray_TYPE(self),\n\t\t\t\t PyArray_STRIDES(self), PyArray_DATA(self),\n\t\t\t\t PyArray_ITEMSIZE(self), \n\t\t\t\t PyArray_FLAGS(self), NULL);\n\t\tif (new == NULL) return NULL;\n\t\tPy_INCREF(self);\n\t\tPyArray_BASE(new) = (PyObject *)self;\n\t\tself = (PyArrayObject *)new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t}\n\t\t\n\tif (newtype.type_num == PyArray_NOTYPE ||\n\t PyArray_EquivalentTypes(&oldtype, &newtype)) {\n\t\treturn (PyObject *)self;\n\t}\n\telse {\n\t\tret = PyArray_CastToType(self, &newtype);\n\t\tPy_DECREF(self);\n\t\treturn ret;\n\t}\n}\n\nstatic char doc_copy[] = \"m.copy(). Return a copy of the array.\";\n\nstatic PyObject *\narray_copy(PyArrayObject *self, PyObject *args) \n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\t\n return _ARET(PyArray_Copy(self));\n}\n\nstatic char doc_resize[] = \"self.resize(new_shape). \"\\\n\t\"Change size and shape of self inplace.\\n\"\\\n\t\"\\n Array must own its own memory and not be referenced by other \" \\\n\t\"arrays\\n Returns None.\";\n\nstatic PyObject *\narray_resize(PyArrayObject *self, PyObject *args) \n{\n PyArray_Dims newshape;\n PyObject *ret;\n\tint n;\n\t\n\tn = PyTuple_Size(args);\n\tif (n <= 1) {\n\t\tif (!PyArg_ParseTuple(args, \"O&\", PyArray_IntpConverter, \n\t\t\t\t &newshape)) return NULL;\n\t}\n else {\n\t\tif (!PyArray_IntpConverter(args, &newshape)) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\t\"invalid shape.\");\n\t\t\t} \n\t\t\treturn NULL;\t\t\t\n\t\t}\n\t}\n\tret = PyArray_Resize(self, &newshape);\n PyDimMem_FREE(newshape.ptr);\n\tPy_DECREF(ret);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_repeat[] = \"a.repeat(repeats=, axis=None)\\n\"\\\n\t\"\\n\"\\\n\t\" Copy elements of a, repeats times. The repeats argument must\\n\"\\\n\t\" be a sequence of length a.shape[axis] or a scalar.\";\n\nstatic PyObject *\narray_repeat(PyArrayObject *self, PyObject *args, PyObject *kwds) {\n\tPyObject *repeats;\n\tint axis=MAX_DIMS;\n\tstatic char *kwlist[] = {\"repeats\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist, \n\t\t\t\t\t &repeats, PyArray_AxisConverter,\n\t\t\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Repeat(self, repeats, axis);\n}\n\nstatic char doc_choose[] = \"self.choose(b0,b1,...,bn)\\n\"\\\n\t\"\\n\"\\\n\t\" Self sould be an integer array with entries from 0 to n+1, \\n\"\\\n\t\" The bi arrays should be of the same shape as self. The result\\n\"\\\n\t\" will be an array with elements chosen from the bi arrays\\n\"\\\n\t\" according to the value at each position of self.\";\n\nstatic PyObject *\narray_choose(PyArrayObject *self, PyObject *args) \n{\n\tPyObject *choices;\n\tint n;\n\t\n\tn = PyTuple_Size(args);\n\tif (n <= 1) {\n\t\tif (!PyArg_ParseTuple(args, \"O\", &choices))\n\t\t\treturn NULL;\n\t}\n else {\n\t\tchoices = args;\n\t}\n\t\n\treturn _ARET(PyArray_Choose(self, choices));\n}\n\nstatic char doc_sort[] = \"a.sort()\";\n\nstatic PyObject *\narray_sort(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_Sort(self, axis));\n}\n\nstatic char doc_argsort[] = \"a.argsort()\\n\"\\\n\t\" Return the indexes into a that would sort it along the\"\\\n\t\" given axis (or if the sorting should be done\"\\\n\t\" in terms of a.flat\";\n\nstatic PyObject *\narray_argsort(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_ArgSort(self, axis));\n}\n\nstatic char doc_searchsorted[] = \"a.searchsorted(v)\\n\"\\\n\t\" Assuming that a is a 1-D array, in ascending order and\\n\"\\\n\t\" represents bin boundaries, then a.searchsorted(values) gives an\\n\"\\\n\t\" array of bin numbers, giving the bin into which each value would\\n\"\\\n\t\" be placed. This method is helpful for histograming. \\n\"\\\n\t\" Note: No warning is given if the boundaries, in a, are not \\n\"\\\n\t\" in ascending order.\";\n;\n\nstatic PyObject *\narray_searchsorted(PyArrayObject *self, PyObject *args) \n{\n\tPyObject *values;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &values)) return NULL;\n\t\n\treturn _ARET(PyArray_SearchSorted(self, values));\n}\n\nstatic char doc_deepcopy[] = \"Used if copy.deepcopy is called on an array.\";\n\nstatic PyObject *\narray_deepcopy(PyArrayObject *self, PyObject *args) \n{\n PyObject* visit;\n PyObject **optr;\n PyArrayIterObject *it;\n PyObject *copy, *ret, *deepcopy, *temp, *res;\n\n if (!PyArg_ParseTuple(args, \"O\", &visit)) return NULL;\n ret = PyArray_Copy(self);\n if (PyArray_ISOBJECT(self)) {\n copy = PyImport_ImportModule(\"copy\");\n if (copy == NULL) return NULL;\n deepcopy = PyObject_GetAttrString(copy, \"deepcopy\");\n if (deepcopy == NULL) return NULL;\n Py_DECREF(copy);\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it == NULL) {Py_DECREF(deepcopy); return NULL;}\n optr = (PyObject **)PyArray_DATA(ret);\n while(it->index < it->size) {\n temp = *((PyObject **)it->dataptr);\n Py_INCREF(temp);\n /* call deepcopy on this argument */\n res = PyObject_CallFunctionObjArgs(deepcopy, \n temp, visit, NULL);\n Py_DECREF(temp);\n Py_DECREF(*optr);\n *optr++ = res;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(deepcopy);\n Py_DECREF(it);\n }\n return _ARET(ret);\n}\n\n/* Convert Object Array to flat list and pickle the flat list string */\nstatic PyObject *\n_getobject_pkl(PyArrayObject *self)\n{\n\tPyObject *theobject;\n\tPyArrayIterObject *iter=NULL;\n\tPyObject *list;\n\n\t\n\titer = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (iter == NULL) return NULL;\n\tlist = PyList_New(iter->size);\n\tif (list == NULL) {Py_DECREF(iter); return NULL;}\n\twhile (iter->index < iter->size) {\n\t\ttheobject = *((PyObject **)iter->dataptr);\n\t\tPy_INCREF(theobject);\n\t\tPyList_SET_ITEM(list, (int) iter->index, theobject);\n\t\tPyArray_ITER_NEXT(iter);\n\t}\n\tPy_DECREF(iter);\n\treturn list;\n}\n\nstatic int\n_setobject_pkl(PyArrayObject *self, PyObject *list)\n{\n\tPyObject *theobject;\n\tPyArrayIterObject *iter=NULL;\n\tint size;\n\n\tsize = self->itemsize;\n\t\n\titer = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (iter == NULL) return -1;\n\twhile(iter->index < iter->size) {\n\t\ttheobject = PyList_GET_ITEM(list,(int) iter->index);\n\t\tPy_INCREF(theobject);\n\t\t*((PyObject **)iter->dataptr) = theobject;\n\t\tPyArray_ITER_NEXT(iter);\n\t}\n\tPy_XDECREF(iter);\n\treturn 0;\n}\n\n\nstatic char doc_reduce[] = \"a.__reduce__() for pickling.\";\n\nstatic PyObject *\narray_reduce(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *ret=NULL, *state=NULL, *obj=NULL, *mod=NULL;\n\tPyObject *Bool, *thestr=NULL;\n\n\t/* Return a tuple of (callable object, arguments, object's state) */\n\t/* We will put everything in the object's state, so that on UnPickle\n\t it can use the string object as memory without a copy */\n\n\tret = PyTuple_New(3);\n\tif (ret == NULL) return NULL;\n\tmod = PyImport_ImportModule(\"scipy.base.multiarray\");\n\tif (mod == NULL) return NULL;\n\tobj = PyObject_GetAttrString(mod, \"empty\");\n\tPy_DECREF(mod);\n\tif (obj == NULL) return NULL;\n\tPyTuple_SET_ITEM(ret, 0, obj);\n\tPyTuple_SET_ITEM(ret, 1, \n\t\t\t Py_BuildValue(\"NNN\",\n\t\t\t\t Py_BuildValue(\"(N)\",\n\t\t\t\t\t\t PyInt_FromLong(0)),\n\t\t\t\t PyObject_GetAttrString((PyObject *)self,\n\t\t\t\t\t\t\t \"dtypechar\"),\n\t\t\t\t PyInt_FromLong((long) 0)));\n\t\n\t/* Now fill in object's state. This is a tuple with \n\t 4 arguments\n\n\t 1) a Tuple giving the shape\n\t 2) a string giving the typestr (> or < indicates byte order\n\t if swap is possibly needed)\n\t 3) a Bool stating if Fortran or not\n\t 4) a binary string with the data (or a list for Object arrays)\n\n\t Notice because Python does not describe a mechanism to write \n\t raw data to the pickle, this performs a copy to a string first\n\t*/\n\n\tstate = PyTuple_New(4);\n\tif (state == NULL) {\n\t\tPy_DECREF(ret); return NULL;\n\t}\n\tPyTuple_SET_ITEM(state, 0, PyObject_GetAttrString((PyObject *)self, \n\t\t\t\t\t\t\t \"shape\"));\t\n\tPyTuple_SET_ITEM(state, 1, PyObject_GetAttrString((PyObject *)self, \n\t\t\t\t\t\t\t \"dtypestr\"));\n\tBool = (PyArray_ISFORTRAN(self) ? Py_True : Py_False);\n\tPy_INCREF(Bool);\n\tPyTuple_SET_ITEM(state, 2, Bool);\n\tif (PyArray_ISOBJECT(self)) {\n\t\tthestr = _getobject_pkl(self);\n\t}\n\telse {\n thestr = PyArray_ToString(self);\n\t}\n\tif (thestr == NULL) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(state);\n\t\treturn NULL;\n\t}\n\tPyTuple_SET_ITEM(state, 3, thestr);\n\tPyTuple_SET_ITEM(ret, 2, state);\n\treturn ret;\n}\n\nstatic char doc_setstate[] = \"a.__setstate__(tuple) for unpickling.\";\n\n/*\n\t 1) a Tuple giving the shape\n\t 2) a string giving the typestr (> or < indicates byte order\n\t if swap is possibly needed)\n\t 3) a Bool stating if Fortran or not\n\t 4) a binary string with the data (or a list if Object array) \n*/\n\nstatic intp _array_fill_strides(intp *, intp *, int, intp, int, int *);\n\nstatic PyObject *\narray_setstate(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *shape;\n\tPyArray_Typecode typecode;\n\tlong fortran;\n\tPyObject *rawdata;\n\tchar *datastr;\n\tconst char *typestr;\n\tint len, typestrlen;\n\tint swap;\n\tintp dimensions[MAX_DIMS];\n\tint nd;\n\t\n\t/* This will free any memory associated with a and\n\t use the string in setstate as the (writeable) memory.\n\t*/\n\tif (!PyArg_ParseTuple(args, \"(O!z#iO)\", &PyTuple_Type,\n\t\t\t &shape, &typestr, &typestrlen,\n\t\t\t &fortran, &rawdata))\n\t\treturn NULL;\n\n\tif (_array_typecode_fromstr((char *)typestr, &swap, &typecode) < 0)\n\t\treturn NULL;\n\n\tself->descr = PyArray_DescrFromType(typecode.type_num);\n\tself->itemsize = typecode.itemsize;\n\tnd = PyArray_IntpFromSequence(shape, dimensions, MAX_DIMS);\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (!PyList_Check(rawdata)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Object pickle not returning list\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tif (!PyString_Check(rawdata)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Pickle not returning string\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (PyString_AsStringAndSize(rawdata, &datastr, &len))\n\t\t\treturn NULL;\n\n\t\tif ((len != (self->itemsize *\t\t\t\t\\\n\t\t\t (int) PyArray_MultiplyList(dimensions, nd)))) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Buffer size does not\"\t\\\n\t\t\t\t\t\" match array size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n if ((self->flags & OWN_DATA)) {\n\t\tif (self->data != NULL)\n\t\t\tPyDataMem_FREE(self->data);\n\t\tself->flags &= ~OWN_DATA;\n }\n\tPy_XDECREF(self->base);\n\n\tself->flags &= ~UPDATEIFCOPY;\n\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t\tself->dimensions = NULL;\n\t}\n\n\tself->flags = DEFAULT_FLAGS;\n\n\tself->nd = nd;\n\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(nd * 2);\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dimensions, sizeof(intp)*nd);\n\t\t(void) _array_fill_strides(self->strides, dimensions, nd,\n\t\t\t\t\t self->itemsize, fortran, \n\t\t\t\t\t &(self->flags));\n\t}\n\n\tif (typecode.type_num != PyArray_OBJECT) {\n\t\tself->data = datastr;\n\t\tself->base = rawdata;\n\t\tPy_INCREF(self->base);\n\t}\n\telse {\n\t\tself->data = PyDataMem_NEW(PyArray_NBYTES(self));\n\t\tif (self->data == NULL) { \n\t\t\tself->nd = 0;\n\t\t\tself->data = PyDataMem_NEW(self->itemsize);\n\t\t\tif (self->dimensions) PyDimMem_FREE(self->dimensions);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\t\tself->base = NULL;\n\t\tif (_setobject_pkl(self, rawdata) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tPyArray_UpdateFlags(self, UPDATE_ALL_FLAGS);\n\n\tif (swap) self->flags &= ~NOTSWAPPED;\n\t\n\tPy_INCREF(Py_None);\n\treturn Py_None;\t\n}\n\nstatic int\nPyArray_Dump(PyObject *self, PyObject *file, int protocol)\n{\n\tPyObject *cpick=NULL;\n\tPyObject *ret;\n\tif (protocol < 0) protocol = 2;\n\n\tcpick = PyImport_ImportModule(\"cPickle\");\n\tif (cpick==NULL) return -1;\n\n\tif PyString_Check(file) {\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), \"rb\");\n\t\tif (file==NULL) return -1;\n\t}\n\telse Py_INCREF(file);\n\tret = PyObject_CallMethod(cpick, \"dump\", \"OOi\", self, \n\t\t\t\t file, protocol);\n\tPy_XDECREF(ret);\n\tPy_DECREF(file);\n\tPy_DECREF(cpick);\n\tif (PyErr_Occurred()) return -1;\n\treturn 0;\n}\n\nstatic PyObject *\nPyArray_Dumps(PyObject *self, int protocol)\n{\n\tPyObject *cpick=NULL;\n\tPyObject *ret;\n\tif (protocol < 0) protocol = 2;\n\n\tcpick = PyImport_ImportModule(\"cPickle\");\n\tif (cpick==NULL) return NULL;\n\tret = PyObject_CallMethod(cpick, \"dumps\", \"Oi\", self, protocol);\n\tPy_DECREF(cpick);\n\treturn ret;\n}\n\n\nstatic char doc_dump[] = \"m.dump(file)\";\n\nstatic PyObject *\narray_dump(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *file=NULL;\n\tint ret;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &file))\n\t\treturn NULL;\n\tret = PyArray_Dump((PyObject *)self, file, 2);\n\tif (ret < 0) return NULL;\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_dumps[] = \"m.dumps()\";\n\nstatic PyObject *\narray_dumps(PyArrayObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\"))\n\t\treturn NULL;\n\treturn PyArray_Dumps((PyObject *)self, 2);\n}\n\n\nstatic char doc_transpose[] = \"m.transpose()\";\n\nstatic PyObject *\narray_transpose(PyArrayObject *self, PyObject *args) \n{\n\tPyObject *shape=Py_None;\n\tint n;\n\n\tn = PyTuple_Size(args);\n\tif (n > 1) shape = args;\n\telse if (n == 1) shape = PyTuple_GET_ITEM(args, 0);\n\t\n\treturn _ARET(PyArray_Transpose(self, shape));\n}\n\nstatic char doc_mean[] = \"a.mean(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_mean(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist,\n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\n\treturn _ARET(PyArray_Mean(self, axis, rtype.type_num));\n}\n\nstatic char doc_sum[] = \"a.sum(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_sum(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\t\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_Sum(self, axis, rtype.type_num);\n}\n\n\nstatic char doc_cumsum[] = \"a.cumsum(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_cumsum(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_CumSum(self, axis, rtype.type_num);\n}\n\nstatic char doc_prod[] = \"a.prod(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_prod(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_Prod(self, axis, rtype.type_num);\n}\n\n\nstatic char doc_cumprod[] = \"a.cumprod(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_cumprod(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_CumProd(self, axis, rtype.type_num);\n}\n\n\nstatic char doc_any[] = \"a.any(axis=None)\";\n\nstatic PyObject *\narray_any(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Any(self, axis);\n}\n\nstatic char doc_all[] = \"a.all(axis=None)\";\n\nstatic PyObject *\narray_all(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_All(self, axis);\n}\n\n\nstatic char doc_stddev[] = \"a.std(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_stddev(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_Std(self, axis, rtype.type_num);\n}\n\nstatic char doc_compress[] = \"a.compress(condition=, axis=None)\";\n\nstatic PyObject *\narray_compress(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyObject *condition;\t\n\tstatic char *kwlist[] = {\"condition\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist, \n\t\t\t\t\t &condition, PyArray_AxisConverter,\n\t\t\t\t\t &axis)) return NULL;\n\n\treturn _ARET(PyArray_Compress(self, condition, axis));\n}\n\nstatic char doc_nonzero[] = \"a.nonzero() return a tuple of indices referencing\"\\\n\t\"the elements of a that are nonzero.\";\n\nstatic PyObject *\narray_nonzero(PyArrayObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n\treturn _ARET(PyArray_Nonzero(self));\n}\n\n\nstatic char doc_trace[] = \"a.trace(offset=0, axis1=0, axis2=1, rtype=None)\";\n\nstatic PyObject *\narray_trace(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis1=0, axis2=1, offset=0;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"offset\", \"axis1\", \"axis2\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|iiiO&\", kwlist, \n\t\t\t\t\t &offset, &axis1, &axis2,\n\t\t\t\t\t PyArray_TypecodeConverter, &rtype))\n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Trace(self, offset, axis1, axis2, rtype.type_num));\n}\n\n\nstatic char doc_clip[] = \"a.clip(min=, max=)\";\n\nstatic PyObject *\narray_clip(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *min, *max;\n\tstatic char *kwlist[] = {\"min\", \"max\", NULL};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO\", kwlist,\n\t\t\t\t\t &min, &max)) \n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Clip(self, min, max));\n}\n\nstatic char doc_conj[] = \"a.conj()\";\n\nstatic char doc_conjugate[] = \"a.conjugate()\";\n\nstatic PyObject *\narray_conjugate(PyArrayObject *self, PyObject *args) \n{\n\n\tif (!PyArg_ParseTuple(args, \"\")) return NULL;\n\t\n\treturn PyArray_Conjugate(self);\n}\n\n\nstatic char doc_diagonal[] = \"a.diagonal(offset=0, axis1=0, axis2=1)\";\n\nstatic PyObject *\narray_diagonal(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis1=0, axis2=1, offset=0;\n\tstatic char *kwlist[] = {\"offset\", \"axis1\", \"axis2\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|iii\", kwlist, \n\t\t\t\t\t &offset, &axis1, &axis2))\n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Diagonal(self, offset, axis1, axis2));\n}\n\nstatic char doc_flatten[] = \"a.flatten([fortran]) return a 1-d array (always copy)\";\n\nstatic PyObject *\narray_flatten(PyArrayObject *self, PyObject *args)\n{\n\tBool fortran=FALSE;\n\n\tif (!PyArg_ParseTuple(args, \"|O&\",\n\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\n\treturn PyArray_Flatten(self, (int) fortran);\n}\n\nstatic char doc_ravel[] = \"a.ravel([fortran]) return a 1-d array (copy only if needed)\";\n\nstatic PyObject *\narray_ravel(PyArrayObject *self, PyObject *args)\n{\n\tBool fortran=FALSE;\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter,\n\t\t\t &fortran)) return NULL;\n\n\treturn PyArray_Ravel(self, (int) fortran);\n}\n\n\n\nstatic char doc_setflags[] = \"a.setflags(write=None, swap=None, align=None, uic=None)\";\n\nstatic int _IsAligned(PyArrayObject *);\nstatic Bool _IsWriteable(PyArrayObject *);\n\nstatic PyObject *\narray_setflags(PyArrayObject *self, PyObject *args, PyObject *kwds)\n{\n\tstatic char *kwlist[] = {\"write\", \"swap\", \"align\", \"uic\", NULL};\n\tPyObject *write=Py_None;\n\tPyObject *swap=Py_None;\n\tPyObject *align=Py_None;\n\tPyObject *uic=Py_None;\n\tint flagback = self->flags;\n\t\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOOO\", kwlist,\n\t\t\t\t\t &write, &swap, &align, &uic))\n\t\treturn NULL;\n\n\tif (align != Py_None) {\n\t\tif (PyObject_Not(align)) self->flags &= ~ALIGNED;\n\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot set aligned flag of mis-\"\\\n\t\t\t\t\t\"aligned array to True\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif (uic != Py_None) {\n if (PyObject_IsTrue(uic)) {\n\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return NULL;\n }\n else {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n }\n \n if (write != Py_None) {\n if (PyObject_IsTrue(write)) \n\t\t\tif (_IsWriteable(self)) {\n\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself->flags = flagback;\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"cannot set WRITEABLE \"\t\\\n\t\t\t\t\t\t\"flag to True of this \"\t\\\n\t\t\t\t\t\t\"array.\");\t\t\\\n\t\t\t\treturn NULL;\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n \n if (swap != Py_None) {\n if (PyObject_IsTrue(swap))\n self->flags &= ~NOTSWAPPED;\n else \n self->flags |= NOTSWAPPED;\n }\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic PyMethodDef array_methods[] = {\n {\"tolist\",\t (PyCFunction)array_tolist,\t1, doc_tolist},\n {\"toscalar\", (PyCFunction)array_toscalar, METH_VARARGS, doc_toscalar},\n\t{\"tofile\", (PyCFunction)array_tofile, \n METH_VARARGS | METH_KEYWORDS, doc_tofile},\n {\"tostring\", (PyCFunction)array_tostring, METH_VARARGS, doc_tostring},\n {\"byteswap\", (PyCFunction)array_byteswap,\t1, doc_byteswap},\n {\"astype\", (PyCFunction)array_cast, 1, doc_cast},\n\t{\"getfield\", (PyCFunction)array_getfield, \n\t METH_VARARGS | METH_KEYWORDS, doc_getfield},\n {\"copy\", (PyCFunction)array_copy, 1, doc_copy}, \n {\"resize\", (PyCFunction)array_resize, 1, doc_resize}, \n\n\t/* for subtypes */\n\t{\"__array__\", (PyCFunction)array_getarray, 1, doc_array_getarray},\n\t{\"__array_wrap__\", (PyCFunction)array_wraparray, 1, doc_wraparray},\n\t/* default version so it is found... -- only used for subclasses */\n\t{\"__array_finalize__\", (PyCFunction)array_finalize, 1, NULL},\n\t\n\t\n\t/* for the copy module */\n {\"__copy__\", (PyCFunction)array_copy, 1, doc_copy},\t \n {\"__deepcopy__\", (PyCFunction)array_deepcopy, 1, doc_deepcopy}, \n\t\n /* for Pickling */\n {\"__reduce__\", (PyCFunction) array_reduce, 1, doc_reduce},\t\n\t{\"__setstate__\", (PyCFunction) array_setstate, 1, doc_setstate},\n\t{\"dumps\", (PyCFunction) array_dumps, 1, doc_dumps},\n\t{\"dump\", (PyCFunction) array_dump, 1, doc_dump},\n\n\t/* Extended methods added 2005 */\n\t{\"transpose\",\t(PyCFunction)array_transpose, \n\t METH_VARARGS, doc_transpose},\n\t{\"take\",\t(PyCFunction)array_take, \n\t METH_VARARGS|METH_KEYWORDS, doc_take},\n\t{\"put\",\t(PyCFunction)array_put, \n\t METH_VARARGS|METH_KEYWORDS, doc_put},\n\t{\"putmask\",\t(PyCFunction)array_putmask, \n\t METH_VARARGS|METH_KEYWORDS, doc_putmask},\n\t{\"repeat\",\t(PyCFunction)array_repeat, \n\t METH_VARARGS|METH_KEYWORDS, doc_repeat},\n\t{\"choose\",\t(PyCFunction)array_choose, \n\t METH_VARARGS, doc_choose},\t\n\t{\"sort\",\t(PyCFunction)array_sort, \n\t METH_VARARGS, doc_sort},\n\t{\"argsort\",\t(PyCFunction)array_argsort, \n\t METH_VARARGS, doc_argsort},\n\t{\"searchsorted\", (PyCFunction)array_searchsorted, \n\t METH_VARARGS, doc_searchsorted},\t\n\t{\"argmax\",\t(PyCFunction)array_argmax, \n\t METH_VARARGS, doc_argmax},\n\t{\"argmin\", (PyCFunction)array_argmin,\n\t METH_VARARGS, doc_argmin},\n\t{\"reshape\",\t(PyCFunction)array_reshape, \n\t METH_VARARGS, doc_reshape},\n\t{\"squeeze\",\t(PyCFunction)array_squeeze,\n\t METH_VARARGS, doc_squeeze},\n\t{\"view\", (PyCFunction)array_view, \n\t METH_VARARGS, doc_view},\n\t{\"swapaxes\", (PyCFunction)array_swapaxes,\n\t METH_VARARGS, doc_swapaxes},\n\t{\"max\", (PyCFunction)array_max,\n\t METH_VARARGS, doc_max},\n\t{\"min\", (PyCFunction)array_min,\n\t METH_VARARGS, doc_min},\n\t{\"ptp\", (PyCFunction)array_ptp,\n\t METH_VARARGS, doc_ptp},\n\t{\"mean\", (PyCFunction)array_mean,\n\t METH_VARARGS|METH_KEYWORDS, doc_mean},\n\t{\"trace\", (PyCFunction)array_trace,\n\t METH_VARARGS|METH_KEYWORDS, doc_trace},\n\t{\"diagonal\", (PyCFunction)array_diagonal,\n\t METH_VARARGS|METH_KEYWORDS, doc_diagonal},\n\t{\"clip\", (PyCFunction)array_clip,\n\t METH_VARARGS|METH_KEYWORDS, doc_clip},\n\t{\"conj\", (PyCFunction)array_conjugate,\n\t METH_VARARGS, doc_conj},\n\t{\"conjugate\", (PyCFunction)array_conjugate,\n\t METH_VARARGS, doc_conjugate},\n\t{\"nonzero\", (PyCFunction)array_nonzero,\n\t METH_VARARGS, doc_nonzero},\n\t{\"std\", (PyCFunction)array_stddev,\n\t METH_VARARGS|METH_KEYWORDS, doc_stddev},\n\t{\"sum\", (PyCFunction)array_sum,\n\t METH_VARARGS|METH_KEYWORDS, doc_sum},\n\t{\"cumsum\", (PyCFunction)array_cumsum,\n\t METH_VARARGS|METH_KEYWORDS, doc_cumsum},\n\t{\"prod\", (PyCFunction)array_prod,\n\t METH_VARARGS|METH_KEYWORDS, doc_prod},\n\t{\"cumprod\", (PyCFunction)array_cumprod,\n\t METH_VARARGS|METH_KEYWORDS, doc_cumprod},\n\t{\"all\", (PyCFunction)array_all,\n\t METH_VARARGS, doc_all},\n\t{\"any\", (PyCFunction)array_any,\n\t METH_VARARGS, doc_any},\n\t{\"compress\", (PyCFunction)array_compress,\n\t METH_VARARGS|METH_KEYWORDS, doc_compress},\n\t{\"flatten\", (PyCFunction)array_flatten,\n\t METH_VARARGS, doc_flatten},\n\t{\"ravel\", (PyCFunction)array_ravel,\n\t METH_VARARGS, doc_ravel},\n\t{\"setflags\", (PyCFunction)array_setflags,\n\t METH_VARARGS|METH_KEYWORDS, doc_setflags},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n#undef _ARET\n\n\n", "source_code_before": "\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\nstatic char doc_take[] = \"a.take(indices, axis=None). Selects the elements \"\\\n\t\"in indices from array a along the given axis.\";\n\nstatic PyObject *\narray_take(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint dimension=MAX_DIMS;\n\tPyObject *indices;\n\tstatic char *kwlist[] = {\"indices\", \"axis\", NULL};\n\t\n\tdimension=0;\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist, \n\t\t\t\t\t &indices, PyArray_AxisConverter,\n\t\t\t\t\t &dimension))\n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Take(self, indices, dimension));\n}\n\nstatic char doc_put[] = \"a.put(indices, values) sets a.flat[n] = v[n] \"\\\n\t\"for each n in indices. v can be scalar or shorter than indices, \"\\\n\t\"will repeat.\";\n\nstatic PyObject *\narray_put(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *indices, *values;\n\tstatic char *kwlist[] = {\"indices\", \"values\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO\", kwlist,\n\t\t\t\t\t &indices, &values))\n\t\treturn NULL;\n\treturn PyArray_Put(self, indices, values);\n}\n\nstatic char doc_putmask[] = \"a.putmask(mask, values) sets a.flat[n] = v[n] \"\\\n\t\"for each n where mask.flat[n] is TRUE. v can be scalar.\";\n\nstatic PyObject *\narray_putmask(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *mask, *values;\n\n\tstatic char *kwlist[] = {\"mask\", \"values\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO\", kwlist,\n\t\t\t\t\t &mask, &values))\n\t\treturn NULL;\n\treturn PyArray_PutMask(self, mask, values);\n}\n\n/* Used to reshape a Fortran Array */\nstatic void\n_reverse_shape(PyArray_Dims *newshape)\n{\n\tint i, n = newshape->len;\n\tintp *ptr = newshape->ptr;\n\tintp *eptr;\n\tintp tmp;\n\tint len = n >> 1;\n\n\teptr = ptr+n-1;\n\tfor(i=0; i) return a new view of array with same data.\";\n\nstatic PyObject *\narray_view(PyArrayObject *self, PyObject *args)\n{\n PyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tif (!PyArg_ParseTuple(args, \"|O&\",\n PyArray_TypecodeConverter, &type)) \n return NULL;\n\n\treturn _ARET(PyArray_View(self, &type));\n}\n\nstatic char doc_argmax[] = \"a.argmax(axis=None)\";\n\nstatic PyObject *\narray_argmax(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_ArgMax(self, axis));\n}\n\nstatic char doc_argmin[] = \"a.argmin(axis=None)\";\n\nstatic PyObject *\narray_argmin(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_ArgMin(self, axis));\n}\n\nstatic char doc_max[] = \"a.max(axis=None)\";\n\nstatic PyObject *\narray_max(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Max(self, axis);\n}\n\nstatic char doc_ptp[] = \"a.ptp(axis=None) a.max(axis)-a.min(axis)\";\n\nstatic PyObject *\narray_ptp(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Ptp(self, axis);\n}\n\n\nstatic char doc_min[] = \"a.min(axis=None)\";\n\nstatic PyObject *\narray_min(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Min(self, axis);\n}\n\n\nstatic char doc_swapaxes[] = \"a.swapaxes(axis1, axis2) returns new view with axes swapped.\";\n\nstatic PyObject *\narray_swapaxes(PyArrayObject *self, PyObject *args)\n{\n\tint axis1, axis2;\n\n\tif (!PyArg_ParseTuple(args, \"ii\", &axis1, &axis2)) return NULL;\n\n\treturn PyArray_SwapAxes(self, axis1, axis2);\n}\n\nstatic char doc_getfield[] = \"m.field(type, offset) returns a field \"\\\n\t\" of the given array as a certain type. A field is a view of \"\\\n\t\" the array's data with each itemsize determined by the given type\"\\\n\t\" and the offset into the current array items given.\";\n\nstatic PyObject *\nPyArray_GetField(PyArrayObject *self, PyArray_Typecode *type, \n\t\t\t\t int offset)\n{\n\tPyObject *ret=NULL;\n\tret = PyArray_New(self->ob_type, self->nd, self->dimensions,\n\t\t\t type->type_num, self->strides, \n\t\t\t self->data + offset,\n\t\t\t type->itemsize, self->flags, (PyObject *)self);\n\tif (ret == NULL) return NULL;\n\tPy_INCREF(self);\n\t((PyArrayObject *)ret)->base = (PyObject *)self;\n\tPyArray_UpdateFlags((PyArrayObject *)ret, UPDATE_ALL_FLAGS);\n\treturn ret;\t\n}\n\nstatic PyObject *\narray_getfield(PyArrayObject *self, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\tint offset = 0;\n\tstatic char *kwlist[] = {\"dtype\", \"offset\", 0};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|i\", kwlist,\n\t\t\t\t\t PyArray_TypecodeConverter, \n\t\t\t\t\t &typecode, &offset)) return NULL;\n\n\t\n\tif (typecode.itemsize > self->itemsize) {\n\t\tPyErr_SetString(PyExc_TypeError, \"Field itemsize must be <=\"\\\n\t\t\t\t\"array itemsize.\");\n\t\treturn NULL;\n\t}\n\treturn _ARET(PyArray_GetField(self, &typecode, offset));\n}\n\nstatic PyObject *\nPyArray_Byteswap(PyArrayObject *self, Bool inplace)\n{\n PyArrayObject *ret;\n\tintp size;\n\tPyArray_CopySwapNFunc *copyswapn;\n\tPyArrayIterObject *it;\n\n\tif (inplace) {\n\t\tcopyswapn = self->descr->copyswapn;\n\t\t\n\t\tsize = PyArray_SIZE(self);\n\t\tif (PyArray_ISONESEGMENT(self)) {\n\t\t\tcopyswapn(self->data, NULL, size, 1, self->itemsize);\n\t\t}\n\t\telse { /* Use iterator */\n\t\t\t\n\t\t\tit = (PyArrayIterObject *)\\\n\t\t\t\tPyArray_IterNew((PyObject *)self);\n\t\t\t\n\t\t\twhile (it->index < it->size) {\n\t\t\t\tcopyswapn(it->dataptr, NULL, 1, 1, \n\t\t\t\t\t self->itemsize);\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t}\n\t\t\tPy_DECREF(it);\n\t\t}\n\n\t\tif (self->flags & NOTSWAPPED) self->flags &= ~NOTSWAPPED;\n\t\telse self->flags |= NOTSWAPPED;\n\t\t\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\telse {\n\t\tif ((ret = (PyArrayObject *)PyArray_Copy(self)) == NULL) \n\t\t\treturn NULL;\n\t\t\n\t\tsize = PyArray_SIZE(self);\n\t\t\n\t\t/* set the NOTSWAPPED flag to opposite self */\n\t\t/* ret is always notswapped, \n\t\t PyArray_Copy has already swapped if self was swapped */\n\n\t\tif (self->flags & NOTSWAPPED) {\n\t\t\tret->descr->copyswapn(ret->data, NULL, size, 1, ret->itemsize);\n\t\t\tret->flags &= ~NOTSWAPPED;\n\t\t}\n\t\telse { /* self was swapped, so now ret isn't */\n\t\t\tret->flags |= NOTSWAPPED;\n\t\t}\n\t\t\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic char doc_byteswap[] = \"m.byteswap(False) Swap the bytes in\"\\\n\t\" the array. Return the byteswapped array. If the first argument\"\\\n\t\" is TRUE, byteswap in-place and return a reference to self.\";\n\nstatic PyObject *\narray_byteswap(PyArrayObject *self, PyObject *args) \n{\n\tBool inplace=FALSE;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter, &inplace))\n\t\treturn NULL;\n\t\n\treturn PyArray_Byteswap(self, inplace);\n}\n\nstatic char doc_tolist[] = \"m.tolist().\t Copy the data portion of the array\"\\\n\t\" to a hierarchical python list and return that list.\";\n\nstatic PyObject *\narray_tolist(PyArrayObject *self, PyObject *args) \n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n if (self->nd <= 0) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can't convert a 0d array to a list\");\n return NULL;\n }\n\t\n return PyArray_ToList(self);\n}\n\nstatic char doc_tostring[] = \"m.tostring() Construct a Python string \"\\\n \"containing the raw bytes in the array\";\n\nstatic PyObject *\narray_tostring(PyArrayObject *self, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n return PyArray_ToString(self);\n}\n\nstatic char doc_tofile[] = \"m.tofile(fid, sep=\"\") write the data to a file.\";\n\nstatic PyObject *\narray_tofile(PyArrayObject *self, PyObject *args, PyObject *kwds)\n{\n\tint ret;\n PyObject *file;\n\tFILE *fd;\n char *sep=\"\";\n\tchar *format=\"\";\n\tchar *mode;\n\tstatic char *kwlist[] = {\"file\", \"sep\", \"format\", NULL};\n \n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|ss\", kwlist, \n &file, &sep, &format)) return NULL;\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"wb\";\n\t\telse mode=\"w\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfd = PyFile_AsFile(file);\n\tif (fd == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be a \" \\\n\t\t\t\t\"string or open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_ToFile(self, fd, sep, format);\n\tPy_DECREF(file);\n\tif (ret < 0) return NULL;\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_toscalar[] = \"m.toscalar(). Copy the first data point of \"\\\n\t\"the array to a standard Python scalar and return it.\";\n\nstatic PyObject *\narray_toscalar(PyArrayObject *self, PyObject *args) {\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n return self->descr->getitem(self->data, self);\n}\n\nstatic char doc_cast[] = \"m.astype(t).\tCast array m to type t.\t \\n\\n\"\\\n\t\"t can be either a string representing a typecode, or a python type\"\\\n\t\" object of type int, float, or complex.\";\n\nstatic PyObject *\narray_cast(PyArrayObject *self, PyObject *args) \n{\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\t\n if (!PyArg_ParseTuple(args, \"O&\", PyArray_TypecodeConverter,\n\t\t\t &typecode)) return NULL;\n\n\tif (typecode.type_num == PyArray_NOTYPE ||\t\\\n\t typecode.type_num == PyArray_TYPE(self)) {\n\t\treturn _ARET(PyArray_Copy(self));\n\t}\n\treturn _ARET(PyArray_CastToType(self, &typecode));\n}\t \n\n/* default sub-type implementation */\n\nstatic char doc_wraparray[] = \"m.__array_wrap__(obj) returns an object of type m\"\\\n\t\" from the ndarray object obj\";\n\nstatic PyObject *\narray_wraparray(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *arr;\n\tPyObject *ret;\n\t\n\tif (PyTuple_Size(args) < 1) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"only accepts 1 argument.\");\n\t\treturn NULL;\n\t}\n\tarr = PyTuple_GET_ITEM(args, 0);\n\tif (!PyArray_Check(arr)) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"can only be called with ndarray object\");\n\t\treturn NULL;\n\t}\t\n\n\tret = PyArray_New(self->ob_type, PyArray_NDIM(arr),\n\t\t\t PyArray_DIMS(arr), PyArray_TYPE(arr),\n\t\t\t PyArray_STRIDES(arr), PyArray_DATA(arr),\n\t\t\t PyArray_ITEMSIZE(arr), \n\t\t\t PyArray_FLAGS(arr), NULL);\n\tif (ret == NULL) return NULL;\n\tPy_INCREF(arr);\n\tPyArray_BASE(ret) = arr;\n\treturn ret;\n}\n\n/* NO-OP --- just so all subclasses will have one by default. */\nstatic PyObject *\narray_finalize(PyArrayObject *self, PyObject *args)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\n\nstatic char doc_array_getarray[] = \"m.__array__(|type) just returns either a new reference to self if type is not given or a new array of type if type is different from the current type of the array.\";\n\nstatic PyObject *\narray_getarray(PyArrayObject *self, PyObject *args) \n{\n\tPyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_TYPE(self),\n\t\t\t\t PyArray_ITEMSIZE(self),\n\t\t\t\t 0};\n\tPyObject *ret;\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", &PyArray_TypecodeConverter,\n\t\t\t &newtype)) return NULL;\n\n\t/* convert to PyArray_Type or PyBigArray_Type */\n\tif (!PyArray_CheckExact(self) || !PyBigArray_CheckExact(self)) {\n\t\tPyObject *new;\n\t\tPyTypeObject *subtype = &PyArray_Type;\n\n\t\tif (!PyType_IsSubtype(self->ob_type, &PyArray_Type)) {\n\t\t\tsubtype = &PyBigArray_Type;\n\t\t}\n\t\t\n\t\tnew = PyArray_New(subtype, PyArray_NDIM(self),\n\t\t\t\t PyArray_DIMS(self), PyArray_TYPE(self),\n\t\t\t\t PyArray_STRIDES(self), PyArray_DATA(self),\n\t\t\t\t PyArray_ITEMSIZE(self), \n\t\t\t\t PyArray_FLAGS(self), NULL);\n\t\tif (new == NULL) return NULL;\n\t\tPy_INCREF(self);\n\t\tPyArray_BASE(new) = (PyObject *)self;\n\t\tself = (PyArrayObject *)new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t}\n\t\t\n\tif (newtype.type_num == PyArray_NOTYPE ||\n\t PyArray_EquivalentTypes(&oldtype, &newtype)) {\n\t\treturn (PyObject *)self;\n\t}\n\telse {\n\t\tret = PyArray_CastToType(self, &newtype);\n\t\tPy_DECREF(self);\n\t\treturn ret;\n\t}\n}\n\nstatic char doc_copy[] = \"m.copy(). Return a copy of the array.\";\n\nstatic PyObject *\narray_copy(PyArrayObject *self, PyObject *args) \n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\t\n return _ARET(PyArray_Copy(self));\n}\n\nstatic char doc_resize[] = \"self.resize(new_shape). \"\\\n\t\"Change size and shape of self inplace.\\n\"\\\n\t\"\\n Array must own its own memory and not be referenced by other \" \\\n\t\"arrays\\n Returns None.\";\n\nstatic PyObject *\narray_resize(PyArrayObject *self, PyObject *args) \n{\n PyArray_Dims newshape;\n PyObject *ret;\n\tint n;\n\t\n\tn = PyTuple_Size(args);\n\tif (n <= 1) {\n\t\tif (!PyArg_ParseTuple(args, \"O&\", PyArray_IntpConverter, \n\t\t\t\t &newshape)) return NULL;\n\t}\n else {\n\t\tif (!PyArray_IntpConverter(args, &newshape)) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\t\"invalid shape.\");\n\t\t\t} \n\t\t\treturn NULL;\t\t\t\n\t\t}\n\t}\n\tret = PyArray_Resize(self, &newshape);\n PyDimMem_FREE(newshape.ptr);\n\tPy_DECREF(ret);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_repeat[] = \"a.repeat(repeats=, axis=None)\";\n\nstatic PyObject *\narray_repeat(PyArrayObject *self, PyObject *args, PyObject *kwds) {\n\tPyObject *repeats;\n\tint axis=MAX_DIMS;\n\tstatic char *kwlist[] = {\"repeats\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist, \n\t\t\t\t\t &repeats, PyArray_AxisConverter,\n\t\t\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Repeat(self, repeats, axis);\n}\n\nstatic char doc_choose[] = \"a.choose(b1,b2,...)\";\n\nstatic PyObject *\narray_choose(PyArrayObject *self, PyObject *args) \n{\n\tPyObject *choices;\n\tint n;\n\t\n\tn = PyTuple_Size(args);\n\tif (n <= 1) {\n\t\tif (!PyArg_ParseTuple(args, \"O\", &choices))\n\t\t\treturn NULL;\n\t}\n else {\n\t\tchoices = args;\n\t}\n\t\n\treturn _ARET(PyArray_Choose(self, choices));\n}\n\nstatic char doc_sort[] = \"a.sort()\";\n\nstatic PyObject *\narray_sort(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_Sort(self, axis));\n}\n\nstatic char doc_argsort[] = \"a.argsort()\";\n\nstatic PyObject *\narray_argsort(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn _ARET(PyArray_ArgSort(self, axis));\n}\n\nstatic char doc_searchsorted[] = \"a.searchsorted(v)\";\n\nstatic PyObject *\narray_searchsorted(PyArrayObject *self, PyObject *args) \n{\n\tPyObject *values;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &values)) return NULL;\n\t\n\treturn _ARET(PyArray_SearchSorted(self, values));\n}\n\nstatic char doc_deepcopy[] = \"Used if copy.deepcopy is called on an array.\";\n\nstatic PyObject *\narray_deepcopy(PyArrayObject *self, PyObject *args) \n{\n PyObject* visit;\n PyObject **optr;\n PyArrayIterObject *it;\n PyObject *copy, *ret, *deepcopy, *temp, *res;\n\n if (!PyArg_ParseTuple(args, \"O\", &visit)) return NULL;\n ret = PyArray_Copy(self);\n if (PyArray_ISOBJECT(self)) {\n copy = PyImport_ImportModule(\"copy\");\n if (copy == NULL) return NULL;\n deepcopy = PyObject_GetAttrString(copy, \"deepcopy\");\n if (deepcopy == NULL) return NULL;\n Py_DECREF(copy);\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it == NULL) {Py_DECREF(deepcopy); return NULL;}\n optr = (PyObject **)PyArray_DATA(ret);\n while(it->index < it->size) {\n temp = *((PyObject **)it->dataptr);\n Py_INCREF(temp);\n /* call deepcopy on this argument */\n res = PyObject_CallFunctionObjArgs(deepcopy, \n temp, visit, NULL);\n Py_DECREF(temp);\n Py_DECREF(*optr);\n *optr++ = res;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(deepcopy);\n Py_DECREF(it);\n }\n return _ARET(ret);\n}\n\n/* Convert Object Array to flat list and pickle the flat list string */\nstatic PyObject *\n_getobject_pkl(PyArrayObject *self)\n{\n\tPyObject *theobject;\n\tPyArrayIterObject *iter=NULL;\n\tPyObject *list;\n\n\t\n\titer = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (iter == NULL) return NULL;\n\tlist = PyList_New(iter->size);\n\tif (list == NULL) {Py_DECREF(iter); return NULL;}\n\twhile (iter->index < iter->size) {\n\t\ttheobject = *((PyObject **)iter->dataptr);\n\t\tPy_INCREF(theobject);\n\t\tPyList_SET_ITEM(list, (int) iter->index, theobject);\n\t\tPyArray_ITER_NEXT(iter);\n\t}\n\tPy_DECREF(iter);\n\treturn list;\n}\n\nstatic int\n_setobject_pkl(PyArrayObject *self, PyObject *list)\n{\n\tPyObject *theobject;\n\tPyArrayIterObject *iter=NULL;\n\tint size;\n\n\tsize = self->itemsize;\n\t\n\titer = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (iter == NULL) return -1;\n\twhile(iter->index < iter->size) {\n\t\ttheobject = PyList_GET_ITEM(list,(int) iter->index);\n\t\tPy_INCREF(theobject);\n\t\t*((PyObject **)iter->dataptr) = theobject;\n\t\tPyArray_ITER_NEXT(iter);\n\t}\n\tPy_XDECREF(iter);\n\treturn 0;\n}\n\n\nstatic char doc_reduce[] = \"a.__reduce__() for pickling.\";\n\nstatic PyObject *\narray_reduce(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *ret=NULL, *state=NULL, *obj=NULL, *mod=NULL;\n\tPyObject *Bool, *thestr=NULL;\n\n\t/* Return a tuple of (callable object, arguments, object's state) */\n\t/* We will put everything in the object's state, so that on UnPickle\n\t it can use the string object as memory without a copy */\n\n\tret = PyTuple_New(3);\n\tif (ret == NULL) return NULL;\n\tmod = PyImport_ImportModule(\"scipy.base.multiarray\");\n\tif (mod == NULL) return NULL;\n\tobj = PyObject_GetAttrString(mod, \"empty\");\n\tPy_DECREF(mod);\n\tif (obj == NULL) return NULL;\n\tPyTuple_SET_ITEM(ret, 0, obj);\n\tPyTuple_SET_ITEM(ret, 1, \n\t\t\t Py_BuildValue(\"NNN\",\n\t\t\t\t Py_BuildValue(\"(N)\",\n\t\t\t\t\t\t PyInt_FromLong(0)),\n\t\t\t\t PyObject_GetAttrString((PyObject *)self,\n\t\t\t\t\t\t\t \"dtypechar\"),\n\t\t\t\t PyInt_FromLong((long) 0)));\n\t\n\t/* Now fill in object's state. This is a tuple with \n\t 4 arguments\n\n\t 1) a Tuple giving the shape\n\t 2) a string giving the typestr (> or < indicates byte order\n\t if swap is possibly needed)\n\t 3) a Bool stating if Fortran or not\n\t 4) a binary string with the data (or a list for Object arrays)\n\n\t Notice because Python does not describe a mechanism to write \n\t raw data to the pickle, this performs a copy to a string first\n\t*/\n\n\tstate = PyTuple_New(4);\n\tif (state == NULL) {\n\t\tPy_DECREF(ret); return NULL;\n\t}\n\tPyTuple_SET_ITEM(state, 0, PyObject_GetAttrString((PyObject *)self, \n\t\t\t\t\t\t\t \"shape\"));\t\n\tPyTuple_SET_ITEM(state, 1, PyObject_GetAttrString((PyObject *)self, \n\t\t\t\t\t\t\t \"dtypestr\"));\n\tBool = (PyArray_ISFORTRAN(self) ? Py_True : Py_False);\n\tPy_INCREF(Bool);\n\tPyTuple_SET_ITEM(state, 2, Bool);\n\tif (PyArray_ISOBJECT(self)) {\n\t\tthestr = _getobject_pkl(self);\n\t}\n\telse {\n thestr = PyArray_ToString(self);\n\t}\n\tif (thestr == NULL) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(state);\n\t\treturn NULL;\n\t}\n\tPyTuple_SET_ITEM(state, 3, thestr);\n\tPyTuple_SET_ITEM(ret, 2, state);\n\treturn ret;\n}\n\nstatic char doc_setstate[] = \"a.__setstate__(tuple) for unpickling.\";\n\n/*\n\t 1) a Tuple giving the shape\n\t 2) a string giving the typestr (> or < indicates byte order\n\t if swap is possibly needed)\n\t 3) a Bool stating if Fortran or not\n\t 4) a binary string with the data (or a list if Object array) \n*/\n\nstatic intp _array_fill_strides(intp *, intp *, int, intp, int, int *);\n\nstatic PyObject *\narray_setstate(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *shape;\n\tPyArray_Typecode typecode;\n\tlong fortran;\n\tPyObject *rawdata;\n\tchar *datastr;\n\tconst char *typestr;\n\tint len, typestrlen;\n\tint swap;\n\tintp dimensions[MAX_DIMS];\n\tint nd;\n\t\n\t/* This will free any memory associated with a and\n\t use the string in setstate as the (writeable) memory.\n\t*/\n\tif (!PyArg_ParseTuple(args, \"(O!z#iO)\", &PyTuple_Type,\n\t\t\t &shape, &typestr, &typestrlen,\n\t\t\t &fortran, &rawdata))\n\t\treturn NULL;\n\n\tif (_array_typecode_fromstr((char *)typestr, &swap, &typecode) < 0)\n\t\treturn NULL;\n\n\tself->descr = PyArray_DescrFromType(typecode.type_num);\n\tself->itemsize = typecode.itemsize;\n\tnd = PyArray_IntpFromSequence(shape, dimensions, MAX_DIMS);\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (!PyList_Check(rawdata)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Object pickle not returning list\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tif (!PyString_Check(rawdata)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Pickle not returning string\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (PyString_AsStringAndSize(rawdata, &datastr, &len))\n\t\t\treturn NULL;\n\n\t\tif ((len != (self->itemsize *\t\t\t\t\\\n\t\t\t (int) PyArray_MultiplyList(dimensions, nd)))) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Buffer size does not\"\t\\\n\t\t\t\t\t\" match array size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n if ((self->flags & OWN_DATA)) {\n\t\tif (self->data != NULL)\n\t\t\tPyDataMem_FREE(self->data);\n\t\tself->flags &= ~OWN_DATA;\n }\n\tPy_XDECREF(self->base);\n\n\tself->flags &= ~UPDATEIFCOPY;\n\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t\tself->dimensions = NULL;\n\t}\n\n\tself->flags = DEFAULT_FLAGS;\n\n\tself->nd = nd;\n\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(nd * 2);\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dimensions, sizeof(intp)*nd);\n\t\t(void) _array_fill_strides(self->strides, dimensions, nd,\n\t\t\t\t\t self->itemsize, fortran, \n\t\t\t\t\t &(self->flags));\n\t}\n\n\tif (typecode.type_num != PyArray_OBJECT) {\n\t\tself->data = datastr;\n\t\tself->base = rawdata;\n\t\tPy_INCREF(self->base);\n\t}\n\telse {\n\t\tself->data = PyDataMem_NEW(PyArray_NBYTES(self));\n\t\tif (self->data == NULL) { \n\t\t\tself->nd = 0;\n\t\t\tself->data = PyDataMem_NEW(self->itemsize);\n\t\t\tif (self->dimensions) PyDimMem_FREE(self->dimensions);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\t\tself->base = NULL;\n\t\tif (_setobject_pkl(self, rawdata) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tPyArray_UpdateFlags(self, UPDATE_ALL_FLAGS);\n\n\tif (swap) self->flags &= ~NOTSWAPPED;\n\t\n\tPy_INCREF(Py_None);\n\treturn Py_None;\t\n}\n\nstatic int\nPyArray_Dump(PyObject *self, PyObject *file, int protocol)\n{\n\tPyObject *cpick=NULL;\n\tPyObject *ret;\n\tif (protocol < 0) protocol = 2;\n\n\tcpick = PyImport_ImportModule(\"cPickle\");\n\tif (cpick==NULL) return -1;\n\n\tif PyString_Check(file) {\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), \"rb\");\n\t\tif (file==NULL) return -1;\n\t}\n\telse Py_INCREF(file);\n\tret = PyObject_CallMethod(cpick, \"dump\", \"OOi\", self, \n\t\t\t\t file, protocol);\n\tPy_XDECREF(ret);\n\tPy_DECREF(file);\n\tPy_DECREF(cpick);\n\tif (PyErr_Occurred()) return -1;\n\treturn 0;\n}\n\nstatic PyObject *\nPyArray_Dumps(PyObject *self, int protocol)\n{\n\tPyObject *cpick=NULL;\n\tPyObject *ret;\n\tif (protocol < 0) protocol = 2;\n\n\tcpick = PyImport_ImportModule(\"cPickle\");\n\tif (cpick==NULL) return NULL;\n\tret = PyObject_CallMethod(cpick, \"dumps\", \"Oi\", self, protocol);\n\tPy_DECREF(cpick);\n\treturn ret;\n}\n\n\nstatic char doc_dump[] = \"m.dump(file)\";\n\nstatic PyObject *\narray_dump(PyArrayObject *self, PyObject *args)\n{\n\tPyObject *file=NULL;\n\tint ret;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &file))\n\t\treturn NULL;\n\tret = PyArray_Dump((PyObject *)self, file, 2);\n\tif (ret < 0) return NULL;\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_dumps[] = \"m.dumps()\";\n\nstatic PyObject *\narray_dumps(PyArrayObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\"))\n\t\treturn NULL;\n\treturn PyArray_Dumps((PyObject *)self, 2);\n}\n\n\nstatic char doc_transpose[] = \"m.transpose()\";\n\nstatic PyObject *\narray_transpose(PyArrayObject *self, PyObject *args) \n{\n\tPyObject *shape=Py_None;\n\tint n;\n\n\tn = PyTuple_Size(args);\n\tif (n > 1) shape = args;\n\telse if (n == 1) shape = PyTuple_GET_ITEM(args, 0);\n\t\n\treturn _ARET(PyArray_Transpose(self, shape));\n}\n\nstatic char doc_mean[] = \"a.mean(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_mean(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist,\n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\n\treturn _ARET(PyArray_Mean(self, axis, rtype.type_num));\n}\n\nstatic char doc_sum[] = \"a.sum(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_sum(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\t\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_Sum(self, axis, rtype.type_num);\n}\n\n\nstatic char doc_cumsum[] = \"a.cumsum(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_cumsum(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_CumSum(self, axis, rtype.type_num);\n}\n\nstatic char doc_prod[] = \"a.prod(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_prod(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_Prod(self, axis, rtype.type_num);\n}\n\n\nstatic char doc_cumprod[] = \"a.cumprod(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_cumprod(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_CumProd(self, axis, rtype.type_num);\n}\n\n\nstatic char doc_any[] = \"a.any(axis=None)\";\n\nstatic PyObject *\narray_any(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_Any(self, axis);\n}\n\nstatic char doc_all[] = \"a.all(axis=None)\";\n\nstatic PyObject *\narray_all(PyArrayObject *self, PyObject *args) \n{\n\tint axis=MAX_DIMS;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_AxisConverter, \n\t\t\t &axis)) return NULL;\n\t\n\treturn PyArray_All(self, axis);\n}\n\n\nstatic char doc_stddev[] = \"a.std(axis=None, rtype=None)\";\n\nstatic PyObject *\narray_stddev(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"axis\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&O&\", kwlist, \n\t\t\t\t\t PyArray_AxisConverter, \n\t\t\t\t\t &axis, PyArray_TypecodeConverter,\n\t\t\t\t\t &rtype)) return NULL;\n\t\n\treturn PyArray_Std(self, axis, rtype.type_num);\n}\n\nstatic char doc_compress[] = \"a.compress(condition=, axis=None)\";\n\nstatic PyObject *\narray_compress(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis=MAX_DIMS;\n\tPyObject *condition;\t\n\tstatic char *kwlist[] = {\"condition\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist, \n\t\t\t\t\t &condition, PyArray_AxisConverter,\n\t\t\t\t\t &axis)) return NULL;\n\n\treturn _ARET(PyArray_Compress(self, condition, axis));\n}\n\nstatic char doc_nonzero[] = \"a.nonzero() return a tuple of indices referencing\"\\\n\t\"the elements of a that are nonzero.\";\n\nstatic PyObject *\narray_nonzero(PyArrayObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n\treturn _ARET(PyArray_Nonzero(self));\n}\n\n\nstatic char doc_trace[] = \"a.trace(offset=0, axis1=0, axis2=1, rtype=None)\";\n\nstatic PyObject *\narray_trace(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis1=0, axis2=1, offset=0;\n\tPyArray_Typecode rtype = {PyArray_NOTYPE, 0, 0};\n\tstatic char *kwlist[] = {\"offset\", \"axis1\", \"axis2\", \"rtype\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|iiiO&\", kwlist, \n\t\t\t\t\t &offset, &axis1, &axis2,\n\t\t\t\t\t PyArray_TypecodeConverter, &rtype))\n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Trace(self, offset, axis1, axis2, rtype.type_num));\n}\n\n\nstatic char doc_clip[] = \"a.clip(min=, max=)\";\n\nstatic PyObject *\narray_clip(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *min, *max;\n\tstatic char *kwlist[] = {\"min\", \"max\", NULL};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO\", kwlist,\n\t\t\t\t\t &min, &max)) \n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Clip(self, min, max));\n}\n\nstatic char doc_conj[] = \"a.conj()\";\n\nstatic char doc_conjugate[] = \"a.conjugate()\";\n\nstatic PyObject *\narray_conjugate(PyArrayObject *self, PyObject *args) \n{\n\n\tif (!PyArg_ParseTuple(args, \"\")) return NULL;\n\t\n\treturn PyArray_Conjugate(self);\n}\n\n\nstatic char doc_diagonal[] = \"a.diagonal(offset=0, axis1=0, axis2=1)\";\n\nstatic PyObject *\narray_diagonal(PyArrayObject *self, PyObject *args, PyObject *kwds) \n{\n\tint axis1=0, axis2=1, offset=0;\n\tstatic char *kwlist[] = {\"offset\", \"axis1\", \"axis2\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|iii\", kwlist, \n\t\t\t\t\t &offset, &axis1, &axis2))\n\t\treturn NULL;\n\t\n\treturn _ARET(PyArray_Diagonal(self, offset, axis1, axis2));\n}\n\nstatic char doc_flatten[] = \"a.flatten([fortran]) return a 1-d array (always copy)\";\n\nstatic PyObject *\narray_flatten(PyArrayObject *self, PyObject *args)\n{\n\tBool fortran=FALSE;\n\n\tif (!PyArg_ParseTuple(args, \"|O&\",\n\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\n\treturn PyArray_Flatten(self, (int) fortran);\n}\n\nstatic char doc_ravel[] = \"a.ravel([fortran]) return a 1-d array (copy only if needed)\";\n\nstatic PyObject *\narray_ravel(PyArrayObject *self, PyObject *args)\n{\n\tBool fortran=FALSE;\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter,\n\t\t\t &fortran)) return NULL;\n\n\treturn PyArray_Ravel(self, (int) fortran);\n}\n\n\n\nstatic char doc_setflags[] = \"a.setflags(write=None, swap=None, align=None, uic=None)\";\n\nstatic int _IsAligned(PyArrayObject *);\nstatic Bool _IsWriteable(PyArrayObject *);\n\nstatic PyObject *\narray_setflags(PyArrayObject *self, PyObject *args, PyObject *kwds)\n{\n\tstatic char *kwlist[] = {\"write\", \"swap\", \"align\", \"uic\", NULL};\n\tPyObject *write=Py_None;\n\tPyObject *swap=Py_None;\n\tPyObject *align=Py_None;\n\tPyObject *uic=Py_None;\n\tint flagback = self->flags;\n\t\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"|OOOO\", kwlist,\n\t\t\t\t\t &write, &swap, &align, &uic))\n\t\treturn NULL;\n\n\tif (align != Py_None) {\n\t\tif (PyObject_Not(align)) self->flags &= ~ALIGNED;\n\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot set aligned flag of mis-\"\\\n\t\t\t\t\t\"aligned array to True\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif (uic != Py_None) {\n if (PyObject_IsTrue(uic)) {\n\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return NULL;\n }\n else {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n }\n \n if (write != Py_None) {\n if (PyObject_IsTrue(write)) \n\t\t\tif (_IsWriteable(self)) {\n\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tself->flags = flagback;\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"cannot set WRITEABLE \"\t\\\n\t\t\t\t\t\t\"flag to True of this \"\t\\\n\t\t\t\t\t\t\"array.\");\t\t\\\n\t\t\t\treturn NULL;\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n \n if (swap != Py_None) {\n if (PyObject_IsTrue(swap))\n self->flags &= ~NOTSWAPPED;\n else \n self->flags |= NOTSWAPPED;\n }\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic PyMethodDef array_methods[] = {\n {\"tolist\",\t (PyCFunction)array_tolist,\t1, doc_tolist},\n {\"toscalar\", (PyCFunction)array_toscalar, METH_VARARGS, doc_toscalar},\n\t{\"tofile\", (PyCFunction)array_tofile, \n METH_VARARGS | METH_KEYWORDS, doc_tofile},\n {\"tostring\", (PyCFunction)array_tostring, METH_VARARGS, doc_tostring},\n {\"byteswap\", (PyCFunction)array_byteswap,\t1, doc_byteswap},\n {\"astype\", (PyCFunction)array_cast, 1, doc_cast},\n\t{\"getfield\", (PyCFunction)array_getfield, \n\t METH_VARARGS | METH_KEYWORDS, doc_getfield},\n {\"copy\", (PyCFunction)array_copy, 1, doc_copy}, \n {\"resize\", (PyCFunction)array_resize, 1, doc_resize}, \n\n\t/* for subtypes */\n\t{\"__array__\", (PyCFunction)array_getarray, 1, doc_array_getarray},\n\t{\"__array_wrap__\", (PyCFunction)array_wraparray, 1, doc_wraparray},\n\t/* default version so it is found... -- only used for subclasses */\n\t{\"__array_finalize__\", (PyCFunction)array_finalize, 1, NULL},\n\t\n\t\n\t/* for the copy module */\n {\"__copy__\", (PyCFunction)array_copy, 1, doc_copy},\t \n {\"__deepcopy__\", (PyCFunction)array_deepcopy, 1, doc_deepcopy}, \n\t\n /* for Pickling */\n {\"__reduce__\", (PyCFunction) array_reduce, 1, doc_reduce},\t\n\t{\"__setstate__\", (PyCFunction) array_setstate, 1, doc_setstate},\n\t{\"dumps\", (PyCFunction) array_dumps, 1, doc_dumps},\n\t{\"dump\", (PyCFunction) array_dump, 1, doc_dump},\n\n\t/* Extended methods added 2005 */\n\t{\"transpose\",\t(PyCFunction)array_transpose, \n\t METH_VARARGS, doc_transpose},\n\t{\"take\",\t(PyCFunction)array_take, \n\t METH_VARARGS|METH_KEYWORDS, doc_take},\n\t{\"put\",\t(PyCFunction)array_put, \n\t METH_VARARGS|METH_KEYWORDS, doc_put},\n\t{\"putmask\",\t(PyCFunction)array_putmask, \n\t METH_VARARGS|METH_KEYWORDS, doc_putmask},\n\t{\"repeat\",\t(PyCFunction)array_repeat, \n\t METH_VARARGS|METH_KEYWORDS, doc_repeat},\n\t{\"choose\",\t(PyCFunction)array_choose, \n\t METH_VARARGS, doc_choose},\t\n\t{\"sort\",\t(PyCFunction)array_sort, \n\t METH_VARARGS, doc_sort},\n\t{\"argsort\",\t(PyCFunction)array_argsort, \n\t METH_VARARGS, doc_argsort},\n\t{\"searchsorted\", (PyCFunction)array_searchsorted, \n\t METH_VARARGS, doc_searchsorted},\t\n\t{\"argmax\",\t(PyCFunction)array_argmax, \n\t METH_VARARGS, doc_argmax},\n\t{\"argmin\", (PyCFunction)array_argmin,\n\t METH_VARARGS, doc_argmin},\n\t{\"reshape\",\t(PyCFunction)array_reshape, \n\t METH_VARARGS, doc_reshape},\n\t{\"squeeze\",\t(PyCFunction)array_squeeze,\n\t METH_VARARGS, doc_squeeze},\n\t{\"view\", (PyCFunction)array_view, \n\t METH_VARARGS, doc_view},\n\t{\"swapaxes\", (PyCFunction)array_swapaxes,\n\t METH_VARARGS, doc_swapaxes},\n\t{\"max\", (PyCFunction)array_max,\n\t METH_VARARGS, doc_max},\n\t{\"min\", (PyCFunction)array_min,\n\t METH_VARARGS, doc_min},\n\t{\"ptp\", (PyCFunction)array_ptp,\n\t METH_VARARGS, doc_ptp},\n\t{\"mean\", (PyCFunction)array_mean,\n\t METH_VARARGS|METH_KEYWORDS, doc_mean},\n\t{\"trace\", (PyCFunction)array_trace,\n\t METH_VARARGS|METH_KEYWORDS, doc_trace},\n\t{\"diagonal\", (PyCFunction)array_diagonal,\n\t METH_VARARGS|METH_KEYWORDS, doc_diagonal},\n\t{\"clip\", (PyCFunction)array_clip,\n\t METH_VARARGS|METH_KEYWORDS, doc_clip},\n\t{\"conj\", (PyCFunction)array_conjugate,\n\t METH_VARARGS, doc_conj},\n\t{\"conjugate\", (PyCFunction)array_conjugate,\n\t METH_VARARGS, doc_conjugate},\n\t{\"nonzero\", (PyCFunction)array_nonzero,\n\t METH_VARARGS, doc_nonzero},\n\t{\"std\", (PyCFunction)array_stddev,\n\t METH_VARARGS|METH_KEYWORDS, doc_stddev},\n\t{\"sum\", (PyCFunction)array_sum,\n\t METH_VARARGS|METH_KEYWORDS, doc_sum},\n\t{\"cumsum\", (PyCFunction)array_cumsum,\n\t METH_VARARGS|METH_KEYWORDS, doc_cumsum},\n\t{\"prod\", (PyCFunction)array_prod,\n\t METH_VARARGS|METH_KEYWORDS, doc_prod},\n\t{\"cumprod\", (PyCFunction)array_cumprod,\n\t METH_VARARGS|METH_KEYWORDS, doc_cumprod},\n\t{\"all\", (PyCFunction)array_all,\n\t METH_VARARGS, doc_all},\n\t{\"any\", (PyCFunction)array_any,\n\t METH_VARARGS, doc_any},\n\t{\"compress\", (PyCFunction)array_compress,\n\t METH_VARARGS|METH_KEYWORDS, doc_compress},\n\t{\"flatten\", (PyCFunction)array_flatten,\n\t METH_VARARGS, doc_flatten},\n\t{\"ravel\", (PyCFunction)array_ravel,\n\t METH_VARARGS, doc_ravel},\n\t{\"setflags\", (PyCFunction)array_setflags,\n\t METH_VARARGS|METH_KEYWORDS, doc_setflags},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n#undef _ARET\n\n\n", "methods": [ { "name": "array_take", "long_name": "array_take( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 12, "complexity": 2, "token_count": 82, "parameters": [ "self", "args", "kwds" ], "start_line": 7, "end_line": 20, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "array_put", "long_name": "array_put( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 71, "parameters": [ "self", "args", "kwds" ], "start_line": 27, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_putmask", "long_name": "array_putmask( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 71, "parameters": [ "self", "args", "kwds" ], "start_line": 42, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "_reverse_shape", "long_name": "_reverse_shape( PyArray_Dims * newshape)", "filename": "arraymethods.c", "nloc": 14, "complexity": 2, "token_count": 81, "parameters": [ "newshape" ], "start_line": 56, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_reshape", "long_name": "array_reshape( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 47, "complexity": 13, "token_count": 290, "parameters": [ "self", "args" ], "start_line": 78, "end_line": 127, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "array_squeeze", "long_name": "array_squeeze( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 34, "parameters": [ "self", "args" ], "start_line": 132, "end_line": 136, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_view", "long_name": "array_view( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 8, "complexity": 2, "token_count": 53, "parameters": [ "self", "args" ], "start_line": 143, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_argmax", "long_name": "array_argmax( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 156, "end_line": 164, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_argmin", "long_name": "array_argmin( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 169, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_max", "long_name": "array_max( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 182, "end_line": 190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_ptp", "long_name": "array_ptp( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 195, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_min", "long_name": "array_min( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 209, "end_line": 217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_swapaxes", "long_name": "array_swapaxes( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 6, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 223, "end_line": 230, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_GetField", "long_name": "PyArray_GetField( PyArrayObject * self , PyArray_Typecode * type , int offset)", "filename": "arraymethods.c", "nloc": 14, "complexity": 2, "token_count": 110, "parameters": [ "self", "type", "offset" ], "start_line": 238, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "array_getfield", "long_name": "array_getfield( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 15, "complexity": 3, "token_count": 110, "parameters": [ "self", "args", "kwds" ], "start_line": 254, "end_line": 271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Byteswap", "long_name": "PyArray_Byteswap( PyArrayObject * self , Bool inplace)", "filename": "arraymethods.c", "nloc": 41, "complexity": 7, "token_count": 247, "parameters": [ "self", "inplace" ], "start_line": 274, "end_line": 327, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "array_byteswap", "long_name": "array_byteswap( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 334, "end_line": 342, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_tolist", "long_name": "array_tolist( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 10, "complexity": 3, "token_count": 51, "parameters": [ "self", "args" ], "start_line": 348, "end_line": 358, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_tostring", "long_name": "array_tostring( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 31, "parameters": [ "self", "args" ], "start_line": 364, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_tofile", "long_name": "array_tofile( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 33, "complexity": 7, "token_count": 206, "parameters": [ "self", "args", "kwds" ], "start_line": 373, "end_line": 407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_toscalar", "long_name": "array_toscalar( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 4, "complexity": 2, "token_count": 39, "parameters": [ "self", "args" ], "start_line": 413, "end_line": 416, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_cast", "long_name": "array_cast( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 11, "complexity": 4, "token_count": 82, "parameters": [ "self", "args" ], "start_line": 423, "end_line": 435, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_wraparray", "long_name": "array_wraparray( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 25, "complexity": 4, "token_count": 144, "parameters": [ "self", "args" ], "start_line": 443, "end_line": 469, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_finalize", "long_name": "array_finalize( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 1, "token_count": 20, "parameters": [ "self", "args" ], "start_line": 473, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_getarray", "long_name": "array_getarray( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 38, "complexity": 8, "token_count": 242, "parameters": [ "self", "args" ], "start_line": 483, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "array_copy", "long_name": "array_copy( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 34, "parameters": [ "self", "args" ], "start_line": 531, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "array_resize", "long_name": "array_resize( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 25, "complexity": 5, "token_count": 120, "parameters": [ "self", "args" ], "start_line": 544, "end_line": 569, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_repeat", "long_name": "array_repeat( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 75, "parameters": [ "self", "args", "kwds" ], "start_line": 577, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_choose", "long_name": "array_choose( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 14, "complexity": 3, "token_count": 68, "parameters": [ "self", "args" ], "start_line": 597, "end_line": 612, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_sort", "long_name": "array_sort( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 617, "end_line": 625, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_argsort", "long_name": "array_argsort( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 633, "end_line": 641, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_searchsorted", "long_name": "array_searchsorted( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 653, "end_line": 660, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_deepcopy", "long_name": "array_deepcopy( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 32, "complexity": 7, "token_count": 234, "parameters": [ "self", "args" ], "start_line": 665, "end_line": 698, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "_getobject_pkl", "long_name": "_getobject_pkl( PyArrayObject * self)", "filename": "arraymethods.c", "nloc": 18, "complexity": 4, "token_count": 128, "parameters": [ "self" ], "start_line": 702, "end_line": 721, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "_setobject_pkl", "long_name": "_setobject_pkl( PyArrayObject * self , PyObject * list)", "filename": "arraymethods.c", "nloc": 17, "complexity": 3, "token_count": 113, "parameters": [ "self", "list" ], "start_line": 724, "end_line": 742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_reduce", "long_name": "array_reduce( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 45, "complexity": 8, "token_count": 301, "parameters": [ "self", "args" ], "start_line": 748, "end_line": 811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_setstate", "long_name": "array_setstate( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 88, "complexity": 17, "token_count": 534, "parameters": [ "self", "args" ], "start_line": 826, "end_line": 931, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_Dump", "long_name": "PyArray_Dump( PyObject * self , PyObject * file , int protocol)", "filename": "arraymethods.c", "nloc": 20, "complexity": 6, "token_count": 132, "parameters": [ "self", "file", "protocol" ], "start_line": 934, "end_line": 955, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Dumps", "long_name": "PyArray_Dumps( PyObject * self , int protocol)", "filename": "arraymethods.c", "nloc": 11, "complexity": 3, "token_count": 70, "parameters": [ "self", "protocol" ], "start_line": 958, "end_line": 969, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_dump", "long_name": "array_dump( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 11, "complexity": 3, "token_count": 69, "parameters": [ "self", "args" ], "start_line": 975, "end_line": 986, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_dumps", "long_name": "array_dumps( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 6, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 991, "end_line": 996, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "array_transpose", "long_name": "array_transpose( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "args" ], "start_line": 1002, "end_line": 1012, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_mean", "long_name": "array_mean( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 89, "parameters": [ "self", "args", "kwds" ], "start_line": 1017, "end_line": 1029, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_sum", "long_name": "array_sum( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1034, "end_line": 1046, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_cumsum", "long_name": "array_cumsum( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1052, "end_line": 1064, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_prod", "long_name": "array_prod( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1069, "end_line": 1081, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_cumprod", "long_name": "array_cumprod( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1087, "end_line": 1099, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_any", "long_name": "array_any( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 1105, "end_line": 1113, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_all", "long_name": "array_all( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 1118, "end_line": 1126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_stddev", "long_name": "array_stddev( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1132, "end_line": 1144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_compress", "long_name": "array_compress( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 10, "complexity": 2, "token_count": 78, "parameters": [ "self", "args", "kwds" ], "start_line": 1149, "end_line": 1160, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_nonzero", "long_name": "array_nonzero( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 34, "parameters": [ "self", "args" ], "start_line": 1166, "end_line": 1171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "array_trace", "long_name": "array_trace( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 109, "parameters": [ "self", "args", "kwds" ], "start_line": 1177, "end_line": 1189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_clip", "long_name": "array_clip( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 74, "parameters": [ "self", "args", "kwds" ], "start_line": 1195, "end_line": 1205, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_conjugate", "long_name": "array_conjugate( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 31, "parameters": [ "self", "args" ], "start_line": 1212, "end_line": 1218, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_diagonal", "long_name": "array_diagonal( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 87, "parameters": [ "self", "args", "kwds" ], "start_line": 1224, "end_line": 1234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_flatten", "long_name": "array_flatten( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 8, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 1239, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_ravel", "long_name": "array_ravel( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 1253, "end_line": 1261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_setflags", "long_name": "array_setflags( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 60, "complexity": 12, "token_count": 299, "parameters": [ "self", "args", "kwds" ], "start_line": 1271, "end_line": 1335, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 } ], "methods_before": [ { "name": "array_take", "long_name": "array_take( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 12, "complexity": 2, "token_count": 82, "parameters": [ "self", "args", "kwds" ], "start_line": 7, "end_line": 20, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "array_put", "long_name": "array_put( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 71, "parameters": [ "self", "args", "kwds" ], "start_line": 27, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_putmask", "long_name": "array_putmask( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 71, "parameters": [ "self", "args", "kwds" ], "start_line": 42, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "_reverse_shape", "long_name": "_reverse_shape( PyArray_Dims * newshape)", "filename": "arraymethods.c", "nloc": 14, "complexity": 2, "token_count": 81, "parameters": [ "newshape" ], "start_line": 56, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_reshape", "long_name": "array_reshape( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 47, "complexity": 13, "token_count": 290, "parameters": [ "self", "args" ], "start_line": 78, "end_line": 127, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "array_squeeze", "long_name": "array_squeeze( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 34, "parameters": [ "self", "args" ], "start_line": 132, "end_line": 136, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_view", "long_name": "array_view( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 8, "complexity": 2, "token_count": 53, "parameters": [ "self", "args" ], "start_line": 143, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_argmax", "long_name": "array_argmax( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 156, "end_line": 164, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_argmin", "long_name": "array_argmin( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 169, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_max", "long_name": "array_max( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 182, "end_line": 190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_ptp", "long_name": "array_ptp( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 195, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_min", "long_name": "array_min( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 209, "end_line": 217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_swapaxes", "long_name": "array_swapaxes( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 6, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 223, "end_line": 230, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_GetField", "long_name": "PyArray_GetField( PyArrayObject * self , PyArray_Typecode * type , int offset)", "filename": "arraymethods.c", "nloc": 14, "complexity": 2, "token_count": 110, "parameters": [ "self", "type", "offset" ], "start_line": 238, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "array_getfield", "long_name": "array_getfield( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 15, "complexity": 3, "token_count": 110, "parameters": [ "self", "args", "kwds" ], "start_line": 254, "end_line": 271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Byteswap", "long_name": "PyArray_Byteswap( PyArrayObject * self , Bool inplace)", "filename": "arraymethods.c", "nloc": 41, "complexity": 7, "token_count": 247, "parameters": [ "self", "inplace" ], "start_line": 274, "end_line": 327, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "array_byteswap", "long_name": "array_byteswap( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 334, "end_line": 342, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_tolist", "long_name": "array_tolist( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 10, "complexity": 3, "token_count": 51, "parameters": [ "self", "args" ], "start_line": 348, "end_line": 358, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_tostring", "long_name": "array_tostring( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 31, "parameters": [ "self", "args" ], "start_line": 364, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_tofile", "long_name": "array_tofile( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 33, "complexity": 7, "token_count": 206, "parameters": [ "self", "args", "kwds" ], "start_line": 373, "end_line": 407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_toscalar", "long_name": "array_toscalar( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 4, "complexity": 2, "token_count": 39, "parameters": [ "self", "args" ], "start_line": 413, "end_line": 416, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_cast", "long_name": "array_cast( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 11, "complexity": 4, "token_count": 82, "parameters": [ "self", "args" ], "start_line": 423, "end_line": 435, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_wraparray", "long_name": "array_wraparray( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 25, "complexity": 4, "token_count": 140, "parameters": [ "self", "args" ], "start_line": 443, "end_line": 469, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_finalize", "long_name": "array_finalize( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 1, "token_count": 20, "parameters": [ "self", "args" ], "start_line": 473, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_getarray", "long_name": "array_getarray( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 38, "complexity": 8, "token_count": 242, "parameters": [ "self", "args" ], "start_line": 483, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "array_copy", "long_name": "array_copy( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 34, "parameters": [ "self", "args" ], "start_line": 531, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "array_resize", "long_name": "array_resize( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 25, "complexity": 5, "token_count": 120, "parameters": [ "self", "args" ], "start_line": 544, "end_line": 569, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_repeat", "long_name": "array_repeat( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 75, "parameters": [ "self", "args", "kwds" ], "start_line": 574, "end_line": 584, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_choose", "long_name": "array_choose( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 14, "complexity": 3, "token_count": 68, "parameters": [ "self", "args" ], "start_line": 589, "end_line": 604, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_sort", "long_name": "array_sort( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 609, "end_line": 617, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_argsort", "long_name": "array_argsort( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 622, "end_line": 630, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_searchsorted", "long_name": "array_searchsorted( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 635, "end_line": 642, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_deepcopy", "long_name": "array_deepcopy( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 32, "complexity": 7, "token_count": 234, "parameters": [ "self", "args" ], "start_line": 647, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "_getobject_pkl", "long_name": "_getobject_pkl( PyArrayObject * self)", "filename": "arraymethods.c", "nloc": 18, "complexity": 4, "token_count": 128, "parameters": [ "self" ], "start_line": 684, "end_line": 703, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "_setobject_pkl", "long_name": "_setobject_pkl( PyArrayObject * self , PyObject * list)", "filename": "arraymethods.c", "nloc": 17, "complexity": 3, "token_count": 113, "parameters": [ "self", "list" ], "start_line": 706, "end_line": 724, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_reduce", "long_name": "array_reduce( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 45, "complexity": 8, "token_count": 301, "parameters": [ "self", "args" ], "start_line": 730, "end_line": 793, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_setstate", "long_name": "array_setstate( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 88, "complexity": 17, "token_count": 534, "parameters": [ "self", "args" ], "start_line": 808, "end_line": 913, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_Dump", "long_name": "PyArray_Dump( PyObject * self , PyObject * file , int protocol)", "filename": "arraymethods.c", "nloc": 20, "complexity": 6, "token_count": 132, "parameters": [ "self", "file", "protocol" ], "start_line": 916, "end_line": 937, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Dumps", "long_name": "PyArray_Dumps( PyObject * self , int protocol)", "filename": "arraymethods.c", "nloc": 11, "complexity": 3, "token_count": 70, "parameters": [ "self", "protocol" ], "start_line": 940, "end_line": 951, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_dump", "long_name": "array_dump( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 11, "complexity": 3, "token_count": 69, "parameters": [ "self", "args" ], "start_line": 957, "end_line": 968, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_dumps", "long_name": "array_dumps( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 6, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 973, "end_line": 978, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "array_transpose", "long_name": "array_transpose( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "args" ], "start_line": 984, "end_line": 994, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_mean", "long_name": "array_mean( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 89, "parameters": [ "self", "args", "kwds" ], "start_line": 999, "end_line": 1011, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_sum", "long_name": "array_sum( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1016, "end_line": 1028, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_cumsum", "long_name": "array_cumsum( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1034, "end_line": 1046, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_prod", "long_name": "array_prod( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1051, "end_line": 1063, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_cumprod", "long_name": "array_cumprod( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1069, "end_line": 1081, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_any", "long_name": "array_any( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 1087, "end_line": 1095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_all", "long_name": "array_all( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 43, "parameters": [ "self", "args" ], "start_line": 1100, "end_line": 1108, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_stddev", "long_name": "array_stddev( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 86, "parameters": [ "self", "args", "kwds" ], "start_line": 1114, "end_line": 1126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_compress", "long_name": "array_compress( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 10, "complexity": 2, "token_count": 78, "parameters": [ "self", "args", "kwds" ], "start_line": 1131, "end_line": 1142, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_nonzero", "long_name": "array_nonzero( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 34, "parameters": [ "self", "args" ], "start_line": 1148, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "array_trace", "long_name": "array_trace( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 11, "complexity": 2, "token_count": 109, "parameters": [ "self", "args", "kwds" ], "start_line": 1159, "end_line": 1171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_clip", "long_name": "array_clip( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 74, "parameters": [ "self", "args", "kwds" ], "start_line": 1177, "end_line": 1187, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_conjugate", "long_name": "array_conjugate( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 5, "complexity": 2, "token_count": 31, "parameters": [ "self", "args" ], "start_line": 1194, "end_line": 1200, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_diagonal", "long_name": "array_diagonal( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 9, "complexity": 2, "token_count": 87, "parameters": [ "self", "args", "kwds" ], "start_line": 1206, "end_line": 1216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_flatten", "long_name": "array_flatten( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 8, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 1221, "end_line": 1230, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_ravel", "long_name": "array_ravel( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 7, "complexity": 2, "token_count": 46, "parameters": [ "self", "args" ], "start_line": 1235, "end_line": 1243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_setflags", "long_name": "array_setflags( PyArrayObject * self , PyObject * args , PyObject * kwds)", "filename": "arraymethods.c", "nloc": 60, "complexity": 12, "token_count": 299, "parameters": [ "self", "args", "kwds" ], "start_line": 1253, "end_line": 1317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "array_wraparray", "long_name": "array_wraparray( PyArrayObject * self , PyObject * args)", "filename": "arraymethods.c", "nloc": 25, "complexity": 4, "token_count": 144, "parameters": [ "self", "args" ], "start_line": 443, "end_line": 469, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "nloc": 1136, "complexity": 200, "token_count": 7253, "diff_parsed": { "added": [ "static char doc_wraparray[] = \"m.__array_wrap__(obj) returns an object of \"\\", "\t\"type m from the ndarray object obj\";", "\t\t\t PyArray_FLAGS(arr), (PyObject *)self);", "static char doc_repeat[] = \"a.repeat(repeats=, axis=None)\\n\"\\", "\t\"\\n\"\\", "\t\" Copy elements of a, repeats times. The repeats argument must\\n\"\\", "\t\" be a sequence of length a.shape[axis] or a scalar.\";", "static char doc_choose[] = \"self.choose(b0,b1,...,bn)\\n\"\\", "\t\"\\n\"\\", "\t\" Self sould be an integer array with entries from 0 to n+1, \\n\"\\", "\t\" The bi arrays should be of the same shape as self. The result\\n\"\\", "\t\" will be an array with elements chosen from the bi arrays\\n\"\\", "\t\" according to the value at each position of self.\";", "static char doc_argsort[] = \"a.argsort()\\n\"\\", "\t\" Return the indexes into a that would sort it along the\"\\", "\t\" given axis (or if the sorting should be done\"\\", "\t\" in terms of a.flat\";", "static char doc_searchsorted[] = \"a.searchsorted(v)\\n\"\\", "\t\" Assuming that a is a 1-D array, in ascending order and\\n\"\\", "\t\" represents bin boundaries, then a.searchsorted(values) gives an\\n\"\\", "\t\" array of bin numbers, giving the bin into which each value would\\n\"\\", "\t\" be placed. This method is helpful for histograming. \\n\"\\", "\t\" Note: No warning is given if the boundaries, in a, are not \\n\"\\", "\t\" in ascending order.\";", ";" ], "deleted": [ "static char doc_wraparray[] = \"m.__array_wrap__(obj) returns an object of type m\"\\", "\t\" from the ndarray object obj\";", "\t\t\t PyArray_FLAGS(arr), NULL);", "static char doc_repeat[] = \"a.repeat(repeats=, axis=None)\";", "static char doc_choose[] = \"a.choose(b1,b2,...)\";", "static char doc_argsort[] = \"a.argsort()\";", "static char doc_searchsorted[] = \"a.searchsorted(v)\";" ] } } ] }, { "hash": "d54cc39dd564001f3b63aacd428fde90f271f2a1", "msg": "Updated thank yous..", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-12T19:33:03+00:00", "author_timezone": 0, "committer_date": "2005-10-12T19:33:03+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e5515fd930cce0d8c995211859f4f3c655ca5d37" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 2, "insertions": 3, "lines": 5, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "THANKS.txt", "new_path": "THANKS.txt", "filename": "THANKS.txt", "extension": "txt", "change_type": "MODIFY", "diff": "@@ -3,9 +3,10 @@ Jim Hugunin, Paul Dubois, Konrad Hinsen, David Ascher, and many others for\n Numeric on which the code is based.\n Perry Greenfield, J Todd Miller, Rick White, Paul Barrett for Numarray\n which gave much inspiration and showed the way forward.\n-Pearu Peterson for f2py and distutils\n+Paul Dubois for Masked Arrays\n+Pearu Peterson for f2py and distutils and help with code organization\n+Robert Kern for mtrand, bug fixes, help with distutils, and code organization\n Eric Jones for weave\n-Robert Kern for mtrand, bug fixes and help with distutils.\n Fernando Perez for code snippets and ideas\n John Hunter for code snippets (from matplotlib)\n Chris Hanley for help with records.py, testing, and bug fixes.\n", "added_lines": 3, "deleted_lines": 2, "source_code": "Travis Oliphant for the majority of code adaptation\nJim Hugunin, Paul Dubois, Konrad Hinsen, David Ascher, and many others for \n Numeric on which the code is based.\nPerry Greenfield, J Todd Miller, Rick White, Paul Barrett for Numarray\n which gave much inspiration and showed the way forward.\nPaul Dubois for Masked Arrays\nPearu Peterson for f2py and distutils and help with code organization\nRobert Kern for mtrand, bug fixes, help with distutils, and code organization\nEric Jones for weave\nFernando Perez for code snippets and ideas\nJohn Hunter for code snippets (from matplotlib)\nChris Hanley for help with records.py, testing, and bug fixes.\nTravis Vaught and Joe Cooper for administration of scipy.org web site and SVN \nEric Firing for bugfixes.\nArnd Baecker for 64-bit testing\n", "source_code_before": "Travis Oliphant for the majority of code adaptation\nJim Hugunin, Paul Dubois, Konrad Hinsen, David Ascher, and many others for \n Numeric on which the code is based.\nPerry Greenfield, J Todd Miller, Rick White, Paul Barrett for Numarray\n which gave much inspiration and showed the way forward.\nPearu Peterson for f2py and distutils\nEric Jones for weave\nRobert Kern for mtrand, bug fixes and help with distutils.\nFernando Perez for code snippets and ideas\nJohn Hunter for code snippets (from matplotlib)\nChris Hanley for help with records.py, testing, and bug fixes.\nTravis Vaught and Joe Cooper for administration of scipy.org web site and SVN \nEric Firing for bugfixes.\nArnd Baecker for 64-bit testing\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ "Paul Dubois for Masked Arrays", "Pearu Peterson for f2py and distutils and help with code organization", "Robert Kern for mtrand, bug fixes, help with distutils, and code organization" ], "deleted": [ "Pearu Peterson for f2py and distutils", "Robert Kern for mtrand, bug fixes and help with distutils." ] } } ] }, { "hash": "956dd2252fd0dec5150be8a0a12f8b253754a4dc", "msg": "Moved importing scipy modules from __init__.py to install__init__py.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-12T22:52:47+00:00", "author_timezone": 0, "committer_date": "2005-10-12T22:52:47+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "d54cc39dd564001f3b63aacd428fde90f271f2a1" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 22, "insertions": 41, "lines": 63, "files": 3, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/__init__.py", "new_path": "scipy/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -8,26 +8,11 @@\n development.\n \"\"\"\n \n-try: # For installation purposes only \n- from scipy.base import *\n- import scipy.basic as basic\n- from scipy.basic.fft import fft, ifft\n- from scipy.basic.random import rand, randn\n- import scipy.basic.fft as fftpack\n- import scipy.basic.linalg as linalg\n- import scipy.basic.random as random\n- from core_version import version as __core_version__\n- from scipy.test.testing import ScipyTest\n- test = ScipyTest('scipy').test\n-\n-except AttributeError, inst:\n- if inst.args[0] == \"'module' object has no attribute 'typeinfo'\":\n- print \"Not loaded: Are you running from the source directory?\"\n- else:\n- raise\n-except ImportError, inst:\n- if inst.args[0] == 'No module named multiarray':\n- print \"Not loaded: Are you running from the source directory?\"\n- else:\n- raise\n \n+import os as _os\n+_install_init = _os.path.join(_os.path.dirname(__file__),'install__init__.py')\n+if _os.path.isfile(_install_init):\n+ execfile(_install_init)\n+else:\n+ print 'Running from source directory.'\n+del _os\n", "added_lines": 7, "deleted_lines": 22, "source_code": "\"\"\"SciPy Core\n\nYou can support the development of SciPy by purchasing documentation at\n\nhttp://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise money for\ndevelopment.\n\"\"\"\n\n\nimport os as _os\n_install_init = _os.path.join(_os.path.dirname(__file__),'install__init__.py')\nif _os.path.isfile(_install_init):\n execfile(_install_init)\nelse:\n print 'Running from source directory.'\ndel _os\n", "source_code_before": "\"\"\"SciPy Core\n\nYou can support the development of SciPy by purchasing documentation at\n\nhttp://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise money for\ndevelopment.\n\"\"\"\n\ntry: # For installation purposes only \n from scipy.base import *\n import scipy.basic as basic\n from scipy.basic.fft import fft, ifft\n from scipy.basic.random import rand, randn\n import scipy.basic.fft as fftpack\n import scipy.basic.linalg as linalg\n import scipy.basic.random as random\n from core_version import version as __core_version__\n from scipy.test.testing import ScipyTest\n test = ScipyTest('scipy').test\n\nexcept AttributeError, inst:\n if inst.args[0] == \"'module' object has no attribute 'typeinfo'\":\n print \"Not loaded: Are you running from the source directory?\"\n else:\n raise\nexcept ImportError, inst:\n if inst.args[0] == 'No module named multiarray':\n print \"Not loaded: Are you running from the source directory?\"\n else:\n raise\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 16, "complexity": 0, "token_count": 44, "diff_parsed": { "added": [ "import os as _os", "_install_init = _os.path.join(_os.path.dirname(__file__),'install__init__.py')", "if _os.path.isfile(_install_init):", " execfile(_install_init)", "else:", " print 'Running from source directory.'", "del _os" ], "deleted": [ "try: # For installation purposes only", " from scipy.base import *", " import scipy.basic as basic", " from scipy.basic.fft import fft, ifft", " from scipy.basic.random import rand, randn", " import scipy.basic.fft as fftpack", " import scipy.basic.linalg as linalg", " import scipy.basic.random as random", " from core_version import version as __core_version__", " from scipy.test.testing import ScipyTest", " test = ScipyTest('scipy').test", "", "except AttributeError, inst:", " if inst.args[0] == \"'module' object has no attribute 'typeinfo'\":", " print \"Not loaded: Are you running from the source directory?\"", " else:", " raise", "except ImportError, inst:", " if inst.args[0] == 'No module named multiarray':", " print \"Not loaded: Are you running from the source directory?\"", " else:", " raise" ] } }, { "old_path": null, "new_path": "scipy/install__init__py", "filename": "install__init__py", "extension": "install__init__py", "change_type": "ADD", "diff": "@@ -0,0 +1,21 @@\n+# -*- python -*-\n+\"\"\"SciPy Core\n+\n+You can support the development of SciPy by purchasing documentation at\n+\n+http://www.trelgol.com\n+\n+It is being distributed for a fee for a limited time to try and raise money for\n+development.\n+\"\"\"\n+\n+from scipy.base import *\n+import scipy.basic as basic\n+from scipy.basic.fft import fft, ifft\n+from scipy.basic.random import rand, randn\n+import scipy.basic.fft as fftpack\n+import scipy.basic.linalg as linalg\n+import scipy.basic.random as random\n+from core_version import version as __core_version__\n+from scipy.test.testing import ScipyTest\n+test = ScipyTest('scipy').test\n", "added_lines": 21, "deleted_lines": 0, "source_code": "# -*- python -*-\n\"\"\"SciPy Core\n\nYou can support the development of SciPy by purchasing documentation at\n\nhttp://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise money for\ndevelopment.\n\"\"\"\n\nfrom scipy.base import *\nimport scipy.basic as basic\nfrom scipy.basic.fft import fft, ifft\nfrom scipy.basic.random import rand, randn\nimport scipy.basic.fft as fftpack\nimport scipy.basic.linalg as linalg\nimport scipy.basic.random as random\nfrom core_version import version as __core_version__\nfrom scipy.test.testing import ScipyTest\ntest = ScipyTest('scipy').test\n", "source_code_before": null, "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ "# -*- python -*-", "\"\"\"SciPy Core", "", "You can support the development of SciPy by purchasing documentation at", "", "http://www.trelgol.com", "", "It is being distributed for a fee for a limited time to try and raise money for", "development.", "\"\"\"", "", "from scipy.base import *", "import scipy.basic as basic", "from scipy.basic.fft import fft, ifft", "from scipy.basic.random import rand, randn", "import scipy.basic.fft as fftpack", "import scipy.basic.linalg as linalg", "import scipy.basic.random as random", "from core_version import version as __core_version__", "from scipy.test.testing import ScipyTest", "test = ScipyTest('scipy').test" ], "deleted": [] } }, { "old_path": "scipy/setup.py", "new_path": "scipy/setup.py", "filename": "setup.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -12,6 +12,19 @@ def configuration(parent_package='',top_path=None):\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n+\n+ def generate_install_init_py(ext,build_dir):\n+ from distutils.dep_util import newer\n+ from distutils.file_util import copy_file\n+ source = ext.depends[0]\n+ target = os.path.join(build_dir,'install__init__.py')\n+ if newer(source,target):\n+ copy_file(source,target)\n+ return target\n+\n+ config.add_extension('__init__',[generate_install_init_py],\n+ depends=['install__init__py'])\n+\n return config.todict()\n \n if __name__ == '__main__':\n", "added_lines": 13, "deleted_lines": 0, "source_code": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n\n def generate_install_init_py(ext,build_dir):\n from distutils.dep_util import newer\n from distutils.file_util import copy_file\n source = ext.depends[0]\n target = os.path.join(build_dir,'install__init__.py')\n if newer(source,target):\n copy_file(source,target)\n return target\n\n config.add_extension('__init__',[generate_install_init_py],\n depends=['install__init__py'])\n\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "source_code_before": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "methods": [ { "name": "configuration.generate_install_init_py", "long_name": "configuration.generate_install_init_py( ext , build_dir )", "filename": "setup.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [ "ext", "build_dir" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 15, "complexity": 1, "token_count": 101, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "methods_before": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 12, "complexity": 1, "token_count": 83, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "configuration.generate_install_init_py", "long_name": "configuration.generate_install_init_py( ext , build_dir )", "filename": "setup.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [ "ext", "build_dir" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 15, "complexity": 1, "token_count": 101, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "nloc": 28, "complexity": 3, "token_count": 197, "diff_parsed": { "added": [ "", " def generate_install_init_py(ext,build_dir):", " from distutils.dep_util import newer", " from distutils.file_util import copy_file", " source = ext.depends[0]", " target = os.path.join(build_dir,'install__init__.py')", " if newer(source,target):", " copy_file(source,target)", " return target", "", " config.add_extension('__init__',[generate_install_init_py],", " depends=['install__init__py'])", "" ], "deleted": [] } } ] }, { "hash": "b04bd56a7a87b55c89ed7fa4470a78adb87603c3", "msg": "Fixed getting base svn version number - avoiding importing base while in source directory.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T07:40:55+00:00", "author_timezone": 0, "committer_date": "2005-10-13T07:40:55+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "956dd2252fd0dec5150be8a0a12f8b253754a4dc" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 6, "insertions": 5, "lines": 11, "files": 2, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/core_version.py", "new_path": "scipy/core_version.py", "filename": "core_version.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -1,8 +1,8 @@\n version='0.4.3'\n \n-try:\n- import base.__svn_version__ as svn\n+import os\n+svn_version_file = os.path.join(os.path.dirname(__file__),\n+ 'base','__svn_version__.py')\n+if os.path.isfile(svn_version_file):\n+ import base.__svn_version as svn\n version += '.'+svn.version\n-except ImportError:\n- pass\n-\n", "added_lines": 5, "deleted_lines": 5, "source_code": "version='0.4.3'\n\nimport os\nsvn_version_file = os.path.join(os.path.dirname(__file__),\n 'base','__svn_version__.py')\nif os.path.isfile(svn_version_file):\n import base.__svn_version as svn\n version += '.'+svn.version\n", "source_code_before": "version='0.4.3'\n\ntry:\n import base.__svn_version__ as svn\n version += '.'+svn.version\nexcept ImportError:\n pass\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 7, "complexity": 0, "token_count": 49, "diff_parsed": { "added": [ "import os", "svn_version_file = os.path.join(os.path.dirname(__file__),", " 'base','__svn_version__.py')", "if os.path.isfile(svn_version_file):", " import base.__svn_version as svn" ], "deleted": [ "try:", " import base.__svn_version__ as svn", "except ImportError:", " pass", "" ] } }, { "old_path": "scipy/setup.py", "new_path": "scipy/setup.py", "filename": "setup.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -24,7 +24,6 @@ def generate_install_init_py(ext,build_dir):\n \n config.add_extension('__init__',[generate_install_init_py],\n depends=['install__init__py'])\n-\n return config.todict()\n \n if __name__ == '__main__':\n", "added_lines": 0, "deleted_lines": 1, "source_code": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n\n def generate_install_init_py(ext,build_dir):\n from distutils.dep_util import newer\n from distutils.file_util import copy_file\n source = ext.depends[0]\n target = os.path.join(build_dir,'install__init__.py')\n if newer(source,target):\n copy_file(source,target)\n return target\n\n config.add_extension('__init__',[generate_install_init_py],\n depends=['install__init__py'])\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "source_code_before": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n\n def generate_install_init_py(ext,build_dir):\n from distutils.dep_util import newer\n from distutils.file_util import copy_file\n source = ext.depends[0]\n target = os.path.join(build_dir,'install__init__.py')\n if newer(source,target):\n copy_file(source,target)\n return target\n\n config.add_extension('__init__',[generate_install_init_py],\n depends=['install__init__py'])\n\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "methods": [ { "name": "configuration.generate_install_init_py", "long_name": "configuration.generate_install_init_py( ext , build_dir )", "filename": "setup.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [ "ext", "build_dir" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 15, "complexity": 1, "token_count": 101, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "methods_before": [ { "name": "configuration.generate_install_init_py", "long_name": "configuration.generate_install_init_py( ext , build_dir )", "filename": "setup.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [ "ext", "build_dir" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 15, "complexity": 1, "token_count": 101, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 15, "complexity": 1, "token_count": 101, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "nloc": 28, "complexity": 3, "token_count": 197, "diff_parsed": { "added": [], "deleted": [ "" ] } } ] }, { "hash": "d47b79d847d963251bcaf8612a9f1f1438632104", "msg": "Fixed getting base svn version number - avoiding importing base while in source directory. 2nd try.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T07:45:16+00:00", "author_timezone": 0, "committer_date": "2005-10-13T07:45:16+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "b04bd56a7a87b55c89ed7fa4470a78adb87603c3" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 1, "insertions": 5, "lines": 6, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/core_version.py", "new_path": "scipy/core_version.py", "filename": "core_version.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -4,5 +4,9 @@\n svn_version_file = os.path.join(os.path.dirname(__file__),\n 'base','__svn_version__.py')\n if os.path.isfile(svn_version_file):\n- import base.__svn_version as svn\n+ import imp\n+ svn = imp.load_module('scipy.base.__svn_version__',\n+ open(svn_version_file),\n+ svn_version_file,\n+ ('.py','U',1))\n version += '.'+svn.version\n", "added_lines": 5, "deleted_lines": 1, "source_code": "version='0.4.3'\n\nimport os\nsvn_version_file = os.path.join(os.path.dirname(__file__),\n 'base','__svn_version__.py')\nif os.path.isfile(svn_version_file):\n import imp\n svn = imp.load_module('scipy.base.__svn_version__',\n open(svn_version_file),\n svn_version_file,\n ('.py','U',1))\n version += '.'+svn.version\n", "source_code_before": "version='0.4.3'\n\nimport os\nsvn_version_file = os.path.join(os.path.dirname(__file__),\n 'base','__svn_version__.py')\nif os.path.isfile(svn_version_file):\n import base.__svn_version as svn\n version += '.'+svn.version\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 11, "complexity": 0, "token_count": 68, "diff_parsed": { "added": [ " import imp", " svn = imp.load_module('scipy.base.__svn_version__',", " open(svn_version_file),", " svn_version_file,", " ('.py','U',1))" ], "deleted": [ " import base.__svn_version as svn" ] } } ] }, { "hash": "7768c2e4e25134c29bc145ca06f42fdbddead216", "msg": "Shut up scipy.test(..) on missing tests. Use scipy.test(verbosity=2) to get old behaviour.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T10:38:32+00:00", "author_timezone": 0, "committer_date": "2005-10-13T10:38:32+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "d47b79d847d963251bcaf8612a9f1f1438632104" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 5, "insertions": 6, "lines": 11, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy/test/testing.py", "new_path": "scipy/test/testing.py", "filename": "testing.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -264,7 +264,7 @@ def _get_method_names(self,clsobj,level):\n names.append(n) \n return names\n \n- def _get_module_tests(self,module,level):\n+ def _get_module_tests(self,module,level,verbosity):\n mstr = self._module_str\n d,f = os.path.split(module.__file__)\n \n@@ -292,9 +292,10 @@ def _get_module_tests(self,module,level):\n if short_module_name[-8:]=='_version' \\\n and short_module_name[:-8]==module.__name__.split('.')[-2]:\n return []\n- print test_file\n- print ' !! No test file %r found for %s' \\\n- % (os.path.basename(test_file), mstr(module))\n+ if verbosity>1:\n+ print test_file\n+ print ' !! No test file %r found for %s' \\\n+ % (os.path.basename(test_file), mstr(module))\n return []\n \n try:\n@@ -360,7 +361,7 @@ def test(self,level=1,verbosity=1):\n or module is None \\\n or os.path.basename(os.path.dirname(module.__file__))=='tests':\n continue\n- suites.extend(self._get_module_tests(module, level))\n+ suites.extend(self._get_module_tests(module, level, verbosity))\n \n suites.extend(self._get_suite_list(sys.modules[package_name], level))\n \n", "added_lines": 6, "deleted_lines": 5, "source_code": "\"\"\"\nUnit-testing\n------------\n\n ScipyTest -- Scipy tests site manager\n ScipyTestCase -- unittest.TestCase with measure method\n IgnoreException -- raise when checking disabled feature ('ignoring' is displayed)\n set_package_path -- prepend package build directory to path\n set_local_path -- prepend local directory (to tests files) to path\n restore_path -- restore path after set_package_path\n\nTiming tools\n------------\n\n jiffies -- return 1/100ths of a second that the current process has used\n memusage -- virtual memory size in bytes of the running python [linux]\n\nUtility functions\n-----------------\n\n assert_equal -- assert equality\n assert_almost_equal -- assert equality with decimal tolerance\n assert_approx_equal -- assert equality with significant digits tolerance\n assert_array_equal -- assert arrays equality\n assert_array_almost_equal -- assert arrays equality with decimal tolerance\n assert_array_less -- assert arrays less-ordering\n rand -- array of random numbers from given shape\n\n\"\"\"\n\n__all__ = []\n\nimport os,sys,time,glob,string,traceback,unittest\nimport types\nimport imp\n\n#\n# Imports from scipy.base must be done at the end of this file.\n#\n\nDEBUG = 0\n\n__all__.append('set_package_path')\ndef set_package_path(level=1):\n \"\"\" Prepend package directory to sys.path.\n\n set_package_path should be called from a test_file.py that\n satisfies the following tree structure:\n\n //test_file.py\n\n Then the first existing path name from the following list\n\n /build/lib.-\n /..\n\n is prepended to sys.path.\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from distutils.util import get_platform\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n d = os.path.dirname(os.path.dirname(os.path.abspath(testfile)))\n d1 = os.path.join(d,'build','lib.%s-%s'%(get_platform(),sys.version[:3]))\n if not os.path.isdir(d1):\n d1 = os.path.dirname(d)\n if DEBUG:\n print 'Inserting %r to sys.path' % (d1)\n sys.path.insert(0,d1)\n\n__all__.append('set_local_path')\ndef set_local_path(reldir='', level=1):\n \"\"\" Prepend local directory to sys.path.\n\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n local_path = os.path.join(os.path.dirname(os.path.abspath(testfile)),reldir)\n if DEBUG:\n print 'Inserting %r to sys.path' % (local_path)\n sys.path.insert(0,local_path)\n\n__all__.append('restore_path')\ndef restore_path():\n if DEBUG:\n print 'Removing %r from sys.path' % (sys.path[0])\n del sys.path[0]\n\n__all__.extend(['jiffies','memusage'])\nif sys.platform[:5]=='linux':\n def jiffies(_proc_pid_stat = '/proc/%s/stat'%(os.getpid()),\n _load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. See man 5 proc. \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[13])\n except:\n return int(100*(time.time()-_load_time))\n\n def memusage(_proc_pid_stat = '/proc/%s/stat'%(os.getpid())):\n \"\"\" Return virtual memory size in bytes of the running python.\n \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[22])\n except:\n return\nelse:\n # os.getpid is not in all platforms available.\n # Using time is safe but inaccurate, especially when process\n # was suspended or sleeping.\n def jiffies(_load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. [Emulation with time.time]. \"\"\"\n return int(100*(time.time()-_load_time))\n\n def memusage():\n \"\"\" Return memory usage of running python. [Not implemented]\"\"\"\n return\n\n__all__.append('ScipyTestCase')\nclass ScipyTestCase (unittest.TestCase):\n\n def measure(self,code_str,times=1):\n \"\"\" Return elapsed time for executing code_str in the\n namespace of the caller for given times.\n \"\"\"\n frame = sys._getframe(1)\n locs,globs = frame.f_locals,frame.f_globals\n code = compile(code_str,\n 'ScipyTestCase runner for '+self.__class__.__name__,\n 'exec')\n i = 0\n elapsed = jiffies()\n while i>> ScipyTest().test(level=1,verbosity=2)\n\n is package name or its module object.\n\n Package is supposed to contain a directory tests/\n with test_*.py files where * refers to the names of submodules.\n\n test_*.py files are supposed to define a classes, derived\n from ScipyTestCase or unittest.TestCase, with methods having\n names starting with test or bench or check.\n\n And that is it! No need to implement test or test_suite functions\n in each .py file.\n\n Also old styled test_suite(level=1) hooks are supported but\n soon to be removed.\n \"\"\"\n def __init__(self, package='__main__'):\n self.package = package\n\n def _module_str(self, module):\n filename = module.__file__[-30:]\n if filename!=module.__file__:\n filename = '...'+filename\n return '' % (`module.__name__`, `filename`)\n\n def _get_method_names(self,clsobj,level):\n names = []\n for mthname in _get_all_method_names(clsobj):\n if mthname[:5] not in ['bench','check'] \\\n and mthname[:4] not in ['test']:\n continue\n mth = getattr(clsobj, mthname)\n if type(mth) is not types.MethodType:\n continue\n d = mth.im_func.func_defaults\n if d is not None:\n mthlevel = d[0]\n else:\n mthlevel = 1\n if level>=mthlevel:\n if mthname not in names:\n names.append(mthname)\n for base in clsobj.__bases__:\n for n in self._get_method_names(base,level):\n if n not in names:\n names.append(n) \n return names\n\n def _get_module_tests(self,module,level,verbosity):\n mstr = self._module_str\n d,f = os.path.split(module.__file__)\n\n short_module_name = os.path.splitext(os.path.basename(f))[0]\n if short_module_name=='__init__':\n short_module_name = module.__name__.split('.')[-1]\n\n test_dir = os.path.join(d,'tests')\n test_file = os.path.join(test_dir,'test_'+short_module_name+'.py')\n\n local_test_dir = os.path.join(os.getcwd(),'tests')\n local_test_file = os.path.join(local_test_dir,\n 'test_'+short_module_name+'.py')\n if os.path.basename(os.path.dirname(local_test_dir)) \\\n == os.path.basename(os.path.dirname(test_dir)) \\\n and os.path.isfile(local_test_file):\n test_file = local_test_file\n\n if not os.path.isfile(test_file):\n if short_module_name[:5]=='info_' \\\n and short_module_name[5:]==module.__name__.split('.')[-2]:\n return []\n if short_module_name in ['__cvs_version__','__svn_version__']:\n return []\n if short_module_name[-8:]=='_version' \\\n and short_module_name[:-8]==module.__name__.split('.')[-2]:\n return []\n if verbosity>1:\n print test_file\n print ' !! No test file %r found for %s' \\\n % (os.path.basename(test_file), mstr(module))\n return []\n\n try:\n if sys.version[:3]=='2.1':\n # Workaround for Python 2.1 .pyc file generator bug\n import random\n pref = '-nopyc'+`random.randint(1,100)`\n else:\n pref = ''\n f = open(test_file,'r')\n test_module = imp.load_module(\\\n module.__name__+'.test_'+short_module_name+pref,\n f, test_file+pref,('.py', 'r', 1))\n f.close()\n if sys.version[:3]=='2.1' and os.path.isfile(test_file+pref+'c'):\n os.remove(test_file+pref+'c')\n except:\n print ' !! FAILURE importing tests for ', mstr(module)\n print ' ',\n output_exception()\n return []\n return self._get_suite_list(test_module, level, module.__name__)\n\n def _get_suite_list(self, test_module, level, module_name='__main__'):\n mstr = self._module_str\n if hasattr(test_module,'test_suite'):\n # Using old styled test suite\n try:\n total_suite = test_module.test_suite(level)\n return total_suite._tests\n except:\n print ' !! FAILURE building tests for ', mstr(test_module)\n print ' ',\n output_exception()\n return []\n suite_list = []\n for name in dir(test_module):\n obj = getattr(test_module, name)\n if type(obj) is not type(unittest.TestCase) \\\n or not issubclass(obj, unittest.TestCase) \\\n or obj.__name__[:4] != 'test':\n continue\n for mthname in self._get_method_names(obj,level):\n suite = obj(mthname)\n if getattr(suite,'isrunnable',lambda mthname:1)(mthname):\n suite_list.append(suite)\n print ' Found',len(suite_list),'tests for',module_name\n return suite_list\n\n def test(self,level=1,verbosity=1):\n \"\"\" Run Scipy module test suite with level and verbosity.\n \"\"\"\n if type(self.package) is type(''):\n exec 'import %s as this_package' % (self.package)\n else:\n this_package = self.package\n\n package_name = this_package.__name__\n\n suites = []\n for name, module in sys.modules.items():\n if package_name != name[:len(package_name)] \\\n or module is None \\\n or os.path.basename(os.path.dirname(module.__file__))=='tests':\n continue\n suites.extend(self._get_module_tests(module, level, verbosity))\n\n suites.extend(self._get_suite_list(sys.modules[package_name], level))\n\n all_tests = unittest.TestSuite(suites)\n runner = unittest.TextTestRunner(verbosity=verbosity)\n runner.run(all_tests)\n return runner\n\n def run(self):\n \"\"\" Run Scipy module test suite with level and verbosity\n taken from sys.argv. Requires optparse module.\n \"\"\"\n try:\n from optparse import OptionParser\n except ImportError:\n print 'Failed to import optparse module, ignoring.'\n return self.test()\n usage = r'usage: %prog [-v ] [-l ]'\n parser = OptionParser(usage)\n parser.add_option(\"-v\", \"--verbosity\",\n action=\"store\",\n dest=\"verbosity\",\n default=1,\n type='int')\n parser.add_option(\"-l\", \"--level\",\n action=\"store\",\n dest=\"level\",\n default=1,\n type='int')\n (options, args) = parser.parse_args()\n self.test(options.level,options.verbosity)\n\n#------------\n \ndef remove_ignored_patterns(files,pattern):\n from fnmatch import fnmatch\n good_files = []\n for file in files:\n if not fnmatch(file,pattern):\n good_files.append(file)\n return good_files\n\ndef remove_ignored_files(original,ignored_files,cur_dir):\n \"\"\" This is actually expanded to do pattern matching.\n\n \"\"\"\n if not ignored_files: ignored_files = []\n ignored_modules = map(lambda x: x+'.py',ignored_files)\n ignored_packages = ignored_files[:]\n # always ignore setup.py and __init__.py files\n ignored_files = ['setup.py','setup_*.py','__init__.py']\n ignored_files += ignored_modules + ignored_packages\n ignored_files = map(lambda x,cur_dir=cur_dir: os.path.join(cur_dir,x),\n ignored_files)\n #print 'ignored:', ignored_files\n #good_files = filter(lambda x,ignored = ignored_files: x not in ignored,\n # original)\n good_files = original\n for pattern in ignored_files:\n good_files = remove_ignored_patterns(good_files,pattern)\n\n return good_files\n\n__all__.append('harvest_modules')\ndef harvest_modules(package,ignore=None):\n \"\"\"* Retreive a list of all modules that live within a package.\n\n Only retreive files that are immediate children of the\n package -- do not recurse through child packages or\n directories. The returned list contains actual modules, not\n just their names.\n *\"\"\"\n d,f = os.path.split(package.__file__)\n\n # go through the directory and import every py file there.\n common_dir = os.path.join(d,'*.py')\n py_files = glob.glob(common_dir)\n #py_files.remove(os.path.join(d,'__init__.py'))\n #py_files.remove(os.path.join(d,'setup.py'))\n\n py_files = remove_ignored_files(py_files,ignore,d)\n #print 'py_files:', py_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n\n all_modules = []\n for file in py_files:\n d,f = os.path.split(file)\n base,ext = os.path.splitext(f)\n mod = prefix + '.' + base\n #print 'module: import ' + mod\n try:\n exec ('import ' + mod)\n all_modules.append(eval(mod))\n except:\n print 'FAILURE to import ' + mod\n output_exception()\n\n return all_modules\n\n__all__.append('harvest_packages')\ndef harvest_packages(package,ignore = None):\n \"\"\" Retreive a list of all sub-packages that live within a package.\n\n Only retreive packages that are immediate children of this\n package -- do not recurse through child packages or\n directories. The returned list contains actual package objects, not\n just their names.\n \"\"\"\n join = os.path.join\n\n d,f = os.path.split(package.__file__)\n\n common_dir = os.path.abspath(d)\n all_files = os.listdir(d)\n\n all_files = remove_ignored_files(all_files,ignore,'')\n #print 'all_files:', all_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n all_packages = []\n for directory in all_files:\n path = join(common_dir,directory)\n if os.path.isdir(path) and \\\n os.path.exists(join(path,'__init__.py')):\n sub_package = prefix + '.' + directory\n #print 'sub-package import ' + sub_package\n try:\n exec ('import ' + sub_package)\n all_packages.append(eval(sub_package))\n except:\n print 'FAILURE to import ' + sub_package\n output_exception()\n return all_packages\n\n__all__.append('harvest_modules_and_packages')\ndef harvest_modules_and_packages(package,ignore=None):\n \"\"\" Retreive list of all packages and modules that live within a package.\n\n See harvest_packages() and harvest_modules()\n \"\"\"\n all = harvest_modules(package,ignore) + harvest_packages(package,ignore)\n return all\n\n__all__.append('harvest_test_suites')\ndef harvest_test_suites(package,ignore = None,level=10):\n \"\"\"\n package -- the module to test. This is an actual module object\n (not a string)\n ignore -- a list of module names to omit from the tests\n level -- a value between 1 and 10. 1 will run the minimum number\n of tests. This is a fast \"smoke test\". Tests that take\n longer to run should have higher numbers ranging up to 10.\n \"\"\"\n suites=[]\n test_modules = harvest_modules_and_packages(package,ignore)\n #for i in test_modules:\n # print i.__name__\n for module in test_modules:\n if hasattr(module,'test_suite'):\n try:\n suite = module.test_suite(level=level)\n if suite:\n suites.append(suite)\n else:\n print \" !! FAILURE without error - shouldn't happen\",\n print module.__name__\n except:\n print ' !! FAILURE building test for ', module.__name__\n print ' ',\n output_exception()\n else:\n try:\n print 'No test suite found for ', module.__name__\n except AttributeError:\n # __version__.py getting replaced by a string throws a kink\n # in checking for modules, so we think is a module has\n # actually been overwritten\n print 'No test suite found for ', str(module)\n total_suite = unittest.TestSuite(suites)\n return total_suite\n\n__all__.append('module_test')\ndef module_test(mod_name,mod_file,level=10):\n \"\"\"*\n\n *\"\"\"\n #print 'testing', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);%s.test(%d)' % \\\n ((test_module,)*3 + (level,))\n\n # This would be better cause it forces a reload of the orginal\n # module. It doesn't behave with packages however.\n #test_string = 'reload(%s);import %s;reload(%s);%s.test(%d)' % \\\n # ((mod_name,) + (test_module,)*3)\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n\n__all__.append('module_test_suite')\ndef module_test_suite(mod_name,mod_file,level=10):\n #try:\n print ' creating test suite for:', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);suite = %s.test_suite(%d)' % \\\n ((test_module,)*3+(level,))\n #print test_string\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n return suite\n #except:\n # print ' !! FAILURE loading test suite from', test_module, ':'\n # print ' ',\n # output_exception()\n\n\n# Utility function to facilitate testing.\n\n__all__.append('assert_equal')\ndef assert_equal(actual,desired,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_equal(actual, desired, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert desired == actual, msg\n\n__all__.append('assert_almost_equal')\ndef assert_almost_equal(actual,desired,decimal=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_almost_equal(actual, desired, decimal, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert round(abs(desired - actual),decimal) == 0, msg\n\n__all__.append('assert_approx_equal')\ndef assert_approx_equal(actual,desired,significant=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n Approximately equal is defined as the number of significant digits\n correct\n \"\"\"\n msg = '\\nItems are not equal to %d significant digits:\\n' % significant\n msg += err_msg\n actual, desired = map(float, (actual, desired))\n # Normalized the numbers to be in range (-10.0,10.0)\n scale = pow(10,math.floor(math.log10(0.5*(abs(desired)+abs(actual)))))\n try:\n sc_desired = desired/scale\n except ZeroDivisionError:\n sc_desired = 0.0\n try:\n sc_actual = actual/scale\n except ZeroDivisionError:\n sc_actual = 0.0\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert math.fabs(sc_desired - sc_actual) < pow(10.,-1*significant), msg\n\n\n__all__.append('assert_array_equal')\ndef assert_array_equal(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not equal'\n try:\n assert 0 in [len(shape(x)),len(shape(y))] \\\n or (len(shape(x))==len(shape(y)) and \\\n alltrue(equal(shape(x),shape(y)))),\\\n msg + ' (shapes %s, %s mismatch):\\n\\t' \\\n % (shape(x),shape(y)) + err_msg\n reduced = ravel(equal(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n raise ValueError, msg\n\n__all__.append('assert_array_almost_equal')\ndef assert_array_almost_equal(x,y,decimal=6,err_msg=''):\n x = asarray(x)\n y = asarray(y)\n msg = '\\nArrays are not almost equal'\n try:\n cond = alltrue(equal(shape(x),shape(y)))\n if not cond:\n msg = msg + ' (shapes mismatch):\\n\\t'\\\n 'Shape of array 1: %s\\n\\tShape of array 2: %s' % (shape(x),shape(y))\n assert cond, msg + '\\n\\t' + err_msg\n reduced = ravel(equal(less_equal(around(abs(x-y),decimal),10.0**(-decimal)),1))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=decimal+1)\n s2 = array2string(y,precision=decimal+1)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print sys.exc_value\n print shape(x),shape(y)\n print x, y\n raise ValueError, 'arrays are not almost equal'\n\n__all__.append('assert_array_less')\ndef assert_array_less(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not less-ordered'\n try:\n assert alltrue(equal(shape(x),shape(y))),\\\n msg + ' (shapes mismatch):\\n\\t' + err_msg\n reduced = ravel(less(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print shape(x),shape(y)\n raise ValueError, 'arrays are not less-ordered'\n\n__all__.append('rand')\ndef rand(*args):\n \"\"\"Returns an array of random numbers with the given shape.\n \n This only uses the standard library, so it is useful for testing purposes. \n \"\"\"\n import random\n results = zeros(args,Float64)\n f = results.flat\n for i in range(len(f)):\n f[i] = random.random()\n return results\n\ndef output_exception():\n try:\n type, value, tb = sys.exc_info()\n info = traceback.extract_tb(tb)\n #this is more verbose\n #traceback.print_exc()\n filename, lineno, function, text = info[-1] # last line only\n print \"%s:%d: %s: %s (in %s)\" %\\\n (filename, lineno, type.__name__, str(value), function)\n finally:\n type = value = tb = None # clean up\n\nfrom scipy.base import alltrue, equal, shape, ravel, around, zeros,\\\n Float64, asarray, less_equal, array2string, less, ArrayType\n\ntry:\n from scipy.base import math\nexcept ImportError,msg:\n print msg\n import math\n", "source_code_before": "\"\"\"\nUnit-testing\n------------\n\n ScipyTest -- Scipy tests site manager\n ScipyTestCase -- unittest.TestCase with measure method\n IgnoreException -- raise when checking disabled feature ('ignoring' is displayed)\n set_package_path -- prepend package build directory to path\n set_local_path -- prepend local directory (to tests files) to path\n restore_path -- restore path after set_package_path\n\nTiming tools\n------------\n\n jiffies -- return 1/100ths of a second that the current process has used\n memusage -- virtual memory size in bytes of the running python [linux]\n\nUtility functions\n-----------------\n\n assert_equal -- assert equality\n assert_almost_equal -- assert equality with decimal tolerance\n assert_approx_equal -- assert equality with significant digits tolerance\n assert_array_equal -- assert arrays equality\n assert_array_almost_equal -- assert arrays equality with decimal tolerance\n assert_array_less -- assert arrays less-ordering\n rand -- array of random numbers from given shape\n\n\"\"\"\n\n__all__ = []\n\nimport os,sys,time,glob,string,traceback,unittest\nimport types\nimport imp\n\n#\n# Imports from scipy.base must be done at the end of this file.\n#\n\nDEBUG = 0\n\n__all__.append('set_package_path')\ndef set_package_path(level=1):\n \"\"\" Prepend package directory to sys.path.\n\n set_package_path should be called from a test_file.py that\n satisfies the following tree structure:\n\n //test_file.py\n\n Then the first existing path name from the following list\n\n /build/lib.-\n /..\n\n is prepended to sys.path.\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from distutils.util import get_platform\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n d = os.path.dirname(os.path.dirname(os.path.abspath(testfile)))\n d1 = os.path.join(d,'build','lib.%s-%s'%(get_platform(),sys.version[:3]))\n if not os.path.isdir(d1):\n d1 = os.path.dirname(d)\n if DEBUG:\n print 'Inserting %r to sys.path' % (d1)\n sys.path.insert(0,d1)\n\n__all__.append('set_local_path')\ndef set_local_path(reldir='', level=1):\n \"\"\" Prepend local directory to sys.path.\n\n The caller is responsible for removing this path by using\n\n restore_path()\n \"\"\"\n from scipy.distutils.misc_util import get_frame\n f = get_frame(level)\n if f.f_locals['__name__']=='__main__':\n testfile = sys.argv[0]\n else:\n testfile = f.f_locals['__file__']\n local_path = os.path.join(os.path.dirname(os.path.abspath(testfile)),reldir)\n if DEBUG:\n print 'Inserting %r to sys.path' % (local_path)\n sys.path.insert(0,local_path)\n\n__all__.append('restore_path')\ndef restore_path():\n if DEBUG:\n print 'Removing %r from sys.path' % (sys.path[0])\n del sys.path[0]\n\n__all__.extend(['jiffies','memusage'])\nif sys.platform[:5]=='linux':\n def jiffies(_proc_pid_stat = '/proc/%s/stat'%(os.getpid()),\n _load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. See man 5 proc. \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[13])\n except:\n return int(100*(time.time()-_load_time))\n\n def memusage(_proc_pid_stat = '/proc/%s/stat'%(os.getpid())):\n \"\"\" Return virtual memory size in bytes of the running python.\n \"\"\"\n try:\n f=open(_proc_pid_stat,'r')\n l = f.readline().split(' ')\n f.close()\n return int(l[22])\n except:\n return\nelse:\n # os.getpid is not in all platforms available.\n # Using time is safe but inaccurate, especially when process\n # was suspended or sleeping.\n def jiffies(_load_time=time.time()):\n \"\"\" Return number of jiffies (1/100ths of a second) that this\n process has been scheduled in user mode. [Emulation with time.time]. \"\"\"\n return int(100*(time.time()-_load_time))\n\n def memusage():\n \"\"\" Return memory usage of running python. [Not implemented]\"\"\"\n return\n\n__all__.append('ScipyTestCase')\nclass ScipyTestCase (unittest.TestCase):\n\n def measure(self,code_str,times=1):\n \"\"\" Return elapsed time for executing code_str in the\n namespace of the caller for given times.\n \"\"\"\n frame = sys._getframe(1)\n locs,globs = frame.f_locals,frame.f_globals\n code = compile(code_str,\n 'ScipyTestCase runner for '+self.__class__.__name__,\n 'exec')\n i = 0\n elapsed = jiffies()\n while i>> ScipyTest().test(level=1,verbosity=2)\n\n is package name or its module object.\n\n Package is supposed to contain a directory tests/\n with test_*.py files where * refers to the names of submodules.\n\n test_*.py files are supposed to define a classes, derived\n from ScipyTestCase or unittest.TestCase, with methods having\n names starting with test or bench or check.\n\n And that is it! No need to implement test or test_suite functions\n in each .py file.\n\n Also old styled test_suite(level=1) hooks are supported but\n soon to be removed.\n \"\"\"\n def __init__(self, package='__main__'):\n self.package = package\n\n def _module_str(self, module):\n filename = module.__file__[-30:]\n if filename!=module.__file__:\n filename = '...'+filename\n return '' % (`module.__name__`, `filename`)\n\n def _get_method_names(self,clsobj,level):\n names = []\n for mthname in _get_all_method_names(clsobj):\n if mthname[:5] not in ['bench','check'] \\\n and mthname[:4] not in ['test']:\n continue\n mth = getattr(clsobj, mthname)\n if type(mth) is not types.MethodType:\n continue\n d = mth.im_func.func_defaults\n if d is not None:\n mthlevel = d[0]\n else:\n mthlevel = 1\n if level>=mthlevel:\n if mthname not in names:\n names.append(mthname)\n for base in clsobj.__bases__:\n for n in self._get_method_names(base,level):\n if n not in names:\n names.append(n) \n return names\n\n def _get_module_tests(self,module,level):\n mstr = self._module_str\n d,f = os.path.split(module.__file__)\n\n short_module_name = os.path.splitext(os.path.basename(f))[0]\n if short_module_name=='__init__':\n short_module_name = module.__name__.split('.')[-1]\n\n test_dir = os.path.join(d,'tests')\n test_file = os.path.join(test_dir,'test_'+short_module_name+'.py')\n\n local_test_dir = os.path.join(os.getcwd(),'tests')\n local_test_file = os.path.join(local_test_dir,\n 'test_'+short_module_name+'.py')\n if os.path.basename(os.path.dirname(local_test_dir)) \\\n == os.path.basename(os.path.dirname(test_dir)) \\\n and os.path.isfile(local_test_file):\n test_file = local_test_file\n\n if not os.path.isfile(test_file):\n if short_module_name[:5]=='info_' \\\n and short_module_name[5:]==module.__name__.split('.')[-2]:\n return []\n if short_module_name in ['__cvs_version__','__svn_version__']:\n return []\n if short_module_name[-8:]=='_version' \\\n and short_module_name[:-8]==module.__name__.split('.')[-2]:\n return []\n print test_file\n print ' !! No test file %r found for %s' \\\n % (os.path.basename(test_file), mstr(module))\n return []\n\n try:\n if sys.version[:3]=='2.1':\n # Workaround for Python 2.1 .pyc file generator bug\n import random\n pref = '-nopyc'+`random.randint(1,100)`\n else:\n pref = ''\n f = open(test_file,'r')\n test_module = imp.load_module(\\\n module.__name__+'.test_'+short_module_name+pref,\n f, test_file+pref,('.py', 'r', 1))\n f.close()\n if sys.version[:3]=='2.1' and os.path.isfile(test_file+pref+'c'):\n os.remove(test_file+pref+'c')\n except:\n print ' !! FAILURE importing tests for ', mstr(module)\n print ' ',\n output_exception()\n return []\n return self._get_suite_list(test_module, level, module.__name__)\n\n def _get_suite_list(self, test_module, level, module_name='__main__'):\n mstr = self._module_str\n if hasattr(test_module,'test_suite'):\n # Using old styled test suite\n try:\n total_suite = test_module.test_suite(level)\n return total_suite._tests\n except:\n print ' !! FAILURE building tests for ', mstr(test_module)\n print ' ',\n output_exception()\n return []\n suite_list = []\n for name in dir(test_module):\n obj = getattr(test_module, name)\n if type(obj) is not type(unittest.TestCase) \\\n or not issubclass(obj, unittest.TestCase) \\\n or obj.__name__[:4] != 'test':\n continue\n for mthname in self._get_method_names(obj,level):\n suite = obj(mthname)\n if getattr(suite,'isrunnable',lambda mthname:1)(mthname):\n suite_list.append(suite)\n print ' Found',len(suite_list),'tests for',module_name\n return suite_list\n\n def test(self,level=1,verbosity=1):\n \"\"\" Run Scipy module test suite with level and verbosity.\n \"\"\"\n if type(self.package) is type(''):\n exec 'import %s as this_package' % (self.package)\n else:\n this_package = self.package\n\n package_name = this_package.__name__\n\n suites = []\n for name, module in sys.modules.items():\n if package_name != name[:len(package_name)] \\\n or module is None \\\n or os.path.basename(os.path.dirname(module.__file__))=='tests':\n continue\n suites.extend(self._get_module_tests(module, level))\n\n suites.extend(self._get_suite_list(sys.modules[package_name], level))\n\n all_tests = unittest.TestSuite(suites)\n runner = unittest.TextTestRunner(verbosity=verbosity)\n runner.run(all_tests)\n return runner\n\n def run(self):\n \"\"\" Run Scipy module test suite with level and verbosity\n taken from sys.argv. Requires optparse module.\n \"\"\"\n try:\n from optparse import OptionParser\n except ImportError:\n print 'Failed to import optparse module, ignoring.'\n return self.test()\n usage = r'usage: %prog [-v ] [-l ]'\n parser = OptionParser(usage)\n parser.add_option(\"-v\", \"--verbosity\",\n action=\"store\",\n dest=\"verbosity\",\n default=1,\n type='int')\n parser.add_option(\"-l\", \"--level\",\n action=\"store\",\n dest=\"level\",\n default=1,\n type='int')\n (options, args) = parser.parse_args()\n self.test(options.level,options.verbosity)\n\n#------------\n \ndef remove_ignored_patterns(files,pattern):\n from fnmatch import fnmatch\n good_files = []\n for file in files:\n if not fnmatch(file,pattern):\n good_files.append(file)\n return good_files\n\ndef remove_ignored_files(original,ignored_files,cur_dir):\n \"\"\" This is actually expanded to do pattern matching.\n\n \"\"\"\n if not ignored_files: ignored_files = []\n ignored_modules = map(lambda x: x+'.py',ignored_files)\n ignored_packages = ignored_files[:]\n # always ignore setup.py and __init__.py files\n ignored_files = ['setup.py','setup_*.py','__init__.py']\n ignored_files += ignored_modules + ignored_packages\n ignored_files = map(lambda x,cur_dir=cur_dir: os.path.join(cur_dir,x),\n ignored_files)\n #print 'ignored:', ignored_files\n #good_files = filter(lambda x,ignored = ignored_files: x not in ignored,\n # original)\n good_files = original\n for pattern in ignored_files:\n good_files = remove_ignored_patterns(good_files,pattern)\n\n return good_files\n\n__all__.append('harvest_modules')\ndef harvest_modules(package,ignore=None):\n \"\"\"* Retreive a list of all modules that live within a package.\n\n Only retreive files that are immediate children of the\n package -- do not recurse through child packages or\n directories. The returned list contains actual modules, not\n just their names.\n *\"\"\"\n d,f = os.path.split(package.__file__)\n\n # go through the directory and import every py file there.\n common_dir = os.path.join(d,'*.py')\n py_files = glob.glob(common_dir)\n #py_files.remove(os.path.join(d,'__init__.py'))\n #py_files.remove(os.path.join(d,'setup.py'))\n\n py_files = remove_ignored_files(py_files,ignore,d)\n #print 'py_files:', py_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n\n all_modules = []\n for file in py_files:\n d,f = os.path.split(file)\n base,ext = os.path.splitext(f)\n mod = prefix + '.' + base\n #print 'module: import ' + mod\n try:\n exec ('import ' + mod)\n all_modules.append(eval(mod))\n except:\n print 'FAILURE to import ' + mod\n output_exception()\n\n return all_modules\n\n__all__.append('harvest_packages')\ndef harvest_packages(package,ignore = None):\n \"\"\" Retreive a list of all sub-packages that live within a package.\n\n Only retreive packages that are immediate children of this\n package -- do not recurse through child packages or\n directories. The returned list contains actual package objects, not\n just their names.\n \"\"\"\n join = os.path.join\n\n d,f = os.path.split(package.__file__)\n\n common_dir = os.path.abspath(d)\n all_files = os.listdir(d)\n\n all_files = remove_ignored_files(all_files,ignore,'')\n #print 'all_files:', all_files\n try:\n prefix = package.__name__\n except:\n prefix = ''\n all_packages = []\n for directory in all_files:\n path = join(common_dir,directory)\n if os.path.isdir(path) and \\\n os.path.exists(join(path,'__init__.py')):\n sub_package = prefix + '.' + directory\n #print 'sub-package import ' + sub_package\n try:\n exec ('import ' + sub_package)\n all_packages.append(eval(sub_package))\n except:\n print 'FAILURE to import ' + sub_package\n output_exception()\n return all_packages\n\n__all__.append('harvest_modules_and_packages')\ndef harvest_modules_and_packages(package,ignore=None):\n \"\"\" Retreive list of all packages and modules that live within a package.\n\n See harvest_packages() and harvest_modules()\n \"\"\"\n all = harvest_modules(package,ignore) + harvest_packages(package,ignore)\n return all\n\n__all__.append('harvest_test_suites')\ndef harvest_test_suites(package,ignore = None,level=10):\n \"\"\"\n package -- the module to test. This is an actual module object\n (not a string)\n ignore -- a list of module names to omit from the tests\n level -- a value between 1 and 10. 1 will run the minimum number\n of tests. This is a fast \"smoke test\". Tests that take\n longer to run should have higher numbers ranging up to 10.\n \"\"\"\n suites=[]\n test_modules = harvest_modules_and_packages(package,ignore)\n #for i in test_modules:\n # print i.__name__\n for module in test_modules:\n if hasattr(module,'test_suite'):\n try:\n suite = module.test_suite(level=level)\n if suite:\n suites.append(suite)\n else:\n print \" !! FAILURE without error - shouldn't happen\",\n print module.__name__\n except:\n print ' !! FAILURE building test for ', module.__name__\n print ' ',\n output_exception()\n else:\n try:\n print 'No test suite found for ', module.__name__\n except AttributeError:\n # __version__.py getting replaced by a string throws a kink\n # in checking for modules, so we think is a module has\n # actually been overwritten\n print 'No test suite found for ', str(module)\n total_suite = unittest.TestSuite(suites)\n return total_suite\n\n__all__.append('module_test')\ndef module_test(mod_name,mod_file,level=10):\n \"\"\"*\n\n *\"\"\"\n #print 'testing', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);%s.test(%d)' % \\\n ((test_module,)*3 + (level,))\n\n # This would be better cause it forces a reload of the orginal\n # module. It doesn't behave with packages however.\n #test_string = 'reload(%s);import %s;reload(%s);%s.test(%d)' % \\\n # ((mod_name,) + (test_module,)*3)\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n\n__all__.append('module_test_suite')\ndef module_test_suite(mod_name,mod_file,level=10):\n #try:\n print ' creating test suite for:', mod_name\n d,f = os.path.split(mod_file)\n\n # insert the tests directory to the python path\n test_dir = os.path.join(d,'tests')\n sys.path.insert(0,test_dir)\n\n # call the \"test_xxx.test()\" function for the appropriate\n # module.\n\n # This should deal with package naming issues correctly\n short_mod_name = string.split(mod_name,'.')[-1]\n test_module = 'test_' + short_mod_name\n test_string = 'import %s;reload(%s);suite = %s.test_suite(%d)' % \\\n ((test_module,)*3+(level,))\n #print test_string\n exec(test_string)\n\n # remove test directory from python path.\n sys.path = sys.path[1:]\n return suite\n #except:\n # print ' !! FAILURE loading test suite from', test_module, ':'\n # print ' ',\n # output_exception()\n\n\n# Utility function to facilitate testing.\n\n__all__.append('assert_equal')\ndef assert_equal(actual,desired,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_equal(actual, desired, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert desired == actual, msg\n\n__all__.append('assert_almost_equal')\ndef assert_almost_equal(actual,desired,decimal=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n \"\"\"\n if isinstance(actual, ArrayType) or isinstance(desired, ArrayType):\n return assert_array_almost_equal(actual, desired, decimal, err_msg)\n msg = '\\nItems are not equal:\\n' + err_msg\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert round(abs(desired - actual),decimal) == 0, msg\n\n__all__.append('assert_approx_equal')\ndef assert_approx_equal(actual,desired,significant=7,err_msg='',verbose=1):\n \"\"\" Raise an assertion if two items are not\n equal. I think this should be part of unittest.py\n Approximately equal is defined as the number of significant digits\n correct\n \"\"\"\n msg = '\\nItems are not equal to %d significant digits:\\n' % significant\n msg += err_msg\n actual, desired = map(float, (actual, desired))\n # Normalized the numbers to be in range (-10.0,10.0)\n scale = pow(10,math.floor(math.log10(0.5*(abs(desired)+abs(actual)))))\n try:\n sc_desired = desired/scale\n except ZeroDivisionError:\n sc_desired = 0.0\n try:\n sc_actual = actual/scale\n except ZeroDivisionError:\n sc_actual = 0.0\n try:\n if ( verbose and len(repr(desired)) < 100 and len(repr(actual)) ):\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n except:\n msg = msg \\\n + 'DESIRED: ' + repr(desired) \\\n + '\\nACTUAL: ' + repr(actual)\n assert math.fabs(sc_desired - sc_actual) < pow(10.,-1*significant), msg\n\n\n__all__.append('assert_array_equal')\ndef assert_array_equal(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not equal'\n try:\n assert 0 in [len(shape(x)),len(shape(y))] \\\n or (len(shape(x))==len(shape(y)) and \\\n alltrue(equal(shape(x),shape(y)))),\\\n msg + ' (shapes %s, %s mismatch):\\n\\t' \\\n % (shape(x),shape(y)) + err_msg\n reduced = ravel(equal(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n raise ValueError, msg\n\n__all__.append('assert_array_almost_equal')\ndef assert_array_almost_equal(x,y,decimal=6,err_msg=''):\n x = asarray(x)\n y = asarray(y)\n msg = '\\nArrays are not almost equal'\n try:\n cond = alltrue(equal(shape(x),shape(y)))\n if not cond:\n msg = msg + ' (shapes mismatch):\\n\\t'\\\n 'Shape of array 1: %s\\n\\tShape of array 2: %s' % (shape(x),shape(y))\n assert cond, msg + '\\n\\t' + err_msg\n reduced = ravel(equal(less_equal(around(abs(x-y),decimal),10.0**(-decimal)),1))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=decimal+1)\n s2 = array2string(y,precision=decimal+1)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print sys.exc_value\n print shape(x),shape(y)\n print x, y\n raise ValueError, 'arrays are not almost equal'\n\n__all__.append('assert_array_less')\ndef assert_array_less(x,y,err_msg=''):\n x,y = asarray(x), asarray(y)\n msg = '\\nArrays are not less-ordered'\n try:\n assert alltrue(equal(shape(x),shape(y))),\\\n msg + ' (shapes mismatch):\\n\\t' + err_msg\n reduced = ravel(less(x,y))\n cond = alltrue(reduced)\n if not cond:\n s1 = array2string(x,precision=16)\n s2 = array2string(y,precision=16)\n if len(s1)>120: s1 = s1[:120] + '...'\n if len(s2)>120: s2 = s2[:120] + '...'\n match = 100-100.0*reduced.tolist().count(1)/len(reduced)\n msg = msg + ' (mismatch %s%%):\\n\\tArray 1: %s\\n\\tArray 2: %s' % (match,s1,s2)\n assert cond,\\\n msg + '\\n\\t' + err_msg\n except ValueError:\n print shape(x),shape(y)\n raise ValueError, 'arrays are not less-ordered'\n\n__all__.append('rand')\ndef rand(*args):\n \"\"\"Returns an array of random numbers with the given shape.\n \n This only uses the standard library, so it is useful for testing purposes. \n \"\"\"\n import random\n results = zeros(args,Float64)\n f = results.flat\n for i in range(len(f)):\n f[i] = random.random()\n return results\n\ndef output_exception():\n try:\n type, value, tb = sys.exc_info()\n info = traceback.extract_tb(tb)\n #this is more verbose\n #traceback.print_exc()\n filename, lineno, function, text = info[-1] # last line only\n print \"%s:%d: %s: %s (in %s)\" %\\\n (filename, lineno, type.__name__, str(value), function)\n finally:\n type = value = tb = None # clean up\n\nfrom scipy.base import alltrue, equal, shape, ravel, around, zeros,\\\n Float64, asarray, less_equal, array2string, less, ArrayType\n\ntry:\n from scipy.base import math\nexcept ImportError,msg:\n print msg\n import math\n", "methods": [ { "name": "set_package_path", "long_name": "set_package_path( level = 1 )", "filename": "testing.py", "nloc": 15, "complexity": 4, "token_count": 148, "parameters": [ "level" ], "start_line": 44, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "set_local_path", "long_name": "set_local_path( reldir = '' , level = 1 )", "filename": "testing.py", "nloc": 11, "complexity": 3, "token_count": 99, "parameters": [ "reldir", "level" ], "start_line": 78, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "testing.py", "nloc": 4, "complexity": 2, "token_count": 25, "parameters": [], "start_line": 97, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "jiffies", "long_name": "jiffies( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "_proc_pid_stat" ], "start_line": 104, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "_proc_pid_stat" ], "start_line": 116, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "jiffies", "long_name": "jiffies( _load_time = time . time ( )", "filename": "testing.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "_load_time" ], "start_line": 130, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [], "start_line": 135, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "measure", "long_name": "measure( self , code_str , times = 1 )", "filename": "testing.py", "nloc": 13, "complexity": 2, "token_count": 82, "parameters": [ "self", "code_str", "times" ], "start_line": 142, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , result = None )", "filename": "testing.py", "nloc": 24, "complexity": 6, "token_count": 224, "parameters": [ "self", "result" ], "start_line": 159, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , stream )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "self", "stream" ], "start_line": 186, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "write", "long_name": "write( self , message )", "filename": "testing.py", "nloc": 6, "complexity": 3, "token_count": 47, "parameters": [ "self", "message" ], "start_line": 189, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "writeln", "long_name": "writeln( self , message )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "message" ], "start_line": 195, "end_line": 196, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_get_all_method_names", "long_name": "_get_all_method_names( cls )", "filename": "testing.py", "nloc": 8, "complexity": 5, "token_count": 56, "parameters": [ "cls" ], "start_line": 204, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package = '__main__' )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "package" ], "start_line": 235, "end_line": 236, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_module_str", "long_name": "_module_str( self , module )", "filename": "testing.py", "nloc": 5, "complexity": 2, "token_count": 43, "parameters": [ "self", "module" ], "start_line": 238, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "_get_method_names", "long_name": "_get_method_names( self , clsobj , level )", "filename": "testing.py", "nloc": 22, "complexity": 11, "token_count": 142, "parameters": [ "self", "clsobj", "level" ], "start_line": 244, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level , verbosity )", "filename": "testing.py", "nloc": 48, "complexity": 15, "token_count": 437, "parameters": [ "self", "module", "level", "verbosity" ], "start_line": 267, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "_get_suite_list", "long_name": "_get_suite_list( self , test_module , level , module_name = '__main__' )", "filename": "testing.py", "nloc": 24, "complexity": 9, "token_count": 168, "parameters": [ "self", "test_module", "level", "module_name" ], "start_line": 322, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "test", "long_name": "test( self , level = 1 , verbosity = 1 )", "filename": "testing.py", "nloc": 18, "complexity": 6, "token_count": 162, "parameters": [ "self", "level", "verbosity" ], "start_line": 348, "end_line": 371, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "testing.py", "nloc": 20, "complexity": 2, "token_count": 104, "parameters": [ "self" ], "start_line": 373, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "remove_ignored_patterns", "long_name": "remove_ignored_patterns( files , pattern )", "filename": "testing.py", "nloc": 7, "complexity": 3, "token_count": 37, "parameters": [ "files", "pattern" ], "start_line": 399, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "remove_ignored_files", "long_name": "remove_ignored_files( original , ignored_files , cur_dir )", "filename": "testing.py", "nloc": 12, "complexity": 3, "token_count": 93, "parameters": [ "original", "ignored_files", "cur_dir" ], "start_line": 407, "end_line": 426, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "harvest_modules", "long_name": "harvest_modules( package , ignore = None )", "filename": "testing.py", "nloc": 21, "complexity": 4, "token_count": 134, "parameters": [ "package", "ignore" ], "start_line": 429, "end_line": 465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "harvest_packages", "long_name": "harvest_packages( package , ignore = None )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 148, "parameters": [ "package", "ignore" ], "start_line": 468, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "harvest_modules_and_packages", "long_name": "harvest_modules_and_packages( package , ignore = None )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "package", "ignore" ], "start_line": 505, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "harvest_test_suites", "long_name": "harvest_test_suites( package , ignore = None , level = 10 )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 113, "parameters": [ "package", "ignore", "level" ], "start_line": 514, "end_line": 549, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "module_test", "long_name": "module_test( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 10, "complexity": 1, "token_count": 98, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 552, "end_line": 579, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "module_test_suite", "long_name": "module_test_suite( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 12, "complexity": 1, "token_count": 103, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 582, "end_line": 604, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "assert_equal", "long_name": "assert_equal( actual , desired , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 116, "parameters": [ "actual", "desired", "err_msg", "verbose" ], "start_line": 614, "end_line": 630, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_almost_equal", "long_name": "assert_almost_equal( actual , desired , decimal = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 132, "parameters": [ "actual", "desired", "decimal", "err_msg", "verbose" ], "start_line": 633, "end_line": 649, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_approx_equal", "long_name": "assert_approx_equal( actual , desired , significant = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 23, "complexity": 7, "token_count": 191, "parameters": [ "actual", "desired", "significant", "err_msg", "verbose" ], "start_line": 652, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "assert_array_equal", "long_name": "assert_array_equal( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 22, "complexity": 7, "token_count": 232, "parameters": [ "x", "y", "err_msg" ], "start_line": 684, "end_line": 705, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "assert_array_almost_equal", "long_name": "assert_array_almost_equal( x , y , decimal = 6 , err_msg = '' )", "filename": "testing.py", "nloc": 26, "complexity": 6, "token_count": 251, "parameters": [ "x", "y", "decimal", "err_msg" ], "start_line": 708, "end_line": 733, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "assert_array_less", "long_name": "assert_array_less( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 20, "complexity": 5, "token_count": 189, "parameters": [ "x", "y", "err_msg" ], "start_line": 736, "end_line": 755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "rand", "long_name": "rand( * args )", "filename": "testing.py", "nloc": 7, "complexity": 2, "token_count": 45, "parameters": [ "args" ], "start_line": 758, "end_line": 768, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "output_exception", "long_name": "output_exception( )", "filename": "testing.py", "nloc": 9, "complexity": 2, "token_count": 67, "parameters": [], "start_line": 770, "end_line": 780, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "methods_before": [ { "name": "set_package_path", "long_name": "set_package_path( level = 1 )", "filename": "testing.py", "nloc": 15, "complexity": 4, "token_count": 148, "parameters": [ "level" ], "start_line": 44, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "set_local_path", "long_name": "set_local_path( reldir = '' , level = 1 )", "filename": "testing.py", "nloc": 11, "complexity": 3, "token_count": 99, "parameters": [ "reldir", "level" ], "start_line": 78, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "testing.py", "nloc": 4, "complexity": 2, "token_count": 25, "parameters": [], "start_line": 97, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "jiffies", "long_name": "jiffies( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "_proc_pid_stat" ], "start_line": 104, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( _proc_pid_stat = '/proc/%s/stat' % ( os . getpid ( )", "filename": "testing.py", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "_proc_pid_stat" ], "start_line": 116, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "jiffies", "long_name": "jiffies( _load_time = time . time ( )", "filename": "testing.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "_load_time" ], "start_line": 130, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "memusage", "long_name": "memusage( )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [], "start_line": 135, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "measure", "long_name": "measure( self , code_str , times = 1 )", "filename": "testing.py", "nloc": 13, "complexity": 2, "token_count": 82, "parameters": [ "self", "code_str", "times" ], "start_line": 142, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , result = None )", "filename": "testing.py", "nloc": 24, "complexity": 6, "token_count": 224, "parameters": [ "self", "result" ], "start_line": 159, "end_line": 183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , stream )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "self", "stream" ], "start_line": 186, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "write", "long_name": "write( self , message )", "filename": "testing.py", "nloc": 6, "complexity": 3, "token_count": 47, "parameters": [ "self", "message" ], "start_line": 189, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "writeln", "long_name": "writeln( self , message )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "message" ], "start_line": 195, "end_line": 196, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_get_all_method_names", "long_name": "_get_all_method_names( cls )", "filename": "testing.py", "nloc": 8, "complexity": 5, "token_count": 56, "parameters": [ "cls" ], "start_line": 204, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package = '__main__' )", "filename": "testing.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "package" ], "start_line": 235, "end_line": 236, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_module_str", "long_name": "_module_str( self , module )", "filename": "testing.py", "nloc": 5, "complexity": 2, "token_count": 43, "parameters": [ "self", "module" ], "start_line": 238, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "_get_method_names", "long_name": "_get_method_names( self , clsobj , level )", "filename": "testing.py", "nloc": 22, "complexity": 11, "token_count": 142, "parameters": [ "self", "clsobj", "level" ], "start_line": 244, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level )", "filename": "testing.py", "nloc": 47, "complexity": 14, "token_count": 430, "parameters": [ "self", "module", "level" ], "start_line": 267, "end_line": 319, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "_get_suite_list", "long_name": "_get_suite_list( self , test_module , level , module_name = '__main__' )", "filename": "testing.py", "nloc": 24, "complexity": 9, "token_count": 168, "parameters": [ "self", "test_module", "level", "module_name" ], "start_line": 321, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "test", "long_name": "test( self , level = 1 , verbosity = 1 )", "filename": "testing.py", "nloc": 18, "complexity": 6, "token_count": 160, "parameters": [ "self", "level", "verbosity" ], "start_line": 347, "end_line": 370, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "testing.py", "nloc": 20, "complexity": 2, "token_count": 104, "parameters": [ "self" ], "start_line": 372, "end_line": 394, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "remove_ignored_patterns", "long_name": "remove_ignored_patterns( files , pattern )", "filename": "testing.py", "nloc": 7, "complexity": 3, "token_count": 37, "parameters": [ "files", "pattern" ], "start_line": 398, "end_line": 404, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "remove_ignored_files", "long_name": "remove_ignored_files( original , ignored_files , cur_dir )", "filename": "testing.py", "nloc": 12, "complexity": 3, "token_count": 93, "parameters": [ "original", "ignored_files", "cur_dir" ], "start_line": 406, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "harvest_modules", "long_name": "harvest_modules( package , ignore = None )", "filename": "testing.py", "nloc": 21, "complexity": 4, "token_count": 134, "parameters": [ "package", "ignore" ], "start_line": 428, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "harvest_packages", "long_name": "harvest_packages( package , ignore = None )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 148, "parameters": [ "package", "ignore" ], "start_line": 467, "end_line": 501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "harvest_modules_and_packages", "long_name": "harvest_modules_and_packages( package , ignore = None )", "filename": "testing.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "package", "ignore" ], "start_line": 504, "end_line": 510, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "harvest_test_suites", "long_name": "harvest_test_suites( package , ignore = None , level = 10 )", "filename": "testing.py", "nloc": 23, "complexity": 6, "token_count": 113, "parameters": [ "package", "ignore", "level" ], "start_line": 513, "end_line": 548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "module_test", "long_name": "module_test( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 10, "complexity": 1, "token_count": 98, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 551, "end_line": 578, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "module_test_suite", "long_name": "module_test_suite( mod_name , mod_file , level = 10 )", "filename": "testing.py", "nloc": 12, "complexity": 1, "token_count": 103, "parameters": [ "mod_name", "mod_file", "level" ], "start_line": 581, "end_line": 603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "assert_equal", "long_name": "assert_equal( actual , desired , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 116, "parameters": [ "actual", "desired", "err_msg", "verbose" ], "start_line": 613, "end_line": 629, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_almost_equal", "long_name": "assert_almost_equal( actual , desired , decimal = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 14, "complexity": 7, "token_count": 132, "parameters": [ "actual", "desired", "decimal", "err_msg", "verbose" ], "start_line": 632, "end_line": 648, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "assert_approx_equal", "long_name": "assert_approx_equal( actual , desired , significant = 7 , err_msg = '' , verbose = 1 )", "filename": "testing.py", "nloc": 23, "complexity": 7, "token_count": 191, "parameters": [ "actual", "desired", "significant", "err_msg", "verbose" ], "start_line": 651, "end_line": 679, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "assert_array_equal", "long_name": "assert_array_equal( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 22, "complexity": 7, "token_count": 232, "parameters": [ "x", "y", "err_msg" ], "start_line": 683, "end_line": 704, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "assert_array_almost_equal", "long_name": "assert_array_almost_equal( x , y , decimal = 6 , err_msg = '' )", "filename": "testing.py", "nloc": 26, "complexity": 6, "token_count": 251, "parameters": [ "x", "y", "decimal", "err_msg" ], "start_line": 707, "end_line": 732, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "assert_array_less", "long_name": "assert_array_less( x , y , err_msg = '' )", "filename": "testing.py", "nloc": 20, "complexity": 5, "token_count": 189, "parameters": [ "x", "y", "err_msg" ], "start_line": 735, "end_line": 754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "rand", "long_name": "rand( * args )", "filename": "testing.py", "nloc": 7, "complexity": 2, "token_count": 45, "parameters": [ "args" ], "start_line": 757, "end_line": 767, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "output_exception", "long_name": "output_exception( )", "filename": "testing.py", "nloc": 9, "complexity": 2, "token_count": 67, "parameters": [], "start_line": 769, "end_line": 779, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level , verbosity )", "filename": "testing.py", "nloc": 48, "complexity": 15, "token_count": 437, "parameters": [ "self", "module", "level", "verbosity" ], "start_line": 267, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "_get_module_tests", "long_name": "_get_module_tests( self , module , level )", "filename": "testing.py", "nloc": 47, "complexity": 14, "token_count": 430, "parameters": [ "self", "module", "level" ], "start_line": 267, "end_line": 319, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "test", "long_name": "test( self , level = 1 , verbosity = 1 )", "filename": "testing.py", "nloc": 18, "complexity": 6, "token_count": 162, "parameters": [ "self", "level", "verbosity" ], "start_line": 348, "end_line": 371, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 } ], "nloc": 586, "complexity": 146, "token_count": 4190, "diff_parsed": { "added": [ " def _get_module_tests(self,module,level,verbosity):", " if verbosity>1:", " print test_file", " print ' !! No test file %r found for %s' \\", " % (os.path.basename(test_file), mstr(module))", " suites.extend(self._get_module_tests(module, level, verbosity))" ], "deleted": [ " def _get_module_tests(self,module,level):", " print test_file", " print ' !! No test file %r found for %s' \\", " % (os.path.basename(test_file), mstr(module))", " suites.extend(self._get_module_tests(module, level))" ] } } ] }, { "hash": "704e5a103b9fb5944f41b81bd8e7217e1157b033", "msg": "Renamed test_basic to test_umath.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T10:51:09+00:00", "author_timezone": 0, "committer_date": "2005-10-13T10:51:09+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "7768c2e4e25134c29bc145ca06f42fdbddead216" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 6, "insertions": 3, "lines": 9, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy/base/tests/test_basic.py", "new_path": "scipy/base/tests/test_umath.py", "filename": "test_umath.py", "extension": "py", "change_type": "RENAME", "diff": "@@ -1,21 +1,18 @@\n-import unittest\n import sys\n from scipy.test.testing import *\n set_package_path()\n-import scipy.base;reload(scipy.base)\n-#from scipy.base import fastumath;reload(fastumath)\n+from scipy.base.umath import minimum, maximum\n del sys.path[0]\n \n \n class test_maximum(ScipyTestCase):\n def check_reduce_complex(self):\n- x = [1,2]\n assert_equal(maximum.reduce([1,2j]),1)\n+ assert_equal(maximum.reduce([1+3j,2j]),1+3j)\n \n class test_minimum(ScipyTestCase):\n def check_reduce_complex(self):\n- x = [1,2]\n assert_equal(minimum.reduce([1,2j]),2j)\n \n if __name__ == \"__main__\":\n- ScipyTest('scipy.base').run()\n+ ScipyTest().run()\n", "added_lines": 3, "deleted_lines": 6, "source_code": "import sys\nfrom scipy.test.testing import *\nset_package_path()\nfrom scipy.base.umath import minimum, maximum\ndel sys.path[0]\n\n\nclass test_maximum(ScipyTestCase):\n def check_reduce_complex(self):\n assert_equal(maximum.reduce([1,2j]),1)\n assert_equal(maximum.reduce([1+3j,2j]),1+3j)\n\nclass test_minimum(ScipyTestCase):\n def check_reduce_complex(self):\n assert_equal(minimum.reduce([1,2j]),2j)\n\nif __name__ == \"__main__\":\n ScipyTest().run()\n", "source_code_before": "import unittest\nimport sys\nfrom scipy.test.testing import *\nset_package_path()\nimport scipy.base;reload(scipy.base)\n#from scipy.base import fastumath;reload(fastumath)\ndel sys.path[0]\n\n\nclass test_maximum(ScipyTestCase):\n def check_reduce_complex(self):\n x = [1,2]\n assert_equal(maximum.reduce([1,2j]),1)\n\nclass test_minimum(ScipyTestCase):\n def check_reduce_complex(self):\n x = [1,2]\n assert_equal(minimum.reduce([1,2j]),2j)\n\nif __name__ == \"__main__\":\n ScipyTest('scipy.base').run()\n", "methods": [ { "name": "check_reduce_complex", "long_name": "check_reduce_complex( self )", "filename": "test_umath.py", "nloc": 3, "complexity": 1, "token_count": 39, "parameters": [ "self" ], "start_line": 9, "end_line": 11, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "check_reduce_complex", "long_name": "check_reduce_complex( self )", "filename": "test_umath.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 14, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "methods_before": [ { "name": "check_reduce_complex", "long_name": "check_reduce_complex( self )", "filename": "test_umath.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self" ], "start_line": 11, "end_line": 13, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "check_reduce_complex", "long_name": "check_reduce_complex( self )", "filename": "test_umath.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "self" ], "start_line": 16, "end_line": 18, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "check_reduce_complex", "long_name": "check_reduce_complex( self )", "filename": "test_umath.py", "nloc": 3, "complexity": 1, "token_count": 39, "parameters": [ "self" ], "start_line": 9, "end_line": 11, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "nloc": 14, "complexity": 2, "token_count": 115, "diff_parsed": { "added": [ "from scipy.base.umath import minimum, maximum", " assert_equal(maximum.reduce([1+3j,2j]),1+3j)", " ScipyTest().run()" ], "deleted": [ "import unittest", "import scipy.base;reload(scipy.base)", "#from scipy.base import fastumath;reload(fastumath)", " x = [1,2]", " x = [1,2]", " ScipyTest('scipy.base').run()" ] } } ] }, { "hash": "a0cf73d306900fead84790658cb94fbb11792f16", "msg": "Renamed test_limits to test_getlimits.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T11:00:13+00:00", "author_timezone": 0, "committer_date": "2005-10-13T11:00:13+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "704e5a103b9fb5944f41b81bd8e7217e1157b033" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 3, "insertions": 2, "lines": 5, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/tests/test_limits.py", "new_path": "scipy/base/tests/test_getlimits.py", "filename": "test_getlimits.py", "extension": "py", "change_type": "RENAME", "diff": "@@ -10,7 +10,7 @@\n from scipy.test.testing import *\n set_package_path()\n import scipy.base;reload(scipy.base)\n-from scipy.base import *\n+from scipy.base.getlimits import *\n del sys.path[0]\n \n ##################################################\n@@ -25,5 +25,4 @@ def check_nothing(self):\n pass\n \n if __name__ == \"__main__\":\n- ScipyTest('scipy.base.limits').run()\n-\n+ ScipyTest().run()\n", "added_lines": 2, "deleted_lines": 3, "source_code": "\"\"\" Test functions for limits module.\n\n Currently empty -- not sure how to test these values\n and routines as they are machine dependent. Suggestions?\n\"\"\"\n\nimport unittest\nimport sys\n\nfrom scipy.test.testing import *\nset_package_path()\nimport scipy.base;reload(scipy.base)\nfrom scipy.base.getlimits import *\ndel sys.path[0]\n\n##################################################\n### Test for sum\n\nclass test_float(unittest.TestCase):\n def check_nothing(self):\n pass\n\nclass test_double(unittest.TestCase):\n def check_nothing(self):\n pass\n\nif __name__ == \"__main__\":\n ScipyTest().run()\n", "source_code_before": "\"\"\" Test functions for limits module.\n\n Currently empty -- not sure how to test these values\n and routines as they are machine dependent. Suggestions?\n\"\"\"\n\nimport unittest\nimport sys\n\nfrom scipy.test.testing import *\nset_package_path()\nimport scipy.base;reload(scipy.base)\nfrom scipy.base import *\ndel sys.path[0]\n\n##################################################\n### Test for sum\n\nclass test_float(unittest.TestCase):\n def check_nothing(self):\n pass\n\nclass test_double(unittest.TestCase):\n def check_nothing(self):\n pass\n\nif __name__ == \"__main__\":\n ScipyTest('scipy.base.limits').run()\n\n", "methods": [ { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 20, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 24, "end_line": 25, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "methods_before": [ { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 20, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 24, "end_line": 25, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "changed_methods": [], "nloc": 20, "complexity": 2, "token_count": 84, "diff_parsed": { "added": [ "from scipy.base.getlimits import *", " ScipyTest().run()" ], "deleted": [ "from scipy.base import *", " ScipyTest('scipy.base.limits').run()", "" ] } } ] }, { "hash": "1bb2bc4125a803bbce59b3f0485af9f9b92858ed", "msg": "Added initial scipy.basic.tests site.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T11:36:03+00:00", "author_timezone": 0, "committer_date": "2005-10-13T11:36:03+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "a0cf73d306900fead84790658cb94fbb11792f16" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 0, "insertions": 53, "lines": 53, "files": 3, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/basic/__init__.py", "new_path": "scipy/basic/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -1 +1,4 @@\n # To get sub-modules\n+\n+from scipy.test.testing import ScipyTest \n+test = ScipyTest('scipy.basic').test\n", "added_lines": 3, "deleted_lines": 0, "source_code": "# To get sub-modules\n\nfrom scipy.test.testing import ScipyTest \ntest = ScipyTest('scipy.basic').test\n", "source_code_before": "# To get sub-modules\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 2, "complexity": 0, "token_count": 16, "diff_parsed": { "added": [ "", "from scipy.test.testing import ScipyTest", "test = ScipyTest('scipy.basic').test" ], "deleted": [] } }, { "old_path": null, "new_path": "scipy/basic/setup.py", "filename": "setup.py", "extension": "py", "change_type": "ADD", "diff": "@@ -0,0 +1,5 @@\n+def configuration(parent_package='',top_path=None):\n+ from scipy.distutils.misc_util import Configuration\n+ config = Configuration('basic',parent_package,top_path)\n+ config.add_data_dir('tests')\n+ return config\n", "added_lines": 5, "deleted_lines": 0, "source_code": "def configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('basic',parent_package,top_path)\n config.add_data_dir('tests')\n return config\n", "source_code_before": null, "methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 5, "complexity": 1, "token_count": 37, "parameters": [ "parent_package", "top_path" ], "start_line": 1, "end_line": 5, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 } ], "methods_before": [], "changed_methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 5, "complexity": 1, "token_count": 37, "parameters": [ "parent_package", "top_path" ], "start_line": 1, "end_line": 5, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 } ], "nloc": 5, "complexity": 1, "token_count": 38, "diff_parsed": { "added": [ "def configuration(parent_package='',top_path=None):", " from scipy.distutils.misc_util import Configuration", " config = Configuration('basic',parent_package,top_path)", " config.add_data_dir('tests')", " return config" ], "deleted": [] } }, { "old_path": null, "new_path": "scipy/basic/tests/test_helper.py", "filename": "test_helper.py", "extension": "py", "change_type": "ADD", "diff": "@@ -0,0 +1,45 @@\n+#!/usr/bin/env python\n+# Copied from fftpack.helper by Pearu Peterson, October 2005\n+\"\"\" Test functions for fftpack.helper module\n+\"\"\"\n+\n+import sys\n+from scipy.test.testing import *\n+set_package_path()\n+from scipy.basic.helper import fftshift,ifftshift,fftfreq\n+del sys.path[0]\n+\n+from scipy import pi\n+\n+def random(size):\n+ return rand(*size)\n+\n+class test_fftshift(ScipyTestCase):\n+\n+ def check_definition(self):\n+ x = [0,1,2,3,4,-4,-3,-2,-1]\n+ y = [-4,-3,-2,-1,0,1,2,3,4]\n+ assert_array_almost_equal(fftshift(x),y)\n+ assert_array_almost_equal(ifftshift(y),x)\n+ x = [0,1,2,3,4,-5,-4,-3,-2,-1]\n+ y = [-5,-4,-3,-2,-1,0,1,2,3,4]\n+ assert_array_almost_equal(fftshift(x),y)\n+ assert_array_almost_equal(ifftshift(y),x)\n+\n+ def check_inverse(self):\n+ for n in [1,4,9,100,211]:\n+ x = random((n,))\n+ assert_array_almost_equal(ifftshift(fftshift(x)),x)\n+\n+class test_fftfreq(ScipyTestCase):\n+\n+ def check_definition(self):\n+ x = [0,1,2,3,4,-4,-3,-2,-1]\n+ assert_array_almost_equal(9*fftfreq(9),x)\n+ assert_array_almost_equal(9*pi*fftfreq(9,pi),x)\n+ x = [0,1,2,3,4,-5,-4,-3,-2,-1]\n+ assert_array_almost_equal(10*fftfreq(10),x)\n+ assert_array_almost_equal(10*pi*fftfreq(10,pi),x)\n+\n+if __name__ == \"__main__\":\n+ ScipyTest().run()\n", "added_lines": 45, "deleted_lines": 0, "source_code": "#!/usr/bin/env python\n# Copied from fftpack.helper by Pearu Peterson, October 2005\n\"\"\" Test functions for fftpack.helper module\n\"\"\"\n\nimport sys\nfrom scipy.test.testing import *\nset_package_path()\nfrom scipy.basic.helper import fftshift,ifftshift,fftfreq\ndel sys.path[0]\n\nfrom scipy import pi\n\ndef random(size):\n return rand(*size)\n\nclass test_fftshift(ScipyTestCase):\n\n def check_definition(self):\n x = [0,1,2,3,4,-4,-3,-2,-1]\n y = [-4,-3,-2,-1,0,1,2,3,4]\n assert_array_almost_equal(fftshift(x),y)\n assert_array_almost_equal(ifftshift(y),x)\n x = [0,1,2,3,4,-5,-4,-3,-2,-1]\n y = [-5,-4,-3,-2,-1,0,1,2,3,4]\n assert_array_almost_equal(fftshift(x),y)\n assert_array_almost_equal(ifftshift(y),x)\n\n def check_inverse(self):\n for n in [1,4,9,100,211]:\n x = random((n,))\n assert_array_almost_equal(ifftshift(fftshift(x)),x)\n\nclass test_fftfreq(ScipyTestCase):\n\n def check_definition(self):\n x = [0,1,2,3,4,-4,-3,-2,-1]\n assert_array_almost_equal(9*fftfreq(9),x)\n assert_array_almost_equal(9*pi*fftfreq(9,pi),x)\n x = [0,1,2,3,4,-5,-4,-3,-2,-1]\n assert_array_almost_equal(10*fftfreq(10),x)\n assert_array_almost_equal(10*pi*fftfreq(10,pi),x)\n\nif __name__ == \"__main__\":\n ScipyTest().run()\n", "source_code_before": null, "methods": [ { "name": "random", "long_name": "random( size )", "filename": "test_helper.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "size" ], "start_line": 14, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "check_definition", "long_name": "check_definition( self )", "filename": "test_helper.py", "nloc": 9, "complexity": 1, "token_count": 147, "parameters": [ "self" ], "start_line": 19, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "check_inverse", "long_name": "check_inverse( self )", "filename": "test_helper.py", "nloc": 4, "complexity": 2, "token_count": 41, "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": "check_definition", "long_name": "check_definition( self )", "filename": "test_helper.py", "nloc": 7, "complexity": 1, "token_count": 110, "parameters": [ "self" ], "start_line": 36, "end_line": 42, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [], "changed_methods": [ { "name": "check_inverse", "long_name": "check_inverse( self )", "filename": "test_helper.py", "nloc": 4, "complexity": 2, "token_count": 41, "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": "random", "long_name": "random( size )", "filename": "test_helper.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "size" ], "start_line": 14, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "check_definition", "long_name": "check_definition( self )", "filename": "test_helper.py", "nloc": 9, "complexity": 1, "token_count": 147, "parameters": [ "self" ], "start_line": 19, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 } ], "nloc": 34, "complexity": 5, "token_count": 374, "diff_parsed": { "added": [ "#!/usr/bin/env python", "# Copied from fftpack.helper by Pearu Peterson, October 2005", "\"\"\" Test functions for fftpack.helper module", "\"\"\"", "", "import sys", "from scipy.test.testing import *", "set_package_path()", "from scipy.basic.helper import fftshift,ifftshift,fftfreq", "del sys.path[0]", "", "from scipy import pi", "", "def random(size):", " return rand(*size)", "", "class test_fftshift(ScipyTestCase):", "", " def check_definition(self):", " x = [0,1,2,3,4,-4,-3,-2,-1]", " y = [-4,-3,-2,-1,0,1,2,3,4]", " assert_array_almost_equal(fftshift(x),y)", " assert_array_almost_equal(ifftshift(y),x)", " x = [0,1,2,3,4,-5,-4,-3,-2,-1]", " y = [-5,-4,-3,-2,-1,0,1,2,3,4]", " assert_array_almost_equal(fftshift(x),y)", " assert_array_almost_equal(ifftshift(y),x)", "", " def check_inverse(self):", " for n in [1,4,9,100,211]:", " x = random((n,))", " assert_array_almost_equal(ifftshift(fftshift(x)),x)", "", "class test_fftfreq(ScipyTestCase):", "", " def check_definition(self):", " x = [0,1,2,3,4,-4,-3,-2,-1]", " assert_array_almost_equal(9*fftfreq(9),x)", " assert_array_almost_equal(9*pi*fftfreq(9,pi),x)", " x = [0,1,2,3,4,-5,-4,-3,-2,-1]", " assert_array_almost_equal(10*fftfreq(10),x)", " assert_array_almost_equal(10*pi*fftfreq(10,pi),x)", "", "if __name__ == \"__main__\":", " ScipyTest().run()" ], "deleted": [] } } ] }, { "hash": "682a8759094a1c347366eb682605ee4460d3842a", "msg": "Made svn version available to main setup.py script.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T14:57:50+00:00", "author_timezone": 0, "committer_date": "2005-10-13T14:57:50+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "1bb2bc4125a803bbce59b3f0485af9f9b92858ed" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 2, "insertions": 5, "lines": 7, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "setup.py", "new_path": "setup.py", "filename": "setup.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -6,7 +6,6 @@ def setup_package():\n \n from scipy.distutils.core import setup\n from scipy.distutils.misc_util import Configuration\n- from scipy.core_version import version\n \n old_path = os.getcwd()\n local_path = os.path.dirname(os.path.abspath(sys.argv[0]))\n@@ -15,7 +14,6 @@ def setup_package():\n \n try:\n config = Configuration(\n- version = version,\n maintainer = \"SciPy Developers\",\n maintainer_email = \"scipy-dev@scipy.org\",\n description = \"Core SciPy\",\n@@ -23,8 +21,13 @@ def setup_package():\n \t license = 'BSD',\n )\n config.add_subpackage('scipy')\n+\n+ from scipy.core_version import version\n config.name = 'scipy_core'\n+ config.dict_append(version=version)\n+\n print config.name,'version',config.version\n+\n setup( **config.todict() )\n finally:\n del sys.path[0]\n", "added_lines": 5, "deleted_lines": 2, "source_code": "\nimport os\nimport sys\n\ndef setup_package():\n\n from scipy.distutils.core import setup\n from scipy.distutils.misc_util import Configuration\n\n old_path = os.getcwd()\n local_path = os.path.dirname(os.path.abspath(sys.argv[0]))\n os.chdir(local_path)\n sys.path.insert(0,local_path)\n\n try:\n config = Configuration(\n maintainer = \"SciPy Developers\",\n maintainer_email = \"scipy-dev@scipy.org\",\n description = \"Core SciPy\",\n url = \"http://numeric.scipy.org\",\n\t license = 'BSD',\n )\n config.add_subpackage('scipy')\n\n from scipy.core_version import version\n config.name = 'scipy_core'\n config.dict_append(version=version)\n\n print config.name,'version',config.version\n\n setup( **config.todict() )\n finally:\n del sys.path[0]\n os.chdir(old_path)\n return\n\nif __name__ == '__main__':\n setup_package()\n", "source_code_before": "\nimport os\nimport sys\n\ndef setup_package():\n\n from scipy.distutils.core import setup\n from scipy.distutils.misc_util import Configuration\n from scipy.core_version import version\n\n old_path = os.getcwd()\n local_path = os.path.dirname(os.path.abspath(sys.argv[0]))\n os.chdir(local_path)\n sys.path.insert(0,local_path)\n\n try:\n config = Configuration(\n version = version,\n maintainer = \"SciPy Developers\",\n maintainer_email = \"scipy-dev@scipy.org\",\n description = \"Core SciPy\",\n url = \"http://numeric.scipy.org\",\n\t license = 'BSD',\n )\n config.add_subpackage('scipy')\n config.name = 'scipy_core'\n print config.name,'version',config.version\n setup( **config.todict() )\n finally:\n del sys.path[0]\n os.chdir(old_path)\n return\n\nif __name__ == '__main__':\n setup_package()\n", "methods": [ { "name": "setup_package", "long_name": "setup_package( )", "filename": "setup.py", "nloc": 25, "complexity": 2, "token_count": 152, "parameters": [], "start_line": 5, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 } ], "methods_before": [ { "name": "setup_package", "long_name": "setup_package( )", "filename": "setup.py", "nloc": 25, "complexity": 2, "token_count": 148, "parameters": [], "start_line": 5, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "setup_package", "long_name": "setup_package( )", "filename": "setup.py", "nloc": 25, "complexity": 2, "token_count": 152, "parameters": [], "start_line": 5, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 } ], "nloc": 29, "complexity": 2, "token_count": 165, "diff_parsed": { "added": [ "", " from scipy.core_version import version", " config.dict_append(version=version)", "", "" ], "deleted": [ " from scipy.core_version import version", " version = version," ] } } ] }, { "hash": "8d0801d77e7c168756bb1068a8f680a420f9b75f", "msg": "Dropped install_init_py file and generating __core_config__.py in order to detect whether we are in source or installatio directory.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-13T14:59:39+00:00", "author_timezone": 0, "committer_date": "2005-10-13T14:59:39+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "682a8759094a1c347366eb682605ee4460d3842a" ], "project_name": "repo_copy", "project_path": "/tmp/tmpodp5wmk7/repo_copy", "deletions": 17, "insertions": 27, "lines": 44, "files": 3, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy/__init__.py", "new_path": "scipy/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -8,11 +8,21 @@\n development.\n \"\"\"\n \n+try:\n+ from __core_config__ import show as show_core_config\n+except ImportError:\n+ show_core_config = None\n \n-import os as _os\n-_install_init = _os.path.join(_os.path.dirname(__file__),'install__init__.py')\n-if _os.path.isfile(_install_init):\n- execfile(_install_init)\n+if show_core_config is None:\n+ print 'Running from scipy core source directory.'\n else:\n- print 'Running from source directory.'\n-del _os\n+ from scipy.base import *\n+ import scipy.basic as basic\n+ from scipy.basic.fft import fft, ifft\n+ from scipy.basic.random import rand, randn\n+ import scipy.basic.fft as fftpack\n+ import scipy.basic.linalg as linalg\n+ import scipy.basic.random as random\n+ from core_version import version as __core_version__\n+ from scipy.test.testing import ScipyTest\n+ test = ScipyTest('scipy').test\n", "added_lines": 16, "deleted_lines": 6, "source_code": "\"\"\"SciPy Core\n\nYou can support the development of SciPy by purchasing documentation at\n\nhttp://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise money for\ndevelopment.\n\"\"\"\n\ntry:\n from __core_config__ import show as show_core_config\nexcept ImportError:\n show_core_config = None\n\nif show_core_config is None:\n print 'Running from scipy core source directory.'\nelse:\n from scipy.base import *\n import scipy.basic as basic\n from scipy.basic.fft import fft, ifft\n from scipy.basic.random import rand, randn\n import scipy.basic.fft as fftpack\n import scipy.basic.linalg as linalg\n import scipy.basic.random as random\n from core_version import version as __core_version__\n from scipy.test.testing import ScipyTest\n test = ScipyTest('scipy').test\n", "source_code_before": "\"\"\"SciPy Core\n\nYou can support the development of SciPy by purchasing documentation at\n\nhttp://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise money for\ndevelopment.\n\"\"\"\n\n\nimport os as _os\n_install_init = _os.path.join(_os.path.dirname(__file__),'install__init__.py')\nif _os.path.isfile(_install_init):\n execfile(_install_init)\nelse:\n print 'Running from source directory.'\ndel _os\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 26, "complexity": 0, "token_count": 102, "diff_parsed": { "added": [ "try:", " from __core_config__ import show as show_core_config", "except ImportError:", " show_core_config = None", "if show_core_config is None:", " print 'Running from scipy core source directory.'", " from scipy.base import *", " import scipy.basic as basic", " from scipy.basic.fft import fft, ifft", " from scipy.basic.random import rand, randn", " import scipy.basic.fft as fftpack", " import scipy.basic.linalg as linalg", " import scipy.basic.random as random", " from core_version import version as __core_version__", " from scipy.test.testing import ScipyTest", " test = ScipyTest('scipy').test" ], "deleted": [ "import os as _os", "_install_init = _os.path.join(_os.path.dirname(__file__),'install__init__.py')", "if _os.path.isfile(_install_init):", " execfile(_install_init)", " print 'Running from source directory.'", "del _os" ] } }, { "old_path": "scipy/distutils/misc_util.py", "new_path": "scipy/distutils/misc_util.py", "filename": "misc_util.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -814,11 +814,20 @@ def generate_svn_version_py():\n def rm_file(f=target):\n try: os.remove(f); print 'removed',f\n except OSError: pass\n+ try: os.remove(f+'c'); print 'removed',f+'c'\n+ except OSError: pass\n atexit.register(rm_file)\n \n return target\n \n- self.add_data_files(generate_svn_version_py)\n+ self.add_data_files(generate_svn_version_py())\n+ return\n+\n+ def make_config_py(self,name='__config__'):\n+ \"\"\" Generate package __config__.py file containing system_info\n+ information used during building the package.\n+ \"\"\"\n+ self.add_extension(name,[generate_config_py])\n return\n \n def get_cmd(cmdname,_cache={}):\n", "added_lines": 10, "deleted_lines": 1, "source_code": "import os\nimport re\nimport sys\nimport imp\nimport copy\nimport types\nimport glob\n\ndef allpath(name):\n \"Convert a /-separated pathname to one using the OS's path separator.\"\n splitted = name.split('/')\n return os.path.join(*splitted)\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" Return path of the module.\n\n Returned path is relative to parent_path when given,\n otherwise it is absolute path.\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 __import__(mod_name)\n mod = sys.modules[mod_name]\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\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\n#########################\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#########################\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 False\n return True\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 True\n return False\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 True\n return False\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\n\ndef _get_headers(directory_list):\n # get *.h files from list of directories\n headers = []\n for dir in directory_list:\n head = glob.glob(os.path.join(dir,\"*.h\")) #XXX: *.hpp files??\n headers.extend(head)\n return headers\n\ndef _get_directories(list_of_sources):\n # get unique directories from list of sources.\n direcs = []\n for file in list_of_sources:\n dir = os.path.split(file)\n if dir[0] != '' and not dir[0] in direcs:\n direcs.append(dir[0])\n return direcs\n\ndef get_dependencies(sources):\n #XXX scan sources for include statements\n return _get_headers(_get_directories(sources))\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n if type(directory) is not type(''):\n return False\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 False\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n\ndef _gsf_visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn','build']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n ext = os.path.splitext(fullname)[1]\n if ext and ext in ['.pyc','.o']:\n continue\n if os.path.isfile(fullname):\n filenames.append(fullname)\n\ndef get_ext_source_files(ext):\n # Get sources and any include files in the same directory.\n filenames = []\n sources = filter(lambda s:type(s) is types.StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_script_files(scripts):\n scripts = filter(lambda s:type(s) is types.StringType,scripts)\n return scripts\n\ndef get_lib_source_files(lib):\n filenames = []\n sources = lib[1].get('sources',[])\n sources = filter(lambda s:type(s) is types.StringType,sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n depends = build_info.get('depends',[])\n for d in depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_data_files(data):\n if type(data) is types.StringType:\n return [data]\n sources = data[1]\n filenames = []\n for s in sources:\n if callable(s):\n s = s()\n if s is None:\n continue\n if is_local_src_dir(s):\n os.path.walk(s,_gsf_visit_func,filenames)\n elif type(s) is type('') and os.path.isfile(s):\n filenames.append(s)\n else:\n raise TypeError,`s`\n return filenames\n\ndef dot_join(*args):\n return '.'.join(filter(None,args))\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\n######################\n\nclass Configuration:\n\n _list_keys = ['packages','ext_modules','data_files','include_dirs',\n 'libraries','headers','scripts']\n _dict_keys = ['package_dir']\n\n scipy_include_dirs = []\n\n def __init__(self,\n package_name=None,\n parent_name=None,\n top_path=None,\n package_path=None,\n **attrs):\n \"\"\" Construct configuration instance of a package.\n \"\"\"\n self.name = dot_join(parent_name, package_name)\n\n caller_frame = get_frame(1)\n caller_name = eval('__name__',caller_frame.f_globals,caller_frame.f_locals)\n \n self.local_path = get_path(caller_name, top_path)\n if top_path is None:\n top_path = self.local_path\n if package_path is None:\n package_path = self.local_path\n elif os.path.isdir(os.path.join(self.local_path,package_path)):\n package_path = os.path.join(self.local_path,package_path)\n self.top_path = top_path\n\n self.list_keys = copy.copy(self._list_keys)\n self.dict_keys = copy.copy(self._dict_keys)\n\n for n in self.list_keys:\n setattr(self,n,copy.copy(attrs.get(n,[])))\n\n for n in self.dict_keys:\n setattr(self,n,copy.copy(attrs.get(n,{})))\n\n known_keys = self.list_keys + self.dict_keys\n self.extra_keys = []\n for n in attrs.keys():\n if n in known_keys:\n continue\n a = attrs[n]\n setattr(self,n,a)\n if type(a) is types.ListType:\n self.list_keys.append(n)\n elif type(a) is types.DictType:\n self.dict_keys.append(n)\n else:\n self.extra_keys.append(n)\n\n if os.path.exists(os.path.join(package_path,'__init__.py')):\n self.packages.append(self.name)\n self.package_dir[self.name] = package_path \n return\n\n def todict(self):\n \"\"\" Return configuration distionary suitable for passing\n to distutils.core.setup() function.\n \"\"\"\n d = {}\n for n in self.list_keys + self.dict_keys + self.extra_keys:\n a = getattr(self,n)\n if a:\n d[n] = a\n if self.name:\n d['name'] = self.name\n return d\n\n def __dict__(self):\n return self.todict()\n\n def get_distribution(self):\n import distutils.core\n dist = distutils.core._setup_distribution \n return dist\n\n def get_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Return subpackage configuration.\n \"\"\"\n if subpackage_name is None:\n assert subpackage_path is not None\n subpackage_name = os.path.basename(subpackage_path)\n assert '.' not in subpackage_name,`subpackage_name`\n if subpackage_path is None:\n subpackage_path = os.path.join(self.local_path,subpackage_name)\n else:\n subpackage_path = self._fix_paths([subpackage_path])[0]\n\n setup_py = os.path.join(subpackage_path,'setup_%s.py' % (subpackage_name))\n if not os.path.isfile(setup_py):\n setup_py = os.path.join(subpackage_path,'setup.py')\n if not os.path.isfile(setup_py):\n print 'Assuming default configuration '\\\n '(%s/{setup_%s,setup}.py was not found)' \\\n % (os.path.dirname(setup_py),subpackage_name)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n # In case setup_py imports local modules:\n sys.path.insert(0,os.path.dirname(setup_py))\n try:\n info = (open(setup_py),setup_py,('.py','U',1))\n setup_name = os.path.splitext(os.path.basename(setup_py))[0]\n n = dot_join(self.name,setup_name)\n setup_module = imp.load_module('_'.join(n.split('.')),*info)\n\n if not hasattr(setup_module,'configuration'):\n print 'Assuming default configuration '\\\n '(%s does not define configuration())' % (setup_module)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n args = (self.name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (self.top_path,)\n config = setup_module.configuration(*args)\n\n finally:\n del sys.path[0]\n\n return config\n\n def add_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Add subpackage to configuration.\n \"\"\"\n config = self.get_subpackage(subpackage_name,subpackage_path)\n\n if not config:\n print 'No configuration returned, assuming unavailable.'\n else:\n\n if isinstance(config,Configuration):\n print 'Appending %s configuration to %s' % (config.name,self.name)\n self.dict_append(**config.todict())\n else:\n print 'Appending %s configuration to %s' % (config.get('name'),self.name)\n self.dict_append(**config)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a subpackage', subpackage_name\n return\n\n def add_data_dir(self,data_path):\n \"\"\" Recursively add files under data_path to data_files list.\n Argument can be either\n - 2-sequence (,)\n - path to data directory where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + subdirname of the path.\n \"\"\"\n if type(data_path) is type(()):\n assert len(data_path)==2,`data_path`\n d,data_path = data_path\n else:\n d = None\n assert type(data_path) is type(''),`data_path`\n for path in self.paths(data_path):\n if not os.path.exists(path):\n print 'Not existing data path',path\n continue\n filenames = []\n os.path.walk(path, _gsf_visit_func,filenames)\n if not os.path.isabs(path):\n if d is None:\n ds = path\n else:\n ds = os.path.join(*([d]+os.path.normpath(path).split()[1:]))\n self.add_data_files((ds,filenames))\n else:\n if d is None:\n self.add_data_files(*filenames)\n else:\n self.add_data_files((d,filenames))\n return\n\n def add_data_files(self,*files):\n \"\"\" Add data files to configuration data_files.\n Argument(s) can be either\n - 2-sequence (,)\n - paths to data files where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + dirname of the path.\n \"\"\"\n data_dict = {}\n for p in files:\n if type(p) is type(''):\n d = os.path.join(*(self.name.split('.')))\n file_list = self.paths(p)\n if not os.path.isabs(p):\n d = appendpath(d,os.path.dirname(p))\n elif type(p) is type(()):\n assert len(p)==2,`p`\n d = p[0]\n if type(p[1]) is type(''):\n file_list = self.paths(p[1])\n else:\n file_list = self.paths(*p[1])\n else:\n # function\n d = os.path.join(*(self.name.split('.')))\n file_list = [p]\n if not data_dict.has_key(d):\n data_dict[d] = file_list[:]\n else:\n data_dict[d].extend(file_list)\n\n dist = self.get_distribution()\n if dist is not None:\n dist.data_files.extend(data_dict.items())\n else:\n self.data_files.extend(data_dict.items())\n return \n \n def add_include_dirs(self,*paths):\n \"\"\" Add paths to configuration include directories.\n \"\"\"\n include_dirs = self._fix_paths(paths)\n dist = self.get_distribution()\n if dist is not None:\n dist.include_dirs.extend(include_dirs)\n else:\n self.include_dirs.extend(include_dirs)\n return\n\n def add_headers(self,*files):\n \"\"\" Add installable headers to configuration.\n Argument(s) can be either\n - 2-sequence (,)\n - path(s) to header file(s) where python includedir suffix will default\n to package name.\n \"\"\"\n headers = []\n for path in files:\n if type(path) is type(''):\n [headers.append((self.name,p)) for p in self.paths(path)]\n else:\n assert type(path) in [type(()),type([])] and len(path)==2,`path`\n [headers.append((path[0],p)) for p in self.paths(path[1])]\n dist = self.get_distribution()\n if dist is not None:\n dist.headers.extend(headers)\n else:\n self.headers.extend(headers)\n return\n\n def _fix_paths(self,paths):\n new_paths = []\n for n in paths:\n if isinstance(n,str):\n if '*' in n or '?' in n:\n p = glob.glob(n)\n p2 = glob.glob(os.path.join(self.local_path,n))\n if p2:\n new_paths.extend(p2)\n elif p:\n new_paths.extend(p)\n else:\n new_paths.append(n)\n else:\n n2 = os.path.join(self.local_path,n)\n if os.path.exists(n2):\n new_paths.append(n2)\n else:\n new_paths.append(n)\n else:\n new_paths.append(n)\n return new_paths\n\n def paths(self,*paths):\n \"\"\" Apply glob to paths and prepend local_path if needed.\n \"\"\"\n return self._fix_paths(paths)\n\n def add_extension(self,name,sources,**kw):\n \"\"\" Add extension to configuration.\n\n Keywords:\n include_dirs, define_macros, undef_macros,\n library_dirs, libraries, runtime_library_dirs,\n extra_objects, extra_compile_args, extra_link_args,\n export_symbols, swig_opts, depends, language,\n f2py_options, module_dirs\n extra_info - dict or list of dict of keywords to be\n appended to keywords.\n \"\"\"\n ext_args = copy.copy(kw)\n ext_args['name'] = dot_join(self.name,name)\n ext_args['sources'] = sources\n\n if ext_args.has_key('extra_info'):\n extra_info = ext_args['extra_info']\n del ext_args['extra_info']\n if type(extra_info) is type({}):\n extra_info = [extra_info]\n for info in extra_info:\n assert type(info) is type({}),`info`\n dict_append(ext_args,**info)\n\n for k in ext_args.keys():\n v = ext_args[k]\n if k in ['sources','depends','include_dirs','library_dirs',\n 'module_dirs','extra_objects']:\n new_v = self._fix_paths(v)\n ext_args[k] = new_v\n\n # Resolve out-of-tree dependencies\n libraries = ext_args.get('libraries',[])\n libnames = []\n ext_args['libraries'] = []\n for libname in libraries:\n if '@' in libname:\n lname,lpath = libname.split('@',1)\n lpath = os.path.abspath(os.path.join(self.local_path,lpath))\n if os.path.isdir(lpath):\n c = self.get_subpackage(None,lpath)\n if isinstance(c,Configuration):\n c = c.todict()\n for l in [l[0] for l in c.get('libraries',[])]:\n llname = l.split('__OF__',1)[0]\n if llname == lname:\n c.pop('name',None)\n dict_append(ext_args,**c)\n break\n continue\n libnames.append(libname)\n\n ext_args['libraries'] = libnames + ext_args['libraries']\n\n from scipy.distutils.core import Extension\n ext = Extension(**ext_args)\n self.ext_modules.append(ext)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add an extension', name\n return ext\n\n def add_library(self,name,sources,**build_info):\n \"\"\" Add library to configuration.\n \n Valid keywords for build_info:\n depends\n macros\n include_dirs\n extra_compiler_args\n f2py_options\n \"\"\"\n build_info = copy.copy(build_info)\n name = name #+ '__OF__' + self.name\n build_info['sources'] = sources\n\n for k in build_info.keys():\n v = build_info[k]\n if k in ['sources','depends']:\n new_v = self._fix_paths(v)\n build_info[k] = new_v\n self.libraries.append((name,build_info))\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a library', name\n return\n\n def add_scripts(self,*files):\n \"\"\" Add scripts to configuration.\n \"\"\"\n scripts = self._fix_paths(files)\n dist = self.get_distribution()\n if dist is not None:\n dist.scripts.extend(scripts)\n else:\n self.scripts.extend(scripts)\n return\n\n def dict_append(self,**dict):\n for key in self.list_keys:\n a = getattr(self,key)\n a.extend(dict.get(key,[]))\n for key in self.dict_keys:\n a = getattr(self,key)\n a.update(dict.get(key,{}))\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n for key in dict.keys():\n if key not in known_keys and not hasattr(self,key):\n print 'Inheriting attribute %r from %r' \\\n % (key,dict.get('name','?'))\n setattr(self,key,dict[key])\n self.extra_keys.append(key)\n return\n\n def __str__(self):\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n s = '<'+5*'-' + '\\n'\n s += 'Configuration of '+self.name+':\\n'\n for k in known_keys:\n a = getattr(self,k,None)\n if a:\n s += '%s = %r\\n' % (k,a)\n s += 5*'-' + '>'\n return s\n\n def get_config_cmd(self):\n cmd = get_cmd('config')\n cmd.ensure_finalized()\n cmd.dump_source = 0\n cmd.noisy = 0\n old_path = os.environ.get('PATH')\n if old_path:\n path = os.pathsep.join(['.',old_path])\n os.environ['PATH'] = path\n return cmd\n\n def get_build_temp_dir(self):\n cmd = get_cmd('build')\n cmd.ensure_finalized()\n return cmd.build_temp\n\n def have_f77c(self):\n \"\"\" Check for availability of Fortran 77 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f77')\n return flag\n\n def have_f90c(self):\n \"\"\" Check for availability of Fortran 90 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f90')\n return flag\n\n def append_to(self, extlib):\n \"\"\" Append libraries, include_dirs to extension or library item.\n \"\"\"\n if type(extlib) is type(()):\n lib_name, build_info = extlib\n dict_append(build_info,\n libraries=self.libraries,\n include_dirs=self.include_dirs)\n else:\n from scipy.distutils.core import Extension\n assert isinstance(extlib,Extension),`extlib`\n extlib.libraries.extend(self.libraries)\n extlib.include_dirs.extend(self.include_dirs)\n return\n\n def _get_svn_revision(self,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\n def get_version(self):\n \"\"\" Try to get version string of a package.\n \"\"\"\n version = getattr(self,'version',None)\n if version is not None:\n return version\n\n # Get version from version file.\n files = ['__version__.py',\n self.name.split('.')[-1]+'_version.py',\n 'version.py',\n '__svn_version__.py']\n version_vars = ['version',\n '__version__',\n self.name.split('.')[-1]+'_version']\n for f in files:\n fn = os.path.join(self.local_path,f)\n if os.path.isfile(fn):\n info = (open(fn),fn,('.py','U',1))\n name = os.path.splitext(os.path.basename(fn))[0]\n n = dot_join(self.name,name)\n try:\n version_module = imp.load_module('_'.join(n.split('.')),*info)\n except ImportError,msg:\n print msg\n version_module = None\n if version_module is None:\n continue\n\n for a in version_vars:\n version = getattr(version_module,a,None)\n if version is not None:\n break\n if version is not None:\n break\n\n if version is not None:\n self.version = version\n return version\n\n # Get version as SVN revision number\n revision = self._get_svn_revision(self.local_path)\n if revision is not None:\n version = str(revision)\n self.version = version\n\n return version\n\n def make_svn_version_py(self):\n \"\"\" Generate package __svn_version__.py file from SVN revision number,\n it will be removed after python exits but will be available\n when sdist, etc commands are executed.\n\n If __svn_version__.py existed before, nothing is done.\n \"\"\"\n target = os.path.join(self.local_path,'__svn_version__.py')\n if os.path.isfile(target):\n return\n\n def generate_svn_version_py():\n if not os.path.isfile(target):\n revision = self._get_svn_revision(self.local_path)\n assert revision is not None,'hmm, why I am not inside SVN tree???'\n version = str(revision)\n print 'Creating %s (version=%r)' % (target,version)\n f = open(target,'w')\n f.write('version = %r\\n' % (version))\n f.close()\n \n import atexit\n def rm_file(f=target):\n try: os.remove(f); print 'removed',f\n except OSError: pass\n try: os.remove(f+'c'); print 'removed',f+'c'\n except OSError: pass\n atexit.register(rm_file)\n\n return target\n\n self.add_data_files(generate_svn_version_py())\n return\n\n def make_config_py(self,name='__config__'):\n \"\"\" Generate package __config__.py file containing system_info\n information used during building the package.\n \"\"\"\n self.add_extension(name,[generate_config_py])\n return\n\ndef get_cmd(cmdname,_cache={}):\n if not _cache.has_key(cmdname):\n import distutils.core\n dist = distutils.core._setup_distribution\n if dist is None:\n from distutils.errors import DistutilsInternalError\n raise DistutilsInternalError,\\\n 'setup distribution instance not initialized'\n cmd = dist.get_command_obj(cmdname)\n _cache[cmdname] = cmd\n return _cache[cmdname]\n\ndef get_scipy_include_dirs():\n include_dirs = Configuration.scipy_include_dirs[:]\n if not include_dirs:\n import scipy.base as base\n include_dirs.append(os.path.join(os.path.dirname(base.__file__),'include'))\n #from distutils.sysconfig import get_python_inc\n #prefix = []\n #for name in scipy.__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 return include_dirs\n\n#########################\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 appendpath(prefix,path):\n if os.path.isabs(path):\n absprefix = os.path.abspath(prefix)\n d = os.path.commonprefix([absprefix,path])\n if os.path.join(absprefix[:len(d)],absprefix[len(d):])!=absprefix \\\n or os.path.join(path[:len(d)],path[len(d):])!=path:\n # Handle invalid paths\n d = os.path.dirname(d)\n subpath = path[len(d):]\n if os.path.isabs(subpath):\n subpath = subpath[1:]\n else:\n subpath = path\n return os.path.normpath(os.path.join(prefix, subpath))\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", "source_code_before": "import os\nimport re\nimport sys\nimport imp\nimport copy\nimport types\nimport glob\n\ndef allpath(name):\n \"Convert a /-separated pathname to one using the OS's path separator.\"\n splitted = name.split('/')\n return os.path.join(*splitted)\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" Return path of the module.\n\n Returned path is relative to parent_path when given,\n otherwise it is absolute path.\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 __import__(mod_name)\n mod = sys.modules[mod_name]\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\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\n#########################\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#########################\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 False\n return True\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 True\n return False\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 True\n return False\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\n\ndef _get_headers(directory_list):\n # get *.h files from list of directories\n headers = []\n for dir in directory_list:\n head = glob.glob(os.path.join(dir,\"*.h\")) #XXX: *.hpp files??\n headers.extend(head)\n return headers\n\ndef _get_directories(list_of_sources):\n # get unique directories from list of sources.\n direcs = []\n for file in list_of_sources:\n dir = os.path.split(file)\n if dir[0] != '' and not dir[0] in direcs:\n direcs.append(dir[0])\n return direcs\n\ndef get_dependencies(sources):\n #XXX scan sources for include statements\n return _get_headers(_get_directories(sources))\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n if type(directory) is not type(''):\n return False\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 False\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n\ndef _gsf_visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn','build']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n ext = os.path.splitext(fullname)[1]\n if ext and ext in ['.pyc','.o']:\n continue\n if os.path.isfile(fullname):\n filenames.append(fullname)\n\ndef get_ext_source_files(ext):\n # Get sources and any include files in the same directory.\n filenames = []\n sources = filter(lambda s:type(s) is types.StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_script_files(scripts):\n scripts = filter(lambda s:type(s) is types.StringType,scripts)\n return scripts\n\ndef get_lib_source_files(lib):\n filenames = []\n sources = lib[1].get('sources',[])\n sources = filter(lambda s:type(s) is types.StringType,sources)\n filenames.extend(sources)\n filenames.extend(get_dependencies(sources))\n depends = build_info.get('depends',[])\n for d in depends:\n if is_local_src_dir(d):\n os.path.walk(d,_gsf_visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\ndef get_data_files(data):\n if type(data) is types.StringType:\n return [data]\n sources = data[1]\n filenames = []\n for s in sources:\n if callable(s):\n s = s()\n if s is None:\n continue\n if is_local_src_dir(s):\n os.path.walk(s,_gsf_visit_func,filenames)\n elif type(s) is type('') and os.path.isfile(s):\n filenames.append(s)\n else:\n raise TypeError,`s`\n return filenames\n\ndef dot_join(*args):\n return '.'.join(filter(None,args))\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\n######################\n\nclass Configuration:\n\n _list_keys = ['packages','ext_modules','data_files','include_dirs',\n 'libraries','headers','scripts']\n _dict_keys = ['package_dir']\n\n scipy_include_dirs = []\n\n def __init__(self,\n package_name=None,\n parent_name=None,\n top_path=None,\n package_path=None,\n **attrs):\n \"\"\" Construct configuration instance of a package.\n \"\"\"\n self.name = dot_join(parent_name, package_name)\n\n caller_frame = get_frame(1)\n caller_name = eval('__name__',caller_frame.f_globals,caller_frame.f_locals)\n \n self.local_path = get_path(caller_name, top_path)\n if top_path is None:\n top_path = self.local_path\n if package_path is None:\n package_path = self.local_path\n elif os.path.isdir(os.path.join(self.local_path,package_path)):\n package_path = os.path.join(self.local_path,package_path)\n self.top_path = top_path\n\n self.list_keys = copy.copy(self._list_keys)\n self.dict_keys = copy.copy(self._dict_keys)\n\n for n in self.list_keys:\n setattr(self,n,copy.copy(attrs.get(n,[])))\n\n for n in self.dict_keys:\n setattr(self,n,copy.copy(attrs.get(n,{})))\n\n known_keys = self.list_keys + self.dict_keys\n self.extra_keys = []\n for n in attrs.keys():\n if n in known_keys:\n continue\n a = attrs[n]\n setattr(self,n,a)\n if type(a) is types.ListType:\n self.list_keys.append(n)\n elif type(a) is types.DictType:\n self.dict_keys.append(n)\n else:\n self.extra_keys.append(n)\n\n if os.path.exists(os.path.join(package_path,'__init__.py')):\n self.packages.append(self.name)\n self.package_dir[self.name] = package_path \n return\n\n def todict(self):\n \"\"\" Return configuration distionary suitable for passing\n to distutils.core.setup() function.\n \"\"\"\n d = {}\n for n in self.list_keys + self.dict_keys + self.extra_keys:\n a = getattr(self,n)\n if a:\n d[n] = a\n if self.name:\n d['name'] = self.name\n return d\n\n def __dict__(self):\n return self.todict()\n\n def get_distribution(self):\n import distutils.core\n dist = distutils.core._setup_distribution \n return dist\n\n def get_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Return subpackage configuration.\n \"\"\"\n if subpackage_name is None:\n assert subpackage_path is not None\n subpackage_name = os.path.basename(subpackage_path)\n assert '.' not in subpackage_name,`subpackage_name`\n if subpackage_path is None:\n subpackage_path = os.path.join(self.local_path,subpackage_name)\n else:\n subpackage_path = self._fix_paths([subpackage_path])[0]\n\n setup_py = os.path.join(subpackage_path,'setup_%s.py' % (subpackage_name))\n if not os.path.isfile(setup_py):\n setup_py = os.path.join(subpackage_path,'setup.py')\n if not os.path.isfile(setup_py):\n print 'Assuming default configuration '\\\n '(%s/{setup_%s,setup}.py was not found)' \\\n % (os.path.dirname(setup_py),subpackage_name)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n # In case setup_py imports local modules:\n sys.path.insert(0,os.path.dirname(setup_py))\n try:\n info = (open(setup_py),setup_py,('.py','U',1))\n setup_name = os.path.splitext(os.path.basename(setup_py))[0]\n n = dot_join(self.name,setup_name)\n setup_module = imp.load_module('_'.join(n.split('.')),*info)\n\n if not hasattr(setup_module,'configuration'):\n print 'Assuming default configuration '\\\n '(%s does not define configuration())' % (setup_module)\n config = Configuration(subpackage_name,self.name,\n self.top_path,subpackage_path)\n else:\n args = (self.name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (self.top_path,)\n config = setup_module.configuration(*args)\n\n finally:\n del sys.path[0]\n\n return config\n\n def add_subpackage(self,subpackage_name,subpackage_path=None):\n \"\"\" Add subpackage to configuration.\n \"\"\"\n config = self.get_subpackage(subpackage_name,subpackage_path)\n\n if not config:\n print 'No configuration returned, assuming unavailable.'\n else:\n\n if isinstance(config,Configuration):\n print 'Appending %s configuration to %s' % (config.name,self.name)\n self.dict_append(**config.todict())\n else:\n print 'Appending %s configuration to %s' % (config.get('name'),self.name)\n self.dict_append(**config)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a subpackage', subpackage_name\n return\n\n def add_data_dir(self,data_path):\n \"\"\" Recursively add files under data_path to data_files list.\n Argument can be either\n - 2-sequence (,)\n - path to data directory where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + subdirname of the path.\n \"\"\"\n if type(data_path) is type(()):\n assert len(data_path)==2,`data_path`\n d,data_path = data_path\n else:\n d = None\n assert type(data_path) is type(''),`data_path`\n for path in self.paths(data_path):\n if not os.path.exists(path):\n print 'Not existing data path',path\n continue\n filenames = []\n os.path.walk(path, _gsf_visit_func,filenames)\n if not os.path.isabs(path):\n if d is None:\n ds = path\n else:\n ds = os.path.join(*([d]+os.path.normpath(path).split()[1:]))\n self.add_data_files((ds,filenames))\n else:\n if d is None:\n self.add_data_files(*filenames)\n else:\n self.add_data_files((d,filenames))\n return\n\n def add_data_files(self,*files):\n \"\"\" Add data files to configuration data_files.\n Argument(s) can be either\n - 2-sequence (,)\n - paths to data files where python datadir suffix defaults\n to package dir.\n If path is not absolute then it's datadir suffix is\n package dir + dirname of the path.\n \"\"\"\n data_dict = {}\n for p in files:\n if type(p) is type(''):\n d = os.path.join(*(self.name.split('.')))\n file_list = self.paths(p)\n if not os.path.isabs(p):\n d = appendpath(d,os.path.dirname(p))\n elif type(p) is type(()):\n assert len(p)==2,`p`\n d = p[0]\n if type(p[1]) is type(''):\n file_list = self.paths(p[1])\n else:\n file_list = self.paths(*p[1])\n else:\n # function\n d = os.path.join(*(self.name.split('.')))\n file_list = [p]\n if not data_dict.has_key(d):\n data_dict[d] = file_list[:]\n else:\n data_dict[d].extend(file_list)\n\n dist = self.get_distribution()\n if dist is not None:\n dist.data_files.extend(data_dict.items())\n else:\n self.data_files.extend(data_dict.items())\n return \n \n def add_include_dirs(self,*paths):\n \"\"\" Add paths to configuration include directories.\n \"\"\"\n include_dirs = self._fix_paths(paths)\n dist = self.get_distribution()\n if dist is not None:\n dist.include_dirs.extend(include_dirs)\n else:\n self.include_dirs.extend(include_dirs)\n return\n\n def add_headers(self,*files):\n \"\"\" Add installable headers to configuration.\n Argument(s) can be either\n - 2-sequence (,)\n - path(s) to header file(s) where python includedir suffix will default\n to package name.\n \"\"\"\n headers = []\n for path in files:\n if type(path) is type(''):\n [headers.append((self.name,p)) for p in self.paths(path)]\n else:\n assert type(path) in [type(()),type([])] and len(path)==2,`path`\n [headers.append((path[0],p)) for p in self.paths(path[1])]\n dist = self.get_distribution()\n if dist is not None:\n dist.headers.extend(headers)\n else:\n self.headers.extend(headers)\n return\n\n def _fix_paths(self,paths):\n new_paths = []\n for n in paths:\n if isinstance(n,str):\n if '*' in n or '?' in n:\n p = glob.glob(n)\n p2 = glob.glob(os.path.join(self.local_path,n))\n if p2:\n new_paths.extend(p2)\n elif p:\n new_paths.extend(p)\n else:\n new_paths.append(n)\n else:\n n2 = os.path.join(self.local_path,n)\n if os.path.exists(n2):\n new_paths.append(n2)\n else:\n new_paths.append(n)\n else:\n new_paths.append(n)\n return new_paths\n\n def paths(self,*paths):\n \"\"\" Apply glob to paths and prepend local_path if needed.\n \"\"\"\n return self._fix_paths(paths)\n\n def add_extension(self,name,sources,**kw):\n \"\"\" Add extension to configuration.\n\n Keywords:\n include_dirs, define_macros, undef_macros,\n library_dirs, libraries, runtime_library_dirs,\n extra_objects, extra_compile_args, extra_link_args,\n export_symbols, swig_opts, depends, language,\n f2py_options, module_dirs\n extra_info - dict or list of dict of keywords to be\n appended to keywords.\n \"\"\"\n ext_args = copy.copy(kw)\n ext_args['name'] = dot_join(self.name,name)\n ext_args['sources'] = sources\n\n if ext_args.has_key('extra_info'):\n extra_info = ext_args['extra_info']\n del ext_args['extra_info']\n if type(extra_info) is type({}):\n extra_info = [extra_info]\n for info in extra_info:\n assert type(info) is type({}),`info`\n dict_append(ext_args,**info)\n\n for k in ext_args.keys():\n v = ext_args[k]\n if k in ['sources','depends','include_dirs','library_dirs',\n 'module_dirs','extra_objects']:\n new_v = self._fix_paths(v)\n ext_args[k] = new_v\n\n # Resolve out-of-tree dependencies\n libraries = ext_args.get('libraries',[])\n libnames = []\n ext_args['libraries'] = []\n for libname in libraries:\n if '@' in libname:\n lname,lpath = libname.split('@',1)\n lpath = os.path.abspath(os.path.join(self.local_path,lpath))\n if os.path.isdir(lpath):\n c = self.get_subpackage(None,lpath)\n if isinstance(c,Configuration):\n c = c.todict()\n for l in [l[0] for l in c.get('libraries',[])]:\n llname = l.split('__OF__',1)[0]\n if llname == lname:\n c.pop('name',None)\n dict_append(ext_args,**c)\n break\n continue\n libnames.append(libname)\n\n ext_args['libraries'] = libnames + ext_args['libraries']\n\n from scipy.distutils.core import Extension\n ext = Extension(**ext_args)\n self.ext_modules.append(ext)\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add an extension', name\n return ext\n\n def add_library(self,name,sources,**build_info):\n \"\"\" Add library to configuration.\n \n Valid keywords for build_info:\n depends\n macros\n include_dirs\n extra_compiler_args\n f2py_options\n \"\"\"\n build_info = copy.copy(build_info)\n name = name #+ '__OF__' + self.name\n build_info['sources'] = sources\n\n for k in build_info.keys():\n v = build_info[k]\n if k in ['sources','depends']:\n new_v = self._fix_paths(v)\n build_info[k] = new_v\n self.libraries.append((name,build_info))\n\n dist = self.get_distribution()\n if dist is not None:\n print 'distutils distribution has been initialized, it may be too late to add a library', name\n return\n\n def add_scripts(self,*files):\n \"\"\" Add scripts to configuration.\n \"\"\"\n scripts = self._fix_paths(files)\n dist = self.get_distribution()\n if dist is not None:\n dist.scripts.extend(scripts)\n else:\n self.scripts.extend(scripts)\n return\n\n def dict_append(self,**dict):\n for key in self.list_keys:\n a = getattr(self,key)\n a.extend(dict.get(key,[]))\n for key in self.dict_keys:\n a = getattr(self,key)\n a.update(dict.get(key,{}))\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n for key in dict.keys():\n if key not in known_keys and not hasattr(self,key):\n print 'Inheriting attribute %r from %r' \\\n % (key,dict.get('name','?'))\n setattr(self,key,dict[key])\n self.extra_keys.append(key)\n return\n\n def __str__(self):\n known_keys = self.list_keys + self.dict_keys + self.extra_keys\n s = '<'+5*'-' + '\\n'\n s += 'Configuration of '+self.name+':\\n'\n for k in known_keys:\n a = getattr(self,k,None)\n if a:\n s += '%s = %r\\n' % (k,a)\n s += 5*'-' + '>'\n return s\n\n def get_config_cmd(self):\n cmd = get_cmd('config')\n cmd.ensure_finalized()\n cmd.dump_source = 0\n cmd.noisy = 0\n old_path = os.environ.get('PATH')\n if old_path:\n path = os.pathsep.join(['.',old_path])\n os.environ['PATH'] = path\n return cmd\n\n def get_build_temp_dir(self):\n cmd = get_cmd('build')\n cmd.ensure_finalized()\n return cmd.build_temp\n\n def have_f77c(self):\n \"\"\" Check for availability of Fortran 77 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f77')\n return flag\n\n def have_f90c(self):\n \"\"\" Check for availability of Fortran 90 compiler.\n Use it inside source generating function to ensure that\n setup distribution instance has been initialized.\n \"\"\"\n simple_fortran_subroutine = '''\n subroutine simple\n end\n '''\n config_cmd = self.get_config_cmd()\n flag = config_cmd.try_compile(simple_fortran_subroutine,lang='f90')\n return flag\n\n def append_to(self, extlib):\n \"\"\" Append libraries, include_dirs to extension or library item.\n \"\"\"\n if type(extlib) is type(()):\n lib_name, build_info = extlib\n dict_append(build_info,\n libraries=self.libraries,\n include_dirs=self.include_dirs)\n else:\n from scipy.distutils.core import Extension\n assert isinstance(extlib,Extension),`extlib`\n extlib.libraries.extend(self.libraries)\n extlib.include_dirs.extend(self.include_dirs)\n return\n\n def _get_svn_revision(self,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\n def get_version(self):\n \"\"\" Try to get version string of a package.\n \"\"\"\n version = getattr(self,'version',None)\n if version is not None:\n return version\n\n # Get version from version file.\n files = ['__version__.py',\n self.name.split('.')[-1]+'_version.py',\n 'version.py',\n '__svn_version__.py']\n version_vars = ['version',\n '__version__',\n self.name.split('.')[-1]+'_version']\n for f in files:\n fn = os.path.join(self.local_path,f)\n if os.path.isfile(fn):\n info = (open(fn),fn,('.py','U',1))\n name = os.path.splitext(os.path.basename(fn))[0]\n n = dot_join(self.name,name)\n try:\n version_module = imp.load_module('_'.join(n.split('.')),*info)\n except ImportError,msg:\n print msg\n version_module = None\n if version_module is None:\n continue\n\n for a in version_vars:\n version = getattr(version_module,a,None)\n if version is not None:\n break\n if version is not None:\n break\n\n if version is not None:\n self.version = version\n return version\n\n # Get version as SVN revision number\n revision = self._get_svn_revision(self.local_path)\n if revision is not None:\n version = str(revision)\n self.version = version\n\n return version\n\n def make_svn_version_py(self):\n \"\"\" Generate package __svn_version__.py file from SVN revision number,\n it will be removed after python exits but will be available\n when sdist, etc commands are executed.\n\n If __svn_version__.py existed before, nothing is done.\n \"\"\"\n target = os.path.join(self.local_path,'__svn_version__.py')\n if os.path.isfile(target):\n return\n\n def generate_svn_version_py():\n if not os.path.isfile(target):\n revision = self._get_svn_revision(self.local_path)\n assert revision is not None,'hmm, why I am not inside SVN tree???'\n version = str(revision)\n print 'Creating %s (version=%r)' % (target,version)\n f = open(target,'w')\n f.write('version = %r\\n' % (version))\n f.close()\n \n import atexit\n def rm_file(f=target):\n try: os.remove(f); print 'removed',f\n except OSError: pass\n atexit.register(rm_file)\n\n return target\n\n self.add_data_files(generate_svn_version_py)\n return\n\ndef get_cmd(cmdname,_cache={}):\n if not _cache.has_key(cmdname):\n import distutils.core\n dist = distutils.core._setup_distribution\n if dist is None:\n from distutils.errors import DistutilsInternalError\n raise DistutilsInternalError,\\\n 'setup distribution instance not initialized'\n cmd = dist.get_command_obj(cmdname)\n _cache[cmdname] = cmd\n return _cache[cmdname]\n\ndef get_scipy_include_dirs():\n include_dirs = Configuration.scipy_include_dirs[:]\n if not include_dirs:\n import scipy.base as base\n include_dirs.append(os.path.join(os.path.dirname(base.__file__),'include'))\n #from distutils.sysconfig import get_python_inc\n #prefix = []\n #for name in scipy.__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 return include_dirs\n\n#########################\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 appendpath(prefix,path):\n if os.path.isabs(path):\n absprefix = os.path.abspath(prefix)\n d = os.path.commonprefix([absprefix,path])\n if os.path.join(absprefix[:len(d)],absprefix[len(d):])!=absprefix \\\n or os.path.join(path[:len(d)],path[len(d):])!=path:\n # Handle invalid paths\n d = os.path.dirname(d)\n subpath = path[len(d):]\n if os.path.isabs(subpath):\n subpath = subpath[1:]\n else:\n subpath = path\n return os.path.normpath(os.path.join(prefix, subpath))\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", "methods": [ { "name": "allpath", "long_name": "allpath( name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "name" ], "start_line": 9, "end_line": 12, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 129, "parameters": [ "mod_name", "parent_path" ], "start_line": 14, "end_line": 34, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "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": 38, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 42, "parameters": [ "path" ], "start_line": 80, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "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": 92, "end_line": 108, "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": 110, "end_line": 115, "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": 117, "end_line": 122, "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": 124, "end_line": 129, "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": 131, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_get_headers", "long_name": "_get_headers( directory_list )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 39, "parameters": [ "directory_list" ], "start_line": 154, "end_line": 160, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "_get_directories", "long_name": "_get_directories( list_of_sources )", "filename": "misc_util.py", "nloc": 7, "complexity": 4, "token_count": 51, "parameters": [ "list_of_sources" ], "start_line": 162, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "get_dependencies", "long_name": "get_dependencies( sources )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "sources" ], "start_line": 171, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "misc_util.py", "nloc": 12, "complexity": 6, "token_count": 112, "parameters": [ "directory" ], "start_line": 175, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "_gsf_visit_func", "long_name": "_gsf_visit_func( filenames , dirname , names )", "filename": "misc_util.py", "nloc": 13, "complexity": 7, "token_count": 103, "parameters": [ "filenames", "dirname", "names" ], "start_line": 190, "end_line": 202, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_ext_source_files", "long_name": "get_ext_source_files( ext )", "filename": "misc_util.py", "nloc": 11, "complexity": 4, "token_count": 87, "parameters": [ "ext" ], "start_line": 204, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "get_script_files", "long_name": "get_script_files( scripts )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 25, "parameters": [ "scripts" ], "start_line": 217, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "get_lib_source_files", "long_name": "get_lib_source_files( lib )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 108, "parameters": [ "lib" ], "start_line": 221, "end_line": 233, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_data_files", "long_name": "get_data_files( data )", "filename": "misc_util.py", "nloc": 17, "complexity": 8, "token_count": 105, "parameters": [ "data" ], "start_line": 235, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "args" ], "start_line": 253, "end_line": 254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "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": 256, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package_name = None , parent_name = None , top_path = None , package_path = None , ** attrs )", "filename": "misc_util.py", "nloc": 40, "complexity": 11, "token_count": 335, "parameters": [ "self", "package_name", "parent_name", "top_path", "package_path", "attrs" ], "start_line": 275, "end_line": 323, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 1 }, { "name": "todict", "long_name": "todict( self )", "filename": "misc_util.py", "nloc": 9, "complexity": 4, "token_count": 57, "parameters": [ "self" ], "start_line": 325, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__dict__", "long_name": "__dict__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 338, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_distribution", "long_name": "get_distribution( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 341, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_subpackage", "long_name": "get_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 38, "complexity": 8, "token_count": 333, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 346, "end_line": 390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 1 }, { "name": "add_subpackage", "long_name": "add_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 103, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 392, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "add_data_dir", "long_name": "add_data_dir( self , data_path )", "filename": "misc_util.py", "nloc": 25, "complexity": 7, "token_count": 187, "parameters": [ "self", "data_path" ], "start_line": 413, "end_line": 445, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "add_data_files", "long_name": "add_data_files( self , * files )", "filename": "misc_util.py", "nloc": 28, "complexity": 8, "token_count": 247, "parameters": [ "self", "files" ], "start_line": 447, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "add_include_dirs", "long_name": "add_include_dirs( self , * paths )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "paths" ], "start_line": 486, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "add_headers", "long_name": "add_headers( self , * files )", "filename": "misc_util.py", "nloc": 14, "complexity": 7, "token_count": 143, "parameters": [ "self", "files" ], "start_line": 497, "end_line": 516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "_fix_paths", "long_name": "_fix_paths( self , paths )", "filename": "misc_util.py", "nloc": 22, "complexity": 8, "token_count": 136, "parameters": [ "self", "paths" ], "start_line": 518, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "paths", "long_name": "paths( self , * paths )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 16, "parameters": [ "self", "paths" ], "start_line": 541, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "add_extension", "long_name": "add_extension( self , name , sources , ** kw )", "filename": "misc_util.py", "nloc": 45, "complexity": 14, "token_count": 365, "parameters": [ "self", "name", "sources", "kw" ], "start_line": 546, "end_line": 608, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 1 }, { "name": "add_library", "long_name": "add_library( self , name , sources , ** build_info )", "filename": "misc_util.py", "nloc": 14, "complexity": 4, "token_count": 98, "parameters": [ "self", "name", "sources", "build_info" ], "start_line": 610, "end_line": 634, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "add_scripts", "long_name": "add_scripts( self , * files )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "files" ], "start_line": 636, "end_line": 645, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "dict_append", "long_name": "dict_append( self , ** dict )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 138, "parameters": [ "self", "dict" ], "start_line": 647, "end_line": 661, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 72, "parameters": [ "self" ], "start_line": 663, "end_line": 672, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_config_cmd", "long_name": "get_config_cmd( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 2, "token_count": 63, "parameters": [ "self" ], "start_line": 674, "end_line": 683, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_build_temp_dir", "long_name": "get_build_temp_dir( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 685, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "have_f77c", "long_name": "have_f77c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 690, "end_line": 701, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "have_f90c", "long_name": "have_f90c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 703, "end_line": 714, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "append_to", "long_name": "append_to( self , extlib )", "filename": "misc_util.py", "nloc": 12, "complexity": 2, "token_count": 83, "parameters": [ "self", "extlib" ], "start_line": 716, "end_line": 729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "_get_svn_revision", "long_name": "_get_svn_revision( self , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 77, "parameters": [ "self", "path" ], "start_line": 731, "end_line": 742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "get_version", "long_name": "get_version( self )", "filename": "misc_util.py", "nloc": 38, "complexity": 11, "token_count": 257, "parameters": [ "self" ], "start_line": 744, "end_line": 790, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 1 }, { "name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file", "long_name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file( f = target )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 45, "parameters": [ "f" ], "start_line": 814, "end_line": 818, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 3 }, { "name": "make_svn_version_py.generate_svn_version_py", "long_name": "make_svn_version_py.generate_svn_version_py( )", "filename": "misc_util.py", "nloc": 13, "complexity": 2, "token_count": 81, "parameters": [], "start_line": 803, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 2 }, { "name": "make_svn_version_py", "long_name": "make_svn_version_py( self )", "filename": "misc_util.py", "nloc": 7, "complexity": 2, "token_count": 42, "parameters": [ "self" ], "start_line": 792, "end_line": 824, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "make_config_py", "long_name": "make_config_py( self , name = '__config__' )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 826, "end_line": 831, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_cmd", "long_name": "get_cmd( cmdname , _cache = { } )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 65, "parameters": [ "cmdname", "_cache" ], "start_line": 833, "end_line": 843, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "get_scipy_include_dirs", "long_name": "get_scipy_include_dirs( )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 48, "parameters": [], "start_line": 845, "end_line": 857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "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": 861, "end_line": 866, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "appendpath", "long_name": "appendpath( prefix , path )", "filename": "misc_util.py", "nloc": 13, "complexity": 5, "token_count": 157, "parameters": [ "prefix", "path" ], "start_line": 868, "end_line": 881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "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": 145, "parameters": [ "extension", "build_dir" ], "start_line": 883, "end_line": 919, "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": 921, "end_line": 948, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "methods_before": [ { "name": "allpath", "long_name": "allpath( name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "name" ], "start_line": 9, "end_line": 12, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 129, "parameters": [ "mod_name", "parent_path" ], "start_line": 14, "end_line": 34, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "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": 38, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 42, "parameters": [ "path" ], "start_line": 80, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "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": 92, "end_line": 108, "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": 110, "end_line": 115, "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": 117, "end_line": 122, "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": 124, "end_line": 129, "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": 131, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_get_headers", "long_name": "_get_headers( directory_list )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 39, "parameters": [ "directory_list" ], "start_line": 154, "end_line": 160, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "_get_directories", "long_name": "_get_directories( list_of_sources )", "filename": "misc_util.py", "nloc": 7, "complexity": 4, "token_count": 51, "parameters": [ "list_of_sources" ], "start_line": 162, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "get_dependencies", "long_name": "get_dependencies( sources )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "sources" ], "start_line": 171, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "misc_util.py", "nloc": 12, "complexity": 6, "token_count": 112, "parameters": [ "directory" ], "start_line": 175, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "_gsf_visit_func", "long_name": "_gsf_visit_func( filenames , dirname , names )", "filename": "misc_util.py", "nloc": 13, "complexity": 7, "token_count": 103, "parameters": [ "filenames", "dirname", "names" ], "start_line": 190, "end_line": 202, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_ext_source_files", "long_name": "get_ext_source_files( ext )", "filename": "misc_util.py", "nloc": 11, "complexity": 4, "token_count": 87, "parameters": [ "ext" ], "start_line": 204, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "get_script_files", "long_name": "get_script_files( scripts )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 25, "parameters": [ "scripts" ], "start_line": 217, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "get_lib_source_files", "long_name": "get_lib_source_files( lib )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 108, "parameters": [ "lib" ], "start_line": 221, "end_line": 233, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "get_data_files", "long_name": "get_data_files( data )", "filename": "misc_util.py", "nloc": 17, "complexity": 8, "token_count": 105, "parameters": [ "data" ], "start_line": 235, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "args" ], "start_line": 253, "end_line": 254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "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": 256, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , package_name = None , parent_name = None , top_path = None , package_path = None , ** attrs )", "filename": "misc_util.py", "nloc": 40, "complexity": 11, "token_count": 335, "parameters": [ "self", "package_name", "parent_name", "top_path", "package_path", "attrs" ], "start_line": 275, "end_line": 323, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 1 }, { "name": "todict", "long_name": "todict( self )", "filename": "misc_util.py", "nloc": 9, "complexity": 4, "token_count": 57, "parameters": [ "self" ], "start_line": 325, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__dict__", "long_name": "__dict__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 338, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_distribution", "long_name": "get_distribution( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 341, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_subpackage", "long_name": "get_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 38, "complexity": 8, "token_count": 333, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 346, "end_line": 390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 1 }, { "name": "add_subpackage", "long_name": "add_subpackage( self , subpackage_name , subpackage_path = None )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 103, "parameters": [ "self", "subpackage_name", "subpackage_path" ], "start_line": 392, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "add_data_dir", "long_name": "add_data_dir( self , data_path )", "filename": "misc_util.py", "nloc": 25, "complexity": 7, "token_count": 187, "parameters": [ "self", "data_path" ], "start_line": 413, "end_line": 445, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 }, { "name": "add_data_files", "long_name": "add_data_files( self , * files )", "filename": "misc_util.py", "nloc": 28, "complexity": 8, "token_count": 247, "parameters": [ "self", "files" ], "start_line": 447, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 1 }, { "name": "add_include_dirs", "long_name": "add_include_dirs( self , * paths )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "paths" ], "start_line": 486, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "add_headers", "long_name": "add_headers( self , * files )", "filename": "misc_util.py", "nloc": 14, "complexity": 7, "token_count": 143, "parameters": [ "self", "files" ], "start_line": 497, "end_line": 516, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "_fix_paths", "long_name": "_fix_paths( self , paths )", "filename": "misc_util.py", "nloc": 22, "complexity": 8, "token_count": 136, "parameters": [ "self", "paths" ], "start_line": 518, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "paths", "long_name": "paths( self , * paths )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 16, "parameters": [ "self", "paths" ], "start_line": 541, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "add_extension", "long_name": "add_extension( self , name , sources , ** kw )", "filename": "misc_util.py", "nloc": 45, "complexity": 14, "token_count": 365, "parameters": [ "self", "name", "sources", "kw" ], "start_line": 546, "end_line": 608, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 1 }, { "name": "add_library", "long_name": "add_library( self , name , sources , ** build_info )", "filename": "misc_util.py", "nloc": 14, "complexity": 4, "token_count": 98, "parameters": [ "self", "name", "sources", "build_info" ], "start_line": 610, "end_line": 634, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "add_scripts", "long_name": "add_scripts( self , * files )", "filename": "misc_util.py", "nloc": 8, "complexity": 2, "token_count": 49, "parameters": [ "self", "files" ], "start_line": 636, "end_line": 645, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "dict_append", "long_name": "dict_append( self , ** dict )", "filename": "misc_util.py", "nloc": 15, "complexity": 6, "token_count": 138, "parameters": [ "self", "dict" ], "start_line": 647, "end_line": 661, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 72, "parameters": [ "self" ], "start_line": 663, "end_line": 672, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_config_cmd", "long_name": "get_config_cmd( self )", "filename": "misc_util.py", "nloc": 10, "complexity": 2, "token_count": 63, "parameters": [ "self" ], "start_line": 674, "end_line": 683, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_build_temp_dir", "long_name": "get_build_temp_dir( self )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 685, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "have_f77c", "long_name": "have_f77c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 690, "end_line": 701, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "have_f90c", "long_name": "have_f90c( self )", "filename": "misc_util.py", "nloc": 8, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 703, "end_line": 714, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "append_to", "long_name": "append_to( self , extlib )", "filename": "misc_util.py", "nloc": 12, "complexity": 2, "token_count": 83, "parameters": [ "self", "extlib" ], "start_line": 716, "end_line": 729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "_get_svn_revision", "long_name": "_get_svn_revision( self , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 77, "parameters": [ "self", "path" ], "start_line": 731, "end_line": 742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "get_version", "long_name": "get_version( self )", "filename": "misc_util.py", "nloc": 38, "complexity": 11, "token_count": 257, "parameters": [ "self" ], "start_line": 744, "end_line": 790, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 1 }, { "name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file", "long_name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file( f = target )", "filename": "misc_util.py", "nloc": 3, "complexity": 2, "token_count": 24, "parameters": [ "f" ], "start_line": 814, "end_line": 816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 3 }, { "name": "make_svn_version_py.generate_svn_version_py", "long_name": "make_svn_version_py.generate_svn_version_py( )", "filename": "misc_util.py", "nloc": 13, "complexity": 2, "token_count": 81, "parameters": [], "start_line": 803, "end_line": 819, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 2 }, { "name": "make_svn_version_py", "long_name": "make_svn_version_py( self )", "filename": "misc_util.py", "nloc": 7, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 792, "end_line": 822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "get_cmd", "long_name": "get_cmd( cmdname , _cache = { } )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 65, "parameters": [ "cmdname", "_cache" ], "start_line": 824, "end_line": 834, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "get_scipy_include_dirs", "long_name": "get_scipy_include_dirs( )", "filename": "misc_util.py", "nloc": 6, "complexity": 2, "token_count": 48, "parameters": [], "start_line": 836, "end_line": 848, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "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": 852, "end_line": 857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "appendpath", "long_name": "appendpath( prefix , path )", "filename": "misc_util.py", "nloc": 13, "complexity": 5, "token_count": 157, "parameters": [ "prefix", "path" ], "start_line": 859, "end_line": 872, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "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": 145, "parameters": [ "extension", "build_dir" ], "start_line": 874, "end_line": 910, "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": 912, "end_line": 939, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file", "long_name": "make_svn_version_py.make_svn_version_py.generate_svn_version_py.rm_file( f = target )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 45, "parameters": [ "f" ], "start_line": 814, "end_line": 818, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 3 }, { "name": "make_config_py", "long_name": "make_config_py( self , name = '__config__' )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 826, "end_line": 831, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "make_svn_version_py.generate_svn_version_py", "long_name": "make_svn_version_py.generate_svn_version_py( )", "filename": "misc_util.py", "nloc": 13, "complexity": 2, "token_count": 81, "parameters": [], "start_line": 803, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 2 }, { "name": "make_svn_version_py", "long_name": "make_svn_version_py( self )", "filename": "misc_util.py", "nloc": 7, "complexity": 2, "token_count": 42, "parameters": [ "self" ], "start_line": 792, "end_line": 824, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 1 } ], "nloc": 702, "complexity": 221, "token_count": 5196, "diff_parsed": { "added": [ " try: os.remove(f+'c'); print 'removed',f+'c'", " except OSError: pass", " self.add_data_files(generate_svn_version_py())", " return", "", " def make_config_py(self,name='__config__'):", " \"\"\" Generate package __config__.py file containing system_info", " information used during building the package.", " \"\"\"", " self.add_extension(name,[generate_config_py])" ], "deleted": [ " self.add_data_files(generate_svn_version_py)" ] } }, { "old_path": "scipy/setup.py", "new_path": "scipy/setup.py", "filename": "setup.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -13,17 +13,8 @@ def configuration(parent_package='',top_path=None):\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n \n- def generate_install_init_py(ext,build_dir):\n- from distutils.dep_util import newer\n- from distutils.file_util import copy_file\n- source = ext.depends[0]\n- target = os.path.join(build_dir,'install__init__.py')\n- if newer(source,target):\n- copy_file(source,target)\n- return target\n+ config.make_config_py(name='__core_config__') # installs __config__.py\n \n- config.add_extension('__init__',[generate_install_init_py],\n- depends=['install__init__py'])\n return config.todict()\n \n if __name__ == '__main__':\n", "added_lines": 1, "deleted_lines": 10, "source_code": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n\n config.make_config_py(name='__core_config__') # installs __config__.py\n\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "source_code_before": "#!/usr/bin/env python\nimport os\n\ndef configuration(parent_package='',top_path=None):\n from scipy.distutils.misc_util import Configuration\n config = Configuration('scipy',parent_package,top_path)\n config.add_subpackage('distutils')\n config.add_subpackage('weave')\n config.add_subpackage('test')\n config.add_subpackage('f2py2e') # installed as scipy.f2py\n config.add_subpackage('base')\n config.add_subpackage('corelib') # installed as scipy.lib\n config.add_subpackage('basic')\n config.add_data_dir('doc')\n\n def generate_install_init_py(ext,build_dir):\n from distutils.dep_util import newer\n from distutils.file_util import copy_file\n source = ext.depends[0]\n target = os.path.join(build_dir,'install__init__.py')\n if newer(source,target):\n copy_file(source,target)\n return target\n\n config.add_extension('__init__',[generate_install_init_py],\n depends=['install__init__py'])\n return config.todict()\n\nif __name__ == '__main__':\n # Remove current working directory from sys.path\n # to avoid importing scipy.distutils as Python std. distutils:\n import os, sys\n sys.path.remove(os.getcwd())\n\n from scipy.distutils.core import setup\n setup(**configuration(top_path=''))\n", "methods": [ { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 13, "complexity": 1, "token_count": 91, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 18, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 } ], "methods_before": [ { "name": "configuration.generate_install_init_py", "long_name": "configuration.generate_install_init_py( ext , build_dir )", "filename": "setup.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [ "ext", "build_dir" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 15, "complexity": 1, "token_count": 101, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "configuration.generate_install_init_py", "long_name": "configuration.generate_install_init_py( ext , build_dir )", "filename": "setup.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [ "ext", "build_dir" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "configuration", "long_name": "configuration( parent_package = '' , top_path = None )", "filename": "setup.py", "nloc": 13, "complexity": 1, "token_count": 91, "parameters": [ "parent_package", "top_path" ], "start_line": 4, "end_line": 18, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 } ], "nloc": 19, "complexity": 1, "token_count": 133, "diff_parsed": { "added": [ " config.make_config_py(name='__core_config__') # installs __config__.py" ], "deleted": [ " def generate_install_init_py(ext,build_dir):", " from distutils.dep_util import newer", " from distutils.file_util import copy_file", " source = ext.depends[0]", " target = os.path.join(build_dir,'install__init__.py')", " if newer(source,target):", " copy_file(source,target)", " return target", " config.add_extension('__init__',[generate_install_init_py],", " depends=['install__init__py'])" ] } } ] } ]