import sys, os
fortran = sys.stdout.fileno()
def fwrite(*args):
s = " ".join(map(str, args))
os.fstat(fortran) # stat does an fsync and accepts an integer fd
os.write(fortran, s+"\n")
os.fstat(fortran)
def dump(a):
fwrite(str(a))
def cr():
fwrite("\n");
def in_f(a, b):
fwrite("foo.in_f:");
ra = sys.getrefcount(a)
foo.in_f(a);
if ra != sys.getrefcount(a):
fwrite("ref count error:", ra, sys.getrefcount(a))
def in_c(a, b):
fwrite("foo.in_c:");
ra = sys.getrefcount(a)
foo.in_c(a);
if ra != sys.getrefcount(a):
f.write("ref count error:", ra, sys.getrefcount(a))
def in_comma_out_f(a, b):
fwrite("foo.in_comma_out_f:")
ra = sys.getrefcount(a)
rb = sys.getrefcount(b)
a1, b1 = foo.in_comma_out_f(a, b); cr()
dump(a1)
dump(b1)
if ra != sys.getrefcount(a):
fwrite("a ref count error:", ra, sys.getrefcount(a))
if rb != sys.getrefcount(b):
fwrite("b ref count error:", rb, sys.getrefcount(b))
def in_comma_out_c(a, b):
fwrite("foo.in_comma_out_c:")
ra = sys.getrefcount(a)
rb = sys.getrefcount(b)
a1, b1 = foo.in_comma_out_c(a, b); cr()
dump(a1)
dump(b1)
del a1
del b1
if ra != sys.getrefcount(a):
fwrite("a ref count error:", ra, sys.getrefcount(a))
if rb != sys.getrefcount(b):
fwrite("b ref count error:", rb, sys.getrefcount(b))
def inout_f(a, b):
fwrite("foo.inout_f:")
# The following copy is necessary because the strided array
# output for Numeric... isn't strided.
a, b = a.copy(), b.copy()
ra = sys.getrefcount(a)
rb = sys.getrefcount(b)
# print a.iscontiguous(), b.iscontiguous()
a = array.transpose(a)
b = array.transpose(b)
# print a.iscontiguous(), b.iscontiguous()
foo.inout_f(a, b); cr()
if ra != sys.getrefcount(a):
fwrite("ref count error:", ra, sys.getrefcount(a))
if rb != sys.getrefcount(b):
fwrite("ref count error:", rb, sys.getrefcount(b))
dump(a);
dump(b)
def inout_c(a, b):
fwrite("foo.inout_c:")
ra = sys.getrefcount(a)
rb = sys.getrefcount(b)
foo.inout_c(a, b); cr()
if ra != sys.getrefcount(a):
fwrite("ref count error:", ra, sys.getrefcount(a))
if rb != sys.getrefcount(b):
fwrite("ref count error:", rb, sys.getrefcount(b))
dump(a);
dump(b)
def out_c(a, b):
rb = sys.getrefcount(b)
b = foo.out_c(b, b.shape[0], b.shape[1])
if rb != sys.getrefcount(b):
fwrite("ref count error:", rb, sys.getrefcount(b))
dump(b)
def out_f(a, b):
rb = sys.getrefcount(b)
b = foo.out_f(b, b.shape[0], b.shape[1])
if rb != sys.getrefcount(b):
fwrite("ref count error:", rb, sys.getrefcount(b))
dump(b)
def standard():
a = array.arange(80.)
a.shape = (8,10)
b = a.copy()
return a,b
def byteswapped():
a = array.arange(80., shape=(8,10))
a.byteswap()
a.togglebyteorder()
b = array.arange(80., shape=(8,10))
b.byteswap()
b.togglebyteorder()
assert a.isbyteswapped()
assert b.isbyteswapped()
return a,b
def misaligned():
a0 = array.arange(80., shape=(8,10))
a = array.NumArray(shape=(90,), type='Float64')
a._shape = (8,10)
a._strides = (80, 8)
a._byteoffset = 1
a[:] = a0
b = array.NumArray(shape=(90,), type='Float64')
b._shape = (8, 10)
b._strides = (80, 8)
b._byteoffset = 1
b[:] = a0
assert not a.isaligned()
assert not b.isaligned()
return a, b
def strided():
a0 = array.arange(80., shape=(8,10))
a = array.arange(320., shape=(32,10))[::4,:]
a[:] = a0
b = array.arange(320., shape=(32,10))[::4,:]
b[:] = a0
assert not a.iscontiguous()
assert not b.iscontiguous()
return a, b
def main(array_pkg, behavior, kind):
if array_pkg == "Numeric":
import Numeric as array0, Numeric_foo as foo0
else:
import numarray as array0, numarray_foo as foo0
global array, foo
array = array0
foo = foo0
kind_f = eval(kind)
a, b = eval(behavior+"()")
kind_f(a, b)
if __name__ == "__main__":
main(sys.argv[1], sys.argv[2], sys.argv[3])
syntax highlighted by Code2HTML, v. 0.9.1