diff options
Diffstat (limited to 'numpy/numarray/alter_code1.py')
-rw-r--r-- | numpy/numarray/alter_code1.py | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/numpy/numarray/alter_code1.py b/numpy/numarray/alter_code1.py new file mode 100644 index 000000000..ae950e7e0 --- /dev/null +++ b/numpy/numarray/alter_code1.py @@ -0,0 +1,265 @@ +""" +This module converts code written for numarray to run with numpy + +Makes the following changes: + * Changes import statements + + import numarray.package + --> import numpy.numarray.package as numarray_package + with all numarray.package in code changed to numarray_package + + import numarray --> import numpy.numarray as numarray + import numarray.package as <yyy> --> import numpy.numarray.package as <yyy> + + from numarray import <xxx> --> from numpy.numarray import <xxx> + from numarray.package import <xxx> + --> from numpy.numarray.package import <xxx> + + package can be convolve, image, nd_image, mlab, linear_algebra, ma, + matrix, fft, random_array + + + * Makes search and replace changes to: + - .imaginary --> .imag + - .flat --> .ravel() (most of the time) + - .byteswapped() --> .byteswap(False) + - .byteswap() --> .byteswap(True) + - .info() --> numarray.info(self) + - .isaligned() --> .flags.aligned + - .isbyteswapped() --> (not .dtype.isnative) + - .typecode() --> .dtype.char + - .iscontiguous() --> .flags.contiguous + - .is_c_array() --> .flags.carray and .dtype.isnative + - .is_fortran_contiguous() --> .flags.fortran + - .is_f_array() --> .dtype.isnative and .flags.farray + - .itemsize() --> .itemsize + - .nelements() --> .size + - self.new(type) --> numarray.newobj(self, type) + - .repeat(r) --> .repeat(r, axis=0) + - .size() --> .size + - self.type() -- numarray.typefrom(self) + - .typecode() --> .dtype.char + - .stddev() --> .std() + - .togglebyteorder() --> numarray.togglebyteorder(self) + - .getshape() --> .shape + - .setshape(obj) --> .shape=obj + - .getflat() --> .ravel() + - .getreal() --> .real + - .setreal() --> .real = + - .getimag() --> .imag + - .setimag() --> .imag = + - .getimaginary() --> .imag + - .setimaginary() --> .imag + +""" +__all__ = ['convertfile', 'convertall', 'converttree', 'convertsrc'] + +import sys +import os +import re +import glob + +def changeimports(fstr, name, newname): + importstr = 'import %s' % name + importasstr = 'import %s as ' % name + fromstr = 'from %s import ' % name + fromall=0 + + name_ = name + if ('.' in name): + name_ = name.replace('.','_') + + fstr = re.sub(r'(import\s+[^,\n\r]+,\s*)(%s)' % name, + "\\1%s as %s" % (newname, name), fstr) + fstr = fstr.replace(importasstr, 'import %s as ' % newname) + fstr = fstr.replace(importstr, 'import %s as %s' % (newname,name_)) + if (name_ != name): + fstr = fstr.replace(name, name_) + + ind = 0 + Nlen = len(fromstr) + Nlen2 = len("from %s import " % newname) + while 1: + found = fstr.find(fromstr,ind) + if (found < 0): + break + ind = found + Nlen + if fstr[ind] == '*': + continue + fstr = "%sfrom %s import %s" % (fstr[:found], newname, fstr[ind:]) + ind += Nlen2 - Nlen + return fstr, fromall + +flatindex_re = re.compile('([.]flat(\s*?[[=]))') + + +def addimport(astr): + # find the first line with import on it + ind = astr.find('import') + start = astr.rfind(os.linesep, 0, ind) + astr = "%s%s%s%s" % (astr[:start], os.linesep, + "import numpy.numarray as numarray", + astr[start:]) + return astr + +def replaceattr(astr): + astr = astr.replace(".imaginary", ".imag") + astr = astr.replace(".byteswapped()",".byteswap(False)") + astr = astr.replace(".byteswap()", ".byteswap(True)") + astr = astr.replace(".isaligned()", ".flags.aligned") + astr = astr.replace(".iscontiguous()",".flags.contiguous") + astr = astr.replace(".is_fortran_contiguous()",".flags.fortran") + astr = astr.replace(".itemsize()",".itemsize") + astr = astr.replace(".size()",".size") + astr = astr.replace(".nelements()",".size") + astr = astr.replace(".typecode()",".dtype.char") + astr = astr.replace(".stddev()",".std()") + astr = astr.replace(".getshape()", ".shape") + astr = astr.replace(".getflat()", ".ravel()") + astr = astr.replace(".getreal", ".real") + astr = astr.replace(".getimag", ".imag") + astr = astr.replace(".getimaginary", ".imag") + + # preserve uses of flat that should be o.k. + tmpstr = flatindex_re.sub(r"@@@@\2",astr) + # replace other uses of flat + tmpstr = tmpstr.replace(".flat",".ravel()") + # put back .flat where it was valid + astr = tmpstr.replace("@@@@", ".flat") + return astr + +info_re = re.compile(r'(\S+)\s*[.]\s*info\s*[(]\s*[)]') +new_re = re.compile(r'(\S+)\s*[.]\s*new\s*[(]\s*(\S+)\s*[)]') +toggle_re = re.compile(r'(\S+)\s*[.]\s*togglebyteorder\s*[(]\s*[)]') +type_re = re.compile(r'(\S+)\s*[.]\s*type\s*[(]\s*[)]') + +isbyte_re = re.compile(r'(\S+)\s*[.]\s*isbyteswapped\s*[(]\s*[)]') +iscarr_re = re.compile(r'(\S+)\s*[.]\s*is_c_array\s*[(]\s*[)]') +isfarr_re = re.compile(r'(\S+)\s*[.]\s*is_f_array\s*[(]\s*[)]') +repeat_re = re.compile(r'(\S+)\s*[.]\s*repeat\s*[(]\s*(\S+)\s*[)]') + +setshape_re = re.compile(r'(\S+)\s*[.]\s*setshape\s*[(]\s*(\S+)\s*[)]') +setreal_re = re.compile(r'(\S+)\s*[.]\s*setreal\s*[(]\s*(\S+)\s*[)]') +setimag_re = re.compile(r'(\S+)\s*[.]\s*setimag\s*[(]\s*(\S+)\s*[)]') +setimaginary_re = re.compile(r'(\S+)\s*[.]\s*setimaginary\s*[(]\s*(\S+)\s*[)]') +def replaceother(astr): + # self.info() --> numarray.info(self) + # self.new(type) --> numarray.newobj(self, type) + # self.togglebyteorder() --> numarray.togglebyteorder(self) + # self.type() --> numarray.typefrom(self) + (astr, n1) = info_re.subn('numarray.info(\\1)', astr) + (astr, n2) = new_re.subn('numarray.newobj(\\1, \\2)', astr) + (astr, n3) = toggle_re.subn('numarray.togglebyteorder(\\1)', astr) + (astr, n4) = type_re.subn('numarray.typefrom(\\1)', astr) + if (n1+n2+n3+n4 > 0): + astr = addimport(astr) + + astr = isbyte_re.sub('not \\1.dtype.isnative', astr) + astr = iscarr_re.sub('\\1.dtype.isnative and \\1.flags.carray', astr) + astr = isfarr_re.sub('\\1.dtype.isnative and \\1.flags.farray', astr) + astr = repeat_re.sub('\\1.repeat(\\2, axis=0)', astr) + astr = setshape_re.sub('\\1.shape = \\2', astr) + astr = setreal_re.sub('\\1.real = \\2', astr) + astr = setimag_re.sub('\\1.imag = \\2', astr) + astr = setimaginary_re.sub('\\1.imag = \\2', astr) + return astr + +import datetime +def fromstr(filestr): + savestr = filestr[:] + filestr, fromall = changeimports(filestr, 'numarray', 'numpy.numarray') + base = 'numarray' + newbase = 'numpy.numarray' + for sub in ['', 'convolve', 'image', 'nd_image', 'mlab', 'linear_algebra', + 'ma', 'matrix', 'fft', 'random_array']: + if sub != '': + sub = '.'+sub + filestr, fromall = changeimports(filestr, base+sub, newbase+sub) + + filestr = replaceattr(filestr) + filestr = replaceother(filestr) + if savestr != filestr: + name = os.path.split(sys.argv[0])[-1] + today = datetime.date.today().strftime('%b %d, %Y') + filestr = '## Automatically adapted for '\ + 'numpy.numarray %s by %s\n\n%s' % (today, name, filestr) + return filestr, 1 + return filestr, 0 + +def makenewfile(name, filestr): + fid = file(name, 'w') + fid.write(filestr) + fid.close() + +def convertfile(filename, orig=1): + """Convert the filename given from using Numarray to using NumPy + + Copies the file to filename.orig and then over-writes the file + with the updated code + """ + fid = open(filename) + filestr = fid.read() + fid.close() + filestr, changed = fromstr(filestr) + if changed: + if orig: + base, ext = os.path.splitext(filename) + os.rename(filename, base+".orig") + else: + os.remove(filename) + makenewfile(filename, filestr) + +def fromargs(args): + filename = args[1] + convertfile(filename) + +def convertall(direc=os.path.curdir, orig=1): + """Convert all .py files to use numpy.oldnumeric (from Numeric) in the directory given + + For each file, a backup of <usesnumeric>.py is made as + <usesnumeric>.py.orig. A new file named <usesnumeric>.py + is then written with the updated code. + """ + files = glob.glob(os.path.join(direc,'*.py')) + for afile in files: + if afile[-8:] == 'setup.py': continue + convertfile(afile, orig) + +header_re = re.compile(r'(numarray/libnumarray.h)') + +def convertsrc(direc=os.path.curdir, ext=None, orig=1): + """Replace Numeric/arrayobject.h with numpy/oldnumeric.h in all files in the + directory with extension give by list ext (if ext is None, then all files are + replaced).""" + if ext is None: + files = glob.glob(os.path.join(direc,'*')) + else: + files = [] + for aext in ext: + files.extend(glob.glob(os.path.join(direc,"*.%s" % aext))) + for afile in files: + fid = open(afile) + fstr = fid.read() + fid.close() + fstr, n = header_re.subn(r'numpy/libnumarray.h',fstr) + if n > 0: + if orig: + base, ext = os.path.splitext(afile) + os.rename(afile, base+".orig") + else: + os.remove(afile) + makenewfile(afile, fstr) + +def _func(arg, dirname, fnames): + convertall(dirname, orig=0) + convertsrc(dirname, ['h','c'], orig=0) + +def converttree(direc=os.path.curdir): + """Convert all .py files in the tree given + + """ + os.path.walk(direc, _func, None) + + +if __name__ == '__main__': + converttree(sys.argv) |