def test_without_many(): HashTable = make_persistent_hash_type() acc = HashTable.EMPTY for i in range(256): acc = acc.assoc(i, i) acc = acc.without_many(range(256)) assert len(acc) == 0
def test_without_many(): HashTable = make_persistent_hash_type() acc = HashTable.EMPTY for i in range(256): acc = acc.assoc(i, i) acc = acc.without_many(range(256)) assert len(acc) == 0
def test_persistent_hash_collisions2(): HashTable = make_persistent_hash_type(hashfun=lambda x: r_uint(hash(x)) % 8) acc = HashTable.EMPTY for i in range(2048): validate_persistent_hash(acc) acc = acc.assoc(i % 128, i) assert len(acc) == 128 assert len(list(acc.iteritems())) == 128 for k, v in acc.iteritems(): assert acc.val_at(k, None) is v
def test_persistent_hash_collisions2(): HashTable = make_persistent_hash_type(hashfun=lambda x: r_uint(hash(x)) % 8) acc = HashTable.EMPTY for i in range(2048): validate_persistent_hash(acc) acc = acc.assoc(i % 128, i) assert len(acc) == 128 assert len(list(acc.iteritems())) == 128 for k, v in acc.iteritems(): assert acc.val_at(k, None) is v
def test_persistent_hash_collisions(): HashTable = make_persistent_hash_type(hashfun=lambda x: r_uint(42)) acc = HashTable.EMPTY for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i) assert len(acc) == 10 assert len(list(acc.iteritems())) == 10 for k, v in acc.iteritems(): assert k <= 10 assert v >= 990 assert v % 10 == k assert acc.val_at(k, None) is v
def test_persistent_hash_collisions(): HashTable = make_persistent_hash_type(hashfun=lambda x: r_uint(42)) acc = HashTable.EMPTY for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i) assert len(acc) == 10 assert len(list(acc.iteritems())) == 10 for k, v in acc.iteritems(): assert k <= 10 assert v >= 990 assert v % 10 == k assert acc.val_at(k, None) is v
def test_persistent_hash_union(): HashTable = make_persistent_hash_type() acc1 = HashTable.EMPTY acc2 = HashTable.EMPTY for i in range(128): acc1 = acc1.assoc(i, i) for i in range(128, 256): acc2 = acc2.assoc(i, i) assert len(acc1) == 128 assert len(acc2) == 128 acc3 = acc1 + acc2 assert len(acc3) == 256 for i in range(256): assert i in acc3
def test_persistent_hash_union(): HashTable = make_persistent_hash_type() acc1 = HashTable.EMPTY acc2 = HashTable.EMPTY for i in range(128): acc1 = acc1.assoc(i, i) for i in range(128, 256): acc2 = acc2.assoc(i, i) assert len(acc1) == 128 assert len(acc2) == 128 acc3 = acc1 + acc2 assert len(acc3) == 256 for i in range(256): assert i in acc3
def test_persistent_hash2(): HashTable = make_persistent_hash_type() acc = HashTable.EMPTY() for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i) for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i) assert len(acc) == 10 assert len(list(acc.iteritems())) == 10 for k, v in acc.iteritems(): assert k <= 10 assert v >= 990 assert v % 10 == k assert acc.val_at(k, None) is v
def test_persistent_hash2(): HashTable = make_persistent_hash_type() acc = HashTable.EMPTY() for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i) for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i) assert len(acc) == 10 assert len(list(acc.iteritems())) == 10 for k, v in acc.iteritems(): assert k <= 10 assert v >= 990 assert v % 10 == k assert acc.val_at(k, None) is v
def test_persistent_hash__collisions_removal2(): HashTable = make_persistent_hash_type(hashfun=lambda x: r_uint(hash(x) % 8)) acc = HashTable.EMPTY() for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i).without(i % 10) assert len(acc) == 0 assert list(acc.iteritems()) == [] for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i).without(i % 10 + 1) assert len(acc) == 10 assert len(list(acc.iteritems())) == 10 for k, v in acc.iteritems(): assert k <= 10 assert v >= 990 assert v % 10 == k assert acc.val_at(k, None) is v
def test_persistent_hash__collisions_removal2(): HashTable = make_persistent_hash_type( hashfun=lambda x: r_uint(hash(x) % 8)) acc = HashTable.EMPTY() for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i).without(i % 10) assert len(acc) == 0 assert list(acc.iteritems()) == [] for i in range(1000): validate_persistent_hash(acc) acc = acc.assoc(i % 10, i).without(i % 10 + 1) assert len(acc) == 10 assert len(list(acc.iteritems())) == 10 for k, v in acc.iteritems(): assert k <= 10 assert v >= 990 assert v % 10 == k assert acc.val_at(k, None) is v
@objectmodel.always_inline def compute_hash(x): assert objectmodel.we_are_translated() or type(x) is ParamKey return r_uint(objectmodel.compute_hash(x)) @objectmodel.always_inline def equal(a, b): assert objectmodel.we_are_translated() or type(a) is ParamKey assert objectmodel.we_are_translated() or type(b) is ParamKey return a is b ParameterizationHashTable = make_persistent_hash_type( super=W_Object, name="ParameterizationHashTable", hashfun=compute_hash, equal=equal) # This is a Scheme_Parameterization in Racket class RootParameterization(object): _attrs_ = ["table"] def __init__(self): # This table maps ParamKey -> W_ThreadCell self.table = {} @continuation def extend_cont(paramz, i, eventual_vals, vals, params, env, cont, _vals):
from rpython.rlib.rarithmetic import r_uint @objectmodel.always_inline def compute_hash(x): assert objectmodel.we_are_translated() or type(x) is ParamKey return r_uint(objectmodel.compute_hash(x)) @objectmodel.always_inline def equal(a, b): assert objectmodel.we_are_translated() or type(a) is ParamKey assert objectmodel.we_are_translated() or type(b) is ParamKey return a is b ParameterizationHashTable = make_persistent_hash_type( super = W_Object, name = "ParameterizationHashTable", hashfun = compute_hash, equal = equal) # This is a Scheme_Parameterization in Racket class RootParameterization(object): def __init__(self): # This table maps ParamKey -> W_ThreadCell self.table = {} # This is a Scheme_Config in Racket # Except that Scheme_Config uses a functional hash table and this uses a list that we copy class W_Parameterization(W_Object): _immutable_fields_ = ["root", "map"] errorname = "parameterization" def __init__(self, root, map):
return compute_hash(k.value) if isinstance(k, values.W_Character): return ord(k.value) return compute_hash(k) @staticmethod def cmp_value(a, b): from pycket.prims.equal import eqp_logic return eqp_logic(a, b) def get_item(self, i): return get_dict_item(self.data, i) W_EqvImmutableHashTable = make_persistent_hash_type( super=W_ImmutableHashTable, name="W_EqvImmutableHashTable", hashfun=lambda x: r_uint(W_EqvMutableHashTable.hash_value(x)), equal=W_EqvMutableHashTable.cmp_value) W_EqImmutableHashTable = make_persistent_hash_type( super=W_ImmutableHashTable, name="W_EqImmutableHashTable", hashfun=lambda x: r_uint(W_EqMutableHashTable.hash_value(x)), equal=W_EqMutableHashTable.cmp_value) class __extend__(W_EqvImmutableHashTable): def length(self): return len(self) def make_copy(self):