[Numpy-discussion] tests for casting table? (was: Numpy 1.7b1 API change cause big trouble)

Charles R Harris charlesr.harris at gmail.com
Thu Sep 20 19:30:10 EDT 2012


On Thu, Sep 20, 2012 at 2:20 PM, Travis Oliphant <travis at continuum.io>wrote:

> Here are a couple of scripts that might help (I used them to compare
> casting tables between various versions of NumPy):
>
> Casting Table Creation Script
> ========================
> import numpy as np
>
> operators = np.set_numeric_ops().values()
> types = '?bhilqpBHILQPfdgFDGO'
> to_check = ['add', 'divide', 'minimum', 'maximum', 'remainder',
> 'true_divide', 'logical_or', 'bitwise_or', 'right_shift', 'less', 'equal']
> operators = [op for op in operators if op.__name__ in to_check]
>
>
> def type_wrap(op):
>     def func(obj1, obj2):
>         try:
>             result = op(obj1, obj2)
>             char = result.dtype.char
>         except:
>             char = 'X'
>         return char
>
>     return func
>
> def coerce():
>     result = {}
>     for op in operators:
>         d = {}
>         name = op.__name__
>         print name
>         op = type_wrap(op)
>         for type1 in types:
>             s1 = np.dtype(type1).type(2)
>             a1 = np.dtype(type1).type([1,2,3])
>             for type2 in types:
>                 s2 = np.dtype(type2).type(1)
>                 a2 = np.dtype(type2).type([2,3,4])
>                 codes = []
>                 # scalar <op> scalar
>                 codes.append(op(s1, s2))
>                 # scalar <op> array
>                 codes.append(op(s1, a2))
>                 # array <op> scalar
>                 codes.append(op(a1, s2))
>                 # array <op> array
>                 codes.append(op(a1, a2))
>                 d[type1,type2] = codes
>         result[name] = d
>
>         #for check_key in to_check:
>         # for key in result.keys():
>         #    if key == check_key:
>         #        continue
>         #    if result[key] == result[check_key]:
>         #        del result[key]
>         #assert set(result.keys()) == set(to_check)
>     return result
>
> import sys
> if sys.maxint > 2**33:
>     bits = 64
> else:
>     bits = 32
>
> def write():
>     import cPickle
>     file = open('coercion-%s-%sbit.pkl'%(np.__version__, bits),'w')
>     cPickle.dump(coerce(),file,protocol=2)
>     file.close()
>
> if __name__ == '__main__':
>     write()
>
>
>
>
>
> Comparison Script
> ================
>
> import numpy as np
>
>
> def compare(result1, result2):
>     for op in result1.keys():
>         print "**** ", op, " ****"
>         if op not in result2:
>             print op, " not in the first"
>         table1 = result1[op]
>         table2 = result2[op]
>         if table1 == table2:
>             print "Tables are the same"
>         else:
>             if set(table1.keys()) != set(table2.keys()):
>                 print "Keys are not the same"
>                 continue
>             for key in table1.keys():
>                 if table1[key] != table2[key]:
>                     print "Different at ", key, ": ", table1[key],
> table2[key]
>
> import cPickle
> import sys
>
> if __name__ == '__main__':
>     name1 = 'coercion-1.5.1-64bit.pkl'
>     name2 = 'coercion-1.6.1-64bit.pkl'
>
>     if len(sys.argv) > 1:
>         name1 = 'coercion-%s-64bit.pkl' % sys.argv[1]
>     if len(sys.argv) > 2:
>         name2 = 'coercion-%s-64bit.pkl' % sys.argv[2]
>     result1 = cPickle.load(open(name1))
>     result2 = cPickle.load(open(name2))
>     compare(result1, result2)
>
>
>
> On Sep 20, 2012, at 3:09 PM, Nathaniel Smith wrote:
>
> > On Mon, Sep 17, 2012 at 10:22 AM, Matthew Brett <matthew.brett at gmail.com>
> wrote:
> >> Hi,
> >>
> >> On Sun, Sep 9, 2012 at 6:12 PM, Frédéric Bastien <nouiz at nouiz.org>
> wrote:
> >>> The third is releated to change to the casting rules in numpy. Before
> >>> a scalar complex128 * vector float32 gived a vector of dtype
> >>> complex128. Now it give a vector of complex64. The reason is that now
> >>> the scalar of different category only change the category, not the
> >>> precision. I would consider a must that we warn clearly about this
> >>> interface change. Most people won't see it, but people that optimize
> >>> there code heavily could depend on such thing.
> >>
> >> It seems to me that it would be a very good idea to put the casting
> >> table results into the tests to make sure we are keeping track of this
> >> kind of thing.
> >>
> >> I'm happy to try to do it if no-one else more qualified has time.
> >
> > I haven't seen any PRs show up from anyone else in the last few days,
> > and this would indeed be an excellent test to have, so that would be
> > awesome.
> >
>

IIRC, there are some scripts in the numpy repository. But I forget where I
saw them.

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20120920/28bff4c5/attachment.html>


More information about the NumPy-Discussion mailing list