[pypy-commit] pypy refactor-signature: start refactoring signature. not yet rpython
fijal
noreply at buildbot.pypy.org
Wed Dec 7 11:32:20 CET 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: refactor-signature
Changeset: r50239:1f2faa79c08d
Date: 2011-12-07 12:21 +0200
http://bitbucket.org/pypy/pypy/changeset/1f2faa79c08d/
Log: start refactoring signature. not yet rpython
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -21,7 +21,6 @@
_immutable_fields_ = ["itemtype", "num", "kind"]
def __init__(self, itemtype, num, kind, name, char, w_box_type, alternate_constructors=[]):
- self.signature = signature.BaseSignature()
self.itemtype = itemtype
self.num = num
self.kind = kind
@@ -29,6 +28,10 @@
self.char = char
self.w_box_type = w_box_type
self.alternate_constructors = alternate_constructors
+ self.array_signature = signature.ArraySignature()
+ self.scalar_signature = signature.ScalarSignature()
+ #self.flatiter_signature = signature.FlatiterSignature()
+ #self.view_signature = signature.ViewSignature()
def malloc(self, length):
# XXX find out why test_zjit explodes with tracking of allocations
@@ -228,4 +231,4 @@
)
def get_dtype_cache(space):
- return space.fromcache(DtypeCache)
\ No newline at end of file
+ return space.fromcache(DtypeCache)
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -831,10 +831,7 @@
shape += self.shape[s:]
strides += self.strides[s:]
backstrides += self.backstrides[s:]
- new_sig = signature.Signature.find_sig([
- W_NDimSlice.signature, self.signature,
- ])
- return W_NDimSlice(self, new_sig, start, strides[:], backstrides[:],
+ return W_NDimSlice(self, start, strides[:], backstrides[:],
shape[:])
def descr_reshape(self, space, args_w):
@@ -861,14 +858,11 @@
concrete.shape, concrete.strides)
if new_strides:
# We can create a view, strides somehow match up.
- new_sig = signature.Signature.find_sig([
- W_NDimSlice.signature, self.signature
- ])
ndims = len(new_shape)
new_backstrides = [0] * ndims
for nd in range(ndims):
new_backstrides[nd] = (new_shape[nd] - 1) * new_strides[nd]
- arr = W_NDimSlice(self, new_sig, self.start, new_strides,
+ arr = W_NDimSlice(self, self.start, new_strides,
new_backstrides, new_shape)
else:
# Create copy with contiguous data
@@ -891,9 +885,6 @@
concrete = self.get_concrete()
if len(concrete.shape) < 2:
return space.wrap(self)
- new_sig = signature.Signature.find_sig([
- W_NDimSlice.signature, self.signature
- ])
strides = []
backstrides = []
shape = []
@@ -901,7 +892,7 @@
strides.append(concrete.strides[i])
backstrides.append(concrete.backstrides[i])
shape.append(concrete.shape[i])
- return space.wrap(W_NDimSlice(concrete, new_sig, self.start, strides[:],
+ return space.wrap(W_NDimSlice(concrete, self.start, strides[:],
backstrides[:], shape[:]))
def descr_get_flatiter(self, space):
@@ -914,7 +905,7 @@
raise NotImplementedError
def descr_debug_repr(self, space):
- return space.wrap(self.debug_repr())
+ return space.wrap(self.signature.debug_repr())
def convert_to_array(space, w_obj):
if isinstance(w_obj, BaseArray):
@@ -934,8 +925,6 @@
"""
Intermediate class representing a literal.
"""
- signature = signature.BaseSignature()
-
_attrs_ = ["dtype", "value", "shape"]
def __init__(self, dtype, value):
@@ -943,6 +932,7 @@
BaseArray.__init__(self, [], 'C')
self.dtype = dtype
self.value = value
+ self.signature = dtype.scalar_signature
def find_size(self):
return 1
@@ -968,9 +958,6 @@
def copy(self):
return Scalar(self.dtype, self.value)
- def debug_repr(self):
- return 'Scalar'
-
def setshape(self, space, new_shape):
# In order to get here, we already checked that prod(new_shape) == 1,
# so in order to have a consistent API, let it go through.
@@ -1054,30 +1041,18 @@
return self.res_dtype
def _eval(self, iter):
+ # XXX deal with forced args
assert isinstance(iter, Call1Iterator)
val = self.values.eval(iter.child).convert_to(self.res_dtype)
sig = jit.promote(self.signature)
- assert isinstance(sig, signature.Signature)
- call_sig = sig.components[0]
- assert isinstance(call_sig, signature.Call1)
- return call_sig.func(self.res_dtype, val)
+ assert isinstance(sig, signature.Call1)
+ return sig.func(self.res_dtype, val)
def start_iter(self, res_shape=None):
if self.forced_result is not None:
return self.forced_result.start_iter(res_shape)
return Call1Iterator(self.values.start_iter(res_shape))
- def debug_repr(self):
- sig = self.signature
- assert isinstance(sig, signature.Signature)
- call_sig = sig.components[0]
- assert isinstance(call_sig, signature.Call1)
- if self.forced_result is not None:
- return 'Call1(%s, forced=%s)' % (call_sig.name,
- self.forced_result.debug_repr())
- return 'Call1(%s, %s)' % (call_sig.name,
- self.values.debug_repr())
-
class Call2(VirtualArray):
"""
Intermediate class for performing binary operations.
@@ -1112,12 +1087,11 @@
lhs = self.left.eval(iter.left).convert_to(self.calc_dtype)
rhs = self.right.eval(iter.right).convert_to(self.calc_dtype)
sig = jit.promote(self.signature)
- assert isinstance(sig, signature.Signature)
- call_sig = sig.components[0]
- assert isinstance(call_sig, signature.Call2)
- return call_sig.func(self.calc_dtype, lhs, rhs)
+ assert isinstance(sig, signature.Call2)
+ return sig.func(self.calc_dtype, lhs, rhs)
def debug_repr(self):
+ xxx
sig = self.signature
assert isinstance(sig, signature.Signature)
call_sig = sig.components[0]
@@ -1134,11 +1108,10 @@
Class for representing views of arrays, they will reflect changes of parent
arrays. Example: slices
"""
- def __init__(self, parent, signature, strides, backstrides, shape):
+ def __init__(self, parent, strides, backstrides, shape):
self.strides = strides
self.backstrides = backstrides
BaseArray.__init__(self, shape, parent.order)
- self.signature = signature
self.parent = parent
self.invalidates = parent.invalidates
@@ -1203,13 +1176,11 @@
self.shape = new_shape[:]
class W_NDimSlice(ViewArray):
- signature = signature.BaseSignature()
-
- def __init__(self, parent, signature, start, strides, backstrides,
- shape):
+ def __init__(self, parent, start, strides, backstrides, shape):
if isinstance(parent, W_NDimSlice):
parent = parent.parent
- ViewArray.__init__(self, parent, signature, strides, backstrides, shape)
+ ViewArray.__init__(self, parent, strides, backstrides, shape)
+ self.signature = signature.find_sig(signature.ViewSignature(parent.signature))
self.start = start
self.size = 1
for sh in shape:
@@ -1272,7 +1243,7 @@
self.size = size
self.dtype = dtype
self.storage = dtype.malloc(size)
- self.signature = dtype.signature
+ self.signature = dtype.array_signature
def get_concrete(self):
return self
@@ -1470,21 +1441,19 @@
class W_FlatIterator(ViewArray):
- signature = signature.BaseSignature()
@jit.unroll_safe
def __init__(self, arr):
size = 1
for sh in arr.shape:
size *= sh
- new_sig = signature.Signature.find_sig([
- W_FlatIterator.signature, arr.signature
- ])
- ViewArray.__init__(self, arr, new_sig, [arr.strides[-1]],
+ ViewArray.__init__(self, arr, [arr.strides[-1]],
[arr.backstrides[-1]], [size])
self.shapelen = len(arr.shape)
self.arr = arr
self.iter = self.start_iter()
+ self.signature = signature.find_sig(signature.FlatiterSignature(
+ arr.signature))
def start_iter(self, res_shape=None):
if res_shape is not None and res_shape != self.shape:
diff --git a/pypy/module/micronumpy/interp_ufuncs.py b/pypy/module/micronumpy/interp_ufuncs.py
--- a/pypy/module/micronumpy/interp_ufuncs.py
+++ b/pypy/module/micronumpy/interp_ufuncs.py
@@ -78,9 +78,8 @@
start = start.next(shapelen)
else:
value = self.identity.convert_to(dtype)
- new_sig = signature.Signature.find_sig([
- self.reduce_signature, obj.signature
- ])
+ new_sig = signature.find_sig(
+ signature.ReduceSignature(self.func, obj.signature))
return self.reduce_loop(new_sig, shapelen, start, value, obj, dtype)
def reduce_loop(self, signature, shapelen, i, value, obj, dtype):
@@ -101,7 +100,6 @@
W_Ufunc.__init__(self, name, promote_to_float, promote_bools, identity)
self.func = func
- self.signature = signature.Call1(func)
def call(self, space, args_w):
from pypy.module.micronumpy.interp_numarray import (Call1,
@@ -117,7 +115,8 @@
if isinstance(w_obj, Scalar):
return self.func(res_dtype, w_obj.value.convert_to(res_dtype))
- new_sig = signature.Signature.find_sig([self.signature, w_obj.signature])
+ new_sig = signature.find_sig(signature.Call1(self.func,
+ w_obj.signature))
w_res = Call1(new_sig, w_obj.shape, res_dtype, w_obj, w_obj.order)
w_obj.add_invalidates(w_res)
return w_res
@@ -133,8 +132,6 @@
W_Ufunc.__init__(self, name, promote_to_float, promote_bools, identity)
self.func = func
self.comparison_func = comparison_func
- self.signature = signature.Call2(func)
- self.reduce_signature = signature.BaseSignature()
def call(self, space, args_w):
from pypy.module.micronumpy.interp_numarray import (Call2,
@@ -158,9 +155,9 @@
w_rhs.value.convert_to(calc_dtype)
)
- new_sig = signature.Signature.find_sig([
- self.signature, w_lhs.signature, w_rhs.signature
- ])
+ new_sig = signature.find_sig(signature.Call2(self.func,
+ w_lhs.signature,
+ w_rhs.signature))
new_shape = shape_agreement(space, w_lhs.shape, w_rhs.shape)
w_res = Call2(new_sig, new_shape, calc_dtype,
res_dtype, w_lhs, w_rhs)
diff --git a/pypy/module/micronumpy/signature.py b/pypy/module/micronumpy/signature.py
--- a/pypy/module/micronumpy/signature.py
+++ b/pypy/module/micronumpy/signature.py
@@ -2,53 +2,129 @@
from pypy.rlib.rarithmetic import intmask
-def components_eq(lhs, rhs):
- if len(lhs) != len(rhs):
- return False
- for i in range(len(lhs)):
- v1, v2 = lhs[i], rhs[i]
- if type(v1) is not type(v2) or not v1.eq(v2):
- return False
- return True
+# def components_eq(lhs, rhs):
+# if len(lhs) != len(rhs):
+# return False
+# for i in range(len(lhs)):
+# v1, v2 = lhs[i], rhs[i]
+# if type(v1) is not type(v2) or not v1.eq(v2):
+# return False
+# return True
-def components_hash(components):
- res = 0x345678
- for component in components:
- res = intmask((1000003 * res) ^ component.hash())
- return res
+# def components_hash(components):
+# res = 0x345678
+# for component in components:
+# res = intmask((1000003 * res) ^ component.hash())
+# return res
-class BaseSignature(object):
- _attrs_ = []
+def sigeq(one, two):
+ return one.eq(two)
+def sighash(sig):
+ return sig.hash()
+
+known_sigs = r_dict(sigeq, sighash)
+
+def find_sig(sig):
+ return known_sigs.setdefault(sig, sig)
+
+class Signature(object):
def eq(self, other):
return self is other
def hash(self):
return compute_identity_hash(self)
-class Signature(BaseSignature):
- _known_sigs = r_dict(components_eq, components_hash)
+class ViewSignature(Signature):
+ def __init__(self, child):
+ self.child = child
+
+ def eq(self, other):
+ if type(self) != type(other):
+ return False
+ return self.child.eq(other.child)
- _attrs_ = ["components"]
- _immutable_fields_ = ["components[*]"]
+ def hash(self):
+ return self.child.hash() ^ 0x12345
- def __init__(self, components):
- self.components = components
+ def debug_repr(self):
+ return 'Slice(%s)' % self.child.debug_repr()
- @staticmethod
- def find_sig(components):
- return Signature._known_sigs.setdefault(components, Signature(components))
+class ArraySignature(Signature):
+ def debug_repr(self):
+ return 'Array'
-class Call1(BaseSignature):
- _immutable_fields_ = ["func", "name"]
+class ScalarSignature(Signature):
+ def debug_repr(self):
+ return 'Scalar'
- def __init__(self, func):
+class FlatiterSignature(ViewSignature):
+ def debug_repr(self):
+ return 'FlatIter(%s)' % self.child.debug_repr()
+
+class Call1(Signature):
+ def __init__(self, func, child):
self.func = func
- self.name = func.func_name
+ self.child = child
-class Call2(BaseSignature):
- _immutable_fields_ = ["func", "name"]
+ def hash(self):
+ return compute_identity_hash(self.func) ^ (self.child.hash() << 1)
- def __init__(self, func):
+ def eq(self, other):
+ if type(other) != type(self):
+ return False
+ return self.child.eq(other.child)
+
+ def debug_repr(self):
+ return 'Call1(%s, %s)' % (self.func.func_name,
+ self.child.debug_repr())
+
+class Call2(Signature):
+ def __init__(self, func, left, right):
self.func = func
- self.name = func.func_name
+ self.left = left
+ self.right = right
+
+ def hash(self):
+ return (compute_identity_hash(self.func) ^ (self.left.hash() << 1) ^
+ (self.right.hash() << 2))
+
+ def eq(self, other):
+ if type(other) != type(self):
+ return False
+ return self.left.eq(other.left) and self.right.eq(other.right)
+
+ def debug_repr(self):
+ return 'Call2(%s, %s, %s)' % (self.func.func_name,
+ self.left.debug_repr(),
+ self.right.debug_repr())
+
+class ReduceSignature(Call1):
+ pass
+
+# class Signature(BaseSignature):
+# _known_sigs = r_dict(components_eq, components_hash)
+
+# _attrs_ = ["components"]
+# _immutable_fields_ = ["components[*]"]
+
+# def __init__(self, components):
+# self.components = components
+
+# @staticmethod
+# def find_sig(components):
+# return Signature._known_sigs.setdefault(components, Signature(components))
+
+# class Call1(BaseSignature):
+# _immutable_fields_ = ["func", "name"]
+
+# def __init__(self, func):
+# self.func = func
+# self.name = func.func_name
+
+# class Call2(BaseSignature):
+# _immutable_fields_ = ["func", "name"]
+
+# def __init__(self, func):
+# self.func = func
+# self.name = func.func_name
diff --git a/pypy/module/micronumpy/test/test_numarray.py b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -8,7 +8,8 @@
class MockDtype(object):
- signature = signature.BaseSignature()
+ array_signature = signature.ArraySignature()
+ scalar_signature = signature.ScalarSignature()
def malloc(self, size):
return None
@@ -877,6 +878,7 @@
assert sin(a).__debug_repr__() == 'Call1(sin, Array)'
b = a + a
b[0] = 3
+ skip("not there")
assert b.__debug_repr__() == 'Call2(add, forced=Array)'
class AppTestMultiDim(BaseNumpyAppTest):
More information about the pypy-commit
mailing list