Exemplo n.º 1
0
def test_start():
    '''
    Has a different start from the base array.
    '''
    orig = np.random.rand(20,20)
    a = orig[0:20:1,0:20:1]

    start = (wn.addr(a) - wn.addr(orig)) / a.itemsize
    orig = wn.array(orig)
    z = np.copy(a)
    z = np.exp(z)

    shapes = orig.weldobj.update(np.array(list(a.shape)))

    strides = []
    for s in a.strides:
        strides.append(s/8)

    strides = orig.weldobj.update(np.array(strides))

    end = 1
    for s in a.shape:
        end = end*s
    end = end + start

    iter_code = 'result(for(nditer({arr}, {start}L, {end}L, 1L, {shapes}, {strides}), appender, \
    |b, i, e| merge(b,exp(e))))'.format(shapes=shapes, strides=strides, end=str(end),
            start=str(start), arr=orig.name)
    orig.weldobj.weld_code = iter_code
    np_a = orig._eval()

    assert_correct(np_a, z)
def test_zip():
    '''
    Has a different start from the base array.
    '''
    orig = np.random.rand(20, 20)
    orig2 = np.random.rand(20, 20)
    a = orig[5:20:1, 3:20:2]
    b = orig2[5:20:1, 3:20:2]
    start = (wn.addr(a) - wn.addr(orig)) / a.itemsize
    orig = wn.array(orig)

    # copying so we can test them later.
    z = np.copy(a)
    z2 = np.copy(b)
    # added orig2 to orig's weldobject.
    orig_2_name = orig.weldobj.update(orig2)

    shapes = orig.weldobj.update(np.array(list(a.shape)))

    strides = []
    for s in a.strides:
        strides.append(s / 8)

    strides = orig.weldobj.update(np.array(strides))

    end = 1
    for s in a.shape:
        end = end * s
    end = end + start

    iter_code = 'result(for(zip(nditer({arr}, {start}l, {end}l, 1l, {shapes}, {strides}),  \
nditer({arr2}, {start}l, {end}l, 1l, {shapes}, {strides})), \
appender, |b, i, e| merge(b,e.$0+e.$1)))'.format(shapes=shapes,
                                                 strides=strides,
                                                 end=str(end),
                                                 start=str(start),
                                                 arr=orig.name,
                                                 arr2=orig_2_name)
    orig.weldobj.weld_code = iter_code
    # gives us a numpy array after evaluating the nditer code above.
    np_a = orig._eval()
    # update the copied array.
    z3 = z + z2
    # test values are equal.
    assert_correct(np_a, z3)
def test_view():
    '''
    Adding the iter code to a view.
    In general, do we deal correctly with wn.array(view)??
    '''
    orig = np.random.rand(20, 20)
    a = orig[3:15:1, 4:20:2]

    # orig = np.random.rand(20,20,20)
    # a = orig[3:15:3,:,:]

    print(a.flags)
    assert not a.flags.contiguous
    a = wn.array(a)
    z = np.copy(a)

    shapes = a.weldobj.update(np.array(list(a.shape)))

    strides = []
    for s in a.strides:
        strides.append(s / z.itemsize)

    strides = a.weldobj.update(np.array(strides))

    end = 1
    for s in a.shape:
        end = end * s
    end = end

    iter_code = 'result(for(nditer({arr}, 0L, {end}L, 1L, {shapes}, {strides}), appender, \
    |b, i, e| merge(b,exp(e))))'.format(shapes=shapes,
                                        strides=strides,
                                        end=str(end),
                                        arr=a.name)

    a.weldobj.weld_code = iter_code
    z = np.exp(z)
    # convert the data represented by weldarray 'a', to a multi-dimensional numpy array of shape as z,
    # and then compare the values.
    np_a = a._eval()
    assert_correct(np_a, z)