Forráskód Böngészése

Fix issue with missing symbol; fix compare functions.

Stefano Cossu 5 éve
szülő
commit
edb260f82b

+ 191 - 189
lakesuperior/cy_include/collections.pxd

@@ -4,17 +4,11 @@ ctypedef void* (*mem_alloc_ft)(size_t size)
 ctypedef void* (*mem_calloc_ft)(size_t blocks, size_t size)
 ctypedef void (*mem_free_ft)(void* block)
 ctypedef size_t (*hash_ft)(const void* key, int l, uint32_t seed)
-ctypedef bint (*key_compare_ft)(const void* key1, const void* key2)
+ctypedef int (*key_compare_ft)(const void* key1, const void* key2)
 
 
 cdef extern from "common.h":
 
-    int cc_common_cmp_str(const void* key1, const void* key2)
-
-    int cc_common_cmp_ptr(const void* key1, const void* key2)
-
-cdef extern from "array.h":
-
     cdef enum cc_stat:
         CC_OK
         CC_ERR_ALLOC
@@ -25,140 +19,147 @@ cdef extern from "array.h":
         CC_ERR_VALUE_NOT_FOUND
         CC_ERR_OUT_OF_RANGE
         CC_ITER_END
-
-    ctypedef struct Array:
-        pass
-
-    ctypedef struct ArrayConf:
-        size_t          capacity
-        float           exp_factor
-        mem_alloc_ft  mem_alloc
-        mem_calloc_ft mem_calloc
-        mem_free_ft   mem_free
-
-    ctypedef struct ArrayIter:
-        Array* ar
-        size_t index
-        bint last_removed
-
-    ctypedef struct ArrayZipIter:
-        Array* ar1
-        Array* ar2
-        size_t index
-        bint last_removed
-
-    cc_stat array_new(Array** out)
-
-    cc_stat array_new_conf(ArrayConf* conf, Array** out)
-
-    void array_conf_init(ArrayConf* conf)
-
-    void array_destroy(Array* ar)
-
-    ctypedef void (*_array_destroy_cb_cb_ft)(void*)
-
-    void array_destroy_cb(Array* ar, _array_destroy_cb_cb_ft cb)
-
-    #cc_stat array_add(Array* ar, void* element)
-
-    #cc_stat array_add_at(Array* ar, void* element, size_t index)
-
-    cc_stat array_replace_at(Array* ar, void* element, size_t index, void** out)
-
-    cc_stat array_swap_at(Array* ar, size_t index1, size_t index2)
-
-    cc_stat array_remove(Array* ar, void* element, void** out)
-
-    cc_stat array_remove_at(Array* ar, size_t index, void** out)
-
-    cc_stat array_remove_last(Array* ar, void** out)
-
-    void array_remove_all(Array* ar)
-
-    void array_remove_all_free(Array* ar)
-
-    cc_stat array_get_at(Array* ar, size_t index, void** out)
-
-    cc_stat array_get_last(Array* ar, void** out)
-
-    cc_stat array_subarray(Array* ar, size_t from_, size_t to, Array** out)
-
-    cc_stat array_copy_shallow(Array* ar, Array** out)
-
-    ctypedef void* (*_array_copy_deep_cp_ft)(void*)
-
-    cc_stat array_copy_deep(Array* ar, _array_copy_deep_cp_ft cp, Array** out)
-
-    void array_reverse(Array* ar)
-
-    cc_stat array_trim_capacity(Array* ar)
-
-    size_t array_contains(Array* ar, void* element)
-
-    ctypedef int (*_array_contains_value_cmp_ft)(void*, void*)
-
-    size_t array_contains_value(Array* ar, void* element, _array_contains_value_cmp_ft cmp)
-
-    size_t array_size(Array* ar)
-
-    size_t array_capacity(Array* ar)
-
-    cc_stat array_index_of(Array* ar, void* element, size_t* index)
-
-    ctypedef int (*_array_sort_cmp_ft)(void*, void*)
-
-    void array_sort(Array* ar, _array_sort_cmp_ft cmp)
-
-    ctypedef void (*_array_map_fn_ft)(void*)
-
-    void array_map(Array* ar, _array_map_fn_ft fn)
-
-    ctypedef void (*_array_reduce_fn_ft)(void*, void*, void*)
-
-    void array_reduce(Array* ar, _array_reduce_fn_ft fn, void* result)
-
-    ctypedef bint (*_array_filter_mut_predicate_ft)(void*)
-
-    cc_stat array_filter_mut(Array* ar, _array_filter_mut_predicate_ft predicate)
-
-    ctypedef bint (*_array_filter_predicate_ft)(void*)
-
-    cc_stat array_filter(Array* ar, _array_filter_predicate_ft predicate, Array** out)
-
-    void array_iter_init(ArrayIter* iter, Array* ar)
-
-    cc_stat array_iter_next(ArrayIter* iter, void** out)
-
-    cc_stat array_iter_remove(ArrayIter* iter, void** out)
-
-    cc_stat array_iter_add(ArrayIter* iter, void* element)
-
-    cc_stat array_iter_replace(ArrayIter* iter, void* element, void** out)
-
-    size_t array_iter_index(ArrayIter* iter)
-
-    void array_zip_iter_init(ArrayZipIter* iter, Array* a1, Array* a2)
-
-    cc_stat array_zip_iter_next(ArrayZipIter* iter, void** out1, void** out2)
-
-    cc_stat array_zip_iter_add(ArrayZipIter* iter, void* e1, void* e2)
-
-    cc_stat array_zip_iter_remove(ArrayZipIter* iter, void** out1, void** out2)
-
-    cc_stat array_zip_iter_replace(ArrayZipIter* iter, void* e1, void* e2, void** out1, void** out2)
-
-    size_t array_zip_iter_index(ArrayZipIter* iter)
-
-    void** array_get_buffer(Array* ar)
+        CC_DUP_KEY
+#
+#    int cc_common_cmp_str(const void* key1, const void* key2)
+#
+#    int cc_common_cmp_ptr(const void* key1, const void* key2)
+
+#cdef extern from "array.h":
+
+#    ctypedef struct Array:
+#        pass
+#
+#    ctypedef struct ArrayConf:
+#        size_t          capacity
+#        float           exp_factor
+#        mem_alloc_ft  mem_alloc
+#        mem_calloc_ft mem_calloc
+#        mem_free_ft   mem_free
+#
+#    ctypedef struct ArrayIter:
+#        Array* ar
+#        size_t index
+#        bint last_removed
+#
+#    ctypedef struct ArrayZipIter:
+#        Array* ar1
+#        Array* ar2
+#        size_t index
+#        bint last_removed
+#
+#    cc_stat array_new(Array** out)
+#
+#    cc_stat array_new_conf(ArrayConf* conf, Array** out)
+#
+#    void array_conf_init(ArrayConf* conf)
+#
+#    void array_destroy(Array* ar)
+#
+#    ctypedef void (*_array_destroy_cb_cb_ft)(void*)
+#
+#    void array_destroy_cb(Array* ar, _array_destroy_cb_cb_ft cb)
+#
+#    #cc_stat array_add(Array* ar, void* element)
+#
+#    #cc_stat array_add_at(Array* ar, void* element, size_t index)
+#
+#    cc_stat array_replace_at(Array* ar, void* element, size_t index, void** out)
+#
+#    cc_stat array_swap_at(Array* ar, size_t index1, size_t index2)
+#
+#    cc_stat array_remove(Array* ar, void* element, void** out)
+#
+#    cc_stat array_remove_at(Array* ar, size_t index, void** out)
+#
+#    cc_stat array_remove_last(Array* ar, void** out)
+#
+#    void array_remove_all(Array* ar)
+#
+#    void array_remove_all_free(Array* ar)
+#
+#    cc_stat array_get_at(Array* ar, size_t index, void** out)
+#
+#    cc_stat array_get_last(Array* ar, void** out)
+#
+#    cc_stat array_subarray(Array* ar, size_t from_, size_t to, Array** out)
+#
+#    cc_stat array_copy_shallow(Array* ar, Array** out)
+#
+#    ctypedef void* (*_array_copy_deep_cp_ft)(void*)
+#
+#    cc_stat array_copy_deep(Array* ar, _array_copy_deep_cp_ft cp, Array** out)
+#
+#    void array_reverse(Array* ar)
+#
+#    cc_stat array_trim_capacity(Array* ar)
+#
+#    size_t array_contains(Array* ar, void* element)
+#
+#    ctypedef int (*_array_contains_value_cmp_ft)(void*, void*)
+#
+#    size_t array_contains_value(Array* ar, void* element, _array_contains_value_cmp_ft cmp)
+#
+#    size_t array_size(Array* ar)
+#
+#    size_t array_capacity(Array* ar)
+#
+#    cc_stat array_index_of(Array* ar, void* element, size_t* index)
+#
+#    ctypedef int (*_array_sort_cmp_ft)(void*, void*)
+#
+#    void array_sort(Array* ar, _array_sort_cmp_ft cmp)
+#
+#    ctypedef void (*_array_map_fn_ft)(void*)
+#
+#    void array_map(Array* ar, _array_map_fn_ft fn)
+#
+#    ctypedef void (*_array_reduce_fn_ft)(void*, void*, void*)
+#
+#    void array_reduce(Array* ar, _array_reduce_fn_ft fn, void* result)
+#
+#    ctypedef bint (*_array_filter_mut_predicate_ft)(void*)
+#
+#    cc_stat array_filter_mut(Array* ar, _array_filter_mut_predicate_ft predicate)
+#
+#    ctypedef bint (*_array_filter_predicate_ft)(void*)
+#
+#    cc_stat array_filter(Array* ar, _array_filter_predicate_ft predicate, Array** out)
+#
+#    void array_iter_init(ArrayIter* iter, Array* ar)
+#
+#    cc_stat array_iter_next(ArrayIter* iter, void** out)
+#
+#    cc_stat array_iter_remove(ArrayIter* iter, void** out)
+#
+#    cc_stat array_iter_add(ArrayIter* iter, void* element)
+#
+#    cc_stat array_iter_replace(ArrayIter* iter, void* element, void** out)
+#
+#    size_t array_iter_index(ArrayIter* iter)
+#
+#    void array_zip_iter_init(ArrayZipIter* iter, Array* a1, Array* a2)
+#
+#    cc_stat array_zip_iter_next(ArrayZipIter* iter, void** out1, void** out2)
+#
+#    cc_stat array_zip_iter_add(ArrayZipIter* iter, void* e1, void* e2)
+#
+#    cc_stat array_zip_iter_remove(ArrayZipIter* iter, void** out1, void** out2)
+#
+#    cc_stat array_zip_iter_replace(ArrayZipIter* iter, void* e1, void* e2, void** out1, void** out2)
+#
+#    size_t array_zip_iter_index(ArrayZipIter* iter)
+#
+#    void** array_get_buffer(Array* ar)
 
 
 cdef extern from "hashtable.h":
 
-    ctypedef struct TableEntry:
-        void*       key
-        void*       value
-        size_t      hash
-        TableEntry* next
+#    ctypedef struct TableEntry:
+#        void*       key
+#        void*       value
+#        size_t      hash
+#        TableEntry* next
 
     ctypedef struct HashTable:
         pass
@@ -176,58 +177,59 @@ cdef extern from "hashtable.h":
         mem_free_ft   mem_free
 
     ctypedef struct HashTableIter:
-        HashTable* table
-        size_t bucket_index
-        TableEntry* prev_entry
-        TableEntry* next_entry
-
-    size_t get_table_index(HashTable *table, void *key)
-
-    void hashtable_conf_init(HashTableConf* conf)
-
-    cc_stat hashtable_new(HashTable** out)
-
-    cc_stat hashtable_new_conf(HashTableConf* conf, HashTable** out)
-
-    void hashtable_destroy(HashTable* table)
-
-    cc_stat hashtable_add(HashTable* table, void* key, void* val)
-
-    cc_stat hashtable_get(HashTable* table, void* key, void** out)
-
-    cc_stat hashtable_remove(HashTable* table, void* key, void** out)
-
-    void hashtable_remove_all(HashTable* table)
-
-    bint hashtable_contains_key(HashTable* table, void* key)
-
-    size_t hashtable_size(HashTable* table)
-
-    size_t hashtable_capacity(HashTable* table)
-
-    cc_stat hashtable_get_keys(HashTable* table, Array** out)
-
-    cc_stat hashtable_get_values(HashTable* table, Array** out)
-
-    size_t hashtable_hash_string(void* key, int len, uint32_t seed)
-
-    size_t hashtable_hash(void* key, int len, uint32_t seed)
-
-    size_t hashtable_hash_ptr(void* key, int len, uint32_t seed)
-
-    ctypedef void (*_hashtable_foreach_key_op_ft)(void*)
-
-    void hashtable_foreach_key(HashTable* table, _hashtable_foreach_key_op_ft op)
-
-    ctypedef void (*_hashtable_foreach_value_op_ft)(void*)
-
-    void hashtable_foreach_value(HashTable* table, _hashtable_foreach_value_op_ft op)
-
-    void hashtable_iter_init(HashTableIter* iter, HashTable* table)
-
-    cc_stat hashtable_iter_next(HashTableIter* iter, TableEntry** out)
-
-    cc_stat hashtable_iter_remove(HashTableIter* iter, void** out)
+        pass
+#        HashTable* table
+#        size_t bucket_index
+#        TableEntry* prev_entry
+#        TableEntry* next_entry
+#
+#    size_t get_table_index(HashTable *table, void *key)
+#
+#    void hashtable_conf_init(HashTableConf* conf)
+#
+#    cc_stat hashtable_new(HashTable** out)
+#
+#    cc_stat hashtable_new_conf(HashTableConf* conf, HashTable** out)
+#
+#    void hashtable_destroy(HashTable* table)
+#
+#    cc_stat hashtable_add(HashTable* table, void* key, void* val)
+#
+#    cc_stat hashtable_get(HashTable* table, void* key, void** out)
+#
+#    cc_stat hashtable_remove(HashTable* table, void* key, void** out)
+#
+#    void hashtable_remove_all(HashTable* table)
+#
+#    bint hashtable_contains_key(HashTable* table, void* key)
+#
+#    size_t hashtable_size(HashTable* table)
+#
+#    size_t hashtable_capacity(HashTable* table)
+#
+#    cc_stat hashtable_get_keys(HashTable* table, Array** out)
+#
+#    cc_stat hashtable_get_values(HashTable* table, Array** out)
+#
+#    size_t hashtable_hash_string(void* key, int len, uint32_t seed)
+#
+#    size_t hashtable_hash(void* key, int len, uint32_t seed)
+#
+#    size_t hashtable_hash_ptr(void* key, int len, uint32_t seed)
+#
+#    ctypedef void (*_hashtable_foreach_key_op_ft)(void*)
+#
+#    void hashtable_foreach_key(HashTable* table, _hashtable_foreach_key_op_ft op)
+#
+#    ctypedef void (*_hashtable_foreach_value_op_ft)(void*)
+#
+#    void hashtable_foreach_value(HashTable* table, _hashtable_foreach_value_op_ft op)
+#
+#    void hashtable_iter_init(HashTableIter* iter, HashTable* table)
+#
+#    cc_stat hashtable_iter_next(HashTableIter* iter, TableEntry** out)
+#
+#    cc_stat hashtable_iter_remove(HashTableIter* iter, void** out)
 
 
 cdef extern from "hashset.h":

+ 2 - 2
lakesuperior/model/graph/graph.pxd

@@ -20,8 +20,8 @@ ctypedef Buffer SPOBuffer[3]
 ctypedef Buffer *BufferPtr
 
 cdef:
-    bint term_cmp_fn(const void* key1, const void* key2)
-    bint triple_cmp_fn(const void* key1, const void* key2)
+    int term_cmp_fn(const void* key1, const void* key2)
+    int triple_cmp_fn(const void* key1, const void* key2)
     size_t trp_hash_fn(const void* key, int l, uint32_t seed)
     size_t hash_ptr_passthrough(const void* key, int l, uint32_t seed)
 

+ 34 - 36
lakesuperior/model/graph/graph.pyx

@@ -15,13 +15,6 @@ from cymem.cymem cimport Pool
 
 from lakesuperior.cy_include cimport cylmdb as lmdb
 from lakesuperior.cy_include cimport collections as cc
-from lakesuperior.cy_include.collections cimport (
-    CC_OK,
-    HashSet, HashSetConf, HashSetIter, TableEntry,
-    hashset_add, hashset_conf_init, hashset_contains, hashset_iter_init,
-    hashset_iter_next, hashset_new_conf, hashtable_hash_ptr, hashset_size,
-    get_table_index,
-)
 from lakesuperior.model.graph cimport term
 from lakesuperior.store.ldp_rs.lmdb_triplestore cimport (
         KLEN, DBL_KLEN, TRP_KLEN, TripleKey)
@@ -50,15 +43,18 @@ def use_data(fn):
     return _wrapper
 
 
-cdef bint term_cmp_fn(const void* key1, const void* key2):
+cdef int term_cmp_fn(const void* key1, const void* key2):
     """
     Compare function for two Buffer objects.
+
+    :rtype: int
+    :return: 0 if the byte streams are the same, another integer otherwise.
     """
     b1 = <Buffer *>key1
     b2 = <Buffer *>key2
 
     if b1.sz != b2.sz:
-        return False
+        return 1
 
     #print('Term A:')
     #print((<unsigned char *>b1.addr)[:b1.sz])
@@ -66,24 +62,28 @@ cdef bint term_cmp_fn(const void* key1, const void* key2):
     #print((<unsigned char *>b2.addr)[:b2.sz])
     cdef int cmp = memcmp(b1.addr, b2.addr, b1.sz)
     logger.info(f'term memcmp: {cmp}')
-    return cmp == 0
+    return cmp
 
 
-cdef bint triple_cmp_fn(const void* key1, const void* key2):
+cdef int triple_cmp_fn(const void* key1, const void* key2):
     """
     Compare function for two triples in a CAlg set.
 
     Here, pointers to terms are compared for s, p, o. The pointers should be
     guaranteed to point to unique values (i.e. no two pointers have the same
     term value within a graph).
+
+    :rtype: int
+    :return: 0 if the addresses of all terms are the same, 1 otherwise.
     """
     t1 = <BufferTriple *>key1
     t2 = <BufferTriple *>key2
 
-    return(
-            t1.s.addr == t2.s.addr and
-            t1.p.addr == t2.p.addr and
-            t1.o.addr == t2.o.addr)
+    return (
+        t1.s.addr != t2.s.addr or
+        t1.p.addr != t2.p.addr or
+        t1.o.addr != t2.o.addr
+    )
 
 
 cdef size_t trp_hash_fn(const void* key, int l, uint32_t seed):
@@ -208,25 +208,25 @@ cdef class SimpleGraph:
         :param lmdbStore store: the store to look data up.
         """
         cdef:
-            HashSetConf terms_conf
-            HashSetConf trp_conf
+            cc.HashSetConf terms_conf
+            cc.HashSetConf trp_conf
 
-        hashset_conf_init(&terms_conf)
+        cc.hashset_conf_init(&terms_conf)
         terms_conf.load_factor = 0.85
         terms_conf.hash = &hash_ptr_passthrough # spookyhash_64?
         terms_conf.hash_seed = term_hash_seed32
         terms_conf.key_compare = &term_cmp_fn
         terms_conf.key_length = sizeof(void*)
 
-        hashset_conf_init(&trp_conf)
+        cc.hashset_conf_init(&trp_conf)
         trp_conf.load_factor = 0.75
         trp_conf.hash = &hash_ptr_passthrough # spookyhash_64?
         trp_conf.hash_seed = term_hash_seed32
         trp_conf.key_compare = &triple_cmp_fn
         trp_conf.key_length = sizeof(void*)
 
-        hashset_new_conf(&terms_conf, &self._terms)
-        hashset_new_conf(&trp_conf, &self._triples)
+        cc.hashset_new_conf(&terms_conf, &self._terms)
+        cc.hashset_new_conf(&trp_conf, &self._triples)
 
         self.store = store or env.app_globals.rdf_store
         self._pool = Pool()
@@ -323,22 +323,20 @@ cdef class SimpleGraph:
         logger.info(f'ss sz: {ss.sz}')
         #logger.info('ss:')
         #logger.info((<unsigned char *>ss.addr)[:ss.sz])
-        logger.info('Insert ss @:')
-        print(<unsigned long>ss)
+        print('Insert ss: @0x{:02x}'.format(<unsigned long>ss))
         cc.hashset_add_or_get(self._terms, <void **>&ss)
-        logger.info('Now ss is @:')
-        print(<unsigned long>ss)
+        print('Now ss is: @0x{:02x}'.format(<unsigned long>ss))
         logger.info('Insert sp')
         cc.hashset_add_or_get(self._terms, <void **>&sp)
         logger.info('Insert so')
         cc.hashset_add_or_get(self._terms, <void **>&so)
         logger.info('inserted terms.')
-        cdef size_t terms_sz = hashset_size(self._terms)
+        cdef size_t terms_sz = cc.hashset_size(self._terms)
         logger.info('Terms set size: {terms_sz}')
 
-        #cdef HashSetIter ti
+        #cdef cc.HashSetIter ti
         #cdef Buffer *t
-        #hashset_iter_init(&ti, self._terms)
+        #cc.hashset_iter_init(&ti, self._terms)
         #while calg.set_iter_has_more(&ti):
         #    t = <Buffer *>calg.set_iter_next(&ti)
 
@@ -346,7 +344,7 @@ cdef class SimpleGraph:
         trp.p = sp
         trp.o = so
 
-        r = hashset_add(self._triples, trp)
+        r = cc.hashset_add(self._triples, trp)
         print('Insert triple result:')
         print(r)
 
@@ -364,14 +362,14 @@ cdef class SimpleGraph:
         """
         cdef:
             void *void_p
-            HashSetIter ti
+            cc.HashSetIter ti
             BufferTriple *trp
             term.Term s, p, o
 
         graph_set = set()
 
-        hashset_iter_init(&ti, self._triples)
-        while hashset_iter_next(&ti, &void_p) == CC_OK:
+        cc.hashset_iter_init(&ti, self._triples)
+        while cc.hashset_iter_next(&ti, &void_p) == cc.CC_OK:
             if void_p == NULL:
                 logger.warn('Triple is NULL!')
                 break
@@ -598,7 +596,7 @@ cdef class SimpleGraph:
             void *void_p
             BufferTriple trp
             BufferTriple *trp_p
-            HashSetIter ti
+            cc.HashSetIter ti
             Buffer t1
             Buffer t2
             lookup_fn_t fn
@@ -612,7 +610,7 @@ cdef class SimpleGraph:
             term.serialize_from_rdflib(p, trp.p)
             term.serialize_from_rdflib(o, trp.o)
 
-            if hashset_contains(self._triples, &trp):
+            if cc.hashset_contains(self._triples, &trp):
                 res.add((s, p, o))
 
             return res
@@ -641,8 +639,8 @@ cdef class SimpleGraph:
             fn = lookup_none_cmp_fn
 
         # Iterate over serialized triples.
-        hashset_iter_init(&ti, self._triples)
-        while hashset_iter_next(&ti, &void_p) == CC_OK:
+        cc.hashset_iter_init(&ti, self._triples)
+        while cc.hashset_iter_next(&ti, &void_p) == cc.CC_OK:
             if void_p == NULL:
                 trp_p = <BufferTriple *>void_p
                 res.add((

+ 4 - 0
setup.py

@@ -81,6 +81,8 @@ extensions = [
         'lakesuperior.model.structures.*',
         [
             path.join(spookyhash_src_dir, 'spookyhash.c'),
+            path.join(coll_src_dir, 'common.c'),
+            path.join(coll_src_dir, 'array.c'),
             path.join(coll_src_dir, 'hashset.c'),
             path.join(coll_src_dir, 'hashtable.c'),
             path.join('lakesuperior', 'model', 'structures', f'*.{ext}'),
@@ -94,6 +96,8 @@ extensions = [
         [
             path.join(tpl_src_dir, 'tpl.c'),
             path.join(spookyhash_src_dir, 'spookyhash.c'),
+            path.join(coll_src_dir, 'common.c'),
+            path.join(coll_src_dir, 'array.c'),
             path.join(coll_src_dir, 'hashset.c'),
             path.join(coll_src_dir, 'hashtable.c'),
             path.join('lakesuperior', 'model', 'graph', f'*.{ext}'),