UDI: more work

This commit is contained in:
David Vaz 2012-12-20 17:13:30 +00:00
parent a655c0bb51
commit 4efa594f0a
3 changed files with 82 additions and 52 deletions

10
C/udi.c
View File

@ -68,7 +68,7 @@ int Yap_udi_args_init(Term spec, int arity, UdiInfo blk);
* New user indexed predicate:
* the first argument is the term.
*/
static Int
static int
p_new_udi( USES_REGS1 )
{
Term spec = Deref(ARG1);
@ -171,7 +171,7 @@ Yap_udi_args_init(Term spec, int arity, UdiInfo blk)
//fprintf(stderr,"cb: %p %p-%s\n", *p, (*p)->decl, YAP_AtomName((*p)->decl));
if (idxtype == (*p)->decl){
blk->args[i-1].control = *p;
blk->args[i-1].idxstr = (*p)->init(spec, NULL, arity);
blk->args[i-1].idxstr = (*p)->init(spec, i, arity);
}
}
if (blk->args[i-1].control == NULL){ /* not "-" and not found*/
@ -203,8 +203,8 @@ Yap_new_udi_clause(PredEntry *p, yamop *cl, Term t)
for (i = 0; i < UDI_MI ; i++) {
if (info->args[i].control != NULL){
// fprintf(stderr,"call insert\n");
info->args[i].control->insert(t,info->args[i].idxstr, (void *)cl);
//fprintf(stderr,"call insert\n");
info->args[i].idxstr = info->args[i].control->insert(info->args[i].idxstr, t, i + 1, (void *)cl);
// info->cb = info->functions->insert(t, info->cb, (void *)cl);
}
}
@ -248,7 +248,7 @@ Yap_udi_search(PredEntry *p)
for (i = 0; i < UDI_MI ; i++) {
if (info->args[i].control != NULL){
// fprintf(stderr,"call search %d %p\n", i, (void *)c);
r = info->args[i].control->search(info->args[i].idxstr, callback,c);
r = info->args[i].control->search(info->args[i].idxstr, i + 1, callback, c);
/*info->functions->search(info->cb);*/
}
}

View File

@ -1,55 +1,85 @@
/*chamada a cada index/2
controi estrutura de control, para definir a indexação, contem a
rtree p.e.
retorna a estrutura de control
*/
typedef void *
(* Yap_UdiInit)(
YAP_Term spec, /* mode spec */
void *pred, /* pass predicate information */
int arity);
/*
* This file is part of the YAP Prolog
*
* User Defined Indexing was developed by:
* David Vaz <davidvaz@dcc.fc.up.pt>
* Vitor Santos Costa <vsc@dcc.fc.up.pt>
*
* UDI Indexing Interface:
*
* Each new indexing mechanism should register it self by filling up a
* UdiControlBlock and calling Yap_UdiRegister(UdiControlBlock).
*
* UdiControlBlock has the main declaration that triggers the
* indexing structure as well as the pointers to the needed functions
* called at the appropriate times.
*
* For now each indexing structure only works with a single argument
* even when multiple arguments are indexed with the same struture.
*
* TODO: think of alternamive ways of support both cases, e.g. a rtree
* does not benefit from multiple rtree indexing, but a hash table do
*/
/*chamada a cada assert*/
typedef void *
(* Yap_UdiInsert)(YAP_Term t, /* termo asserted */
void *control, /* estrutura de control*/
void *clausule); /* valor a guardar na arvore, para retornar na pesquisa */
/* This is called upon udi mode spec call, and the purpose is to allow
* the indexing struture to initialize itself.
* Should return the need opaque struture to be used in future calls
*
* arg is used to track the specific call, on multiple indexing with the
* same struture
*/
typedef void * (* Yap_UdiInit)
(YAP_Term spec,
int arg, /* argument regarding this call */
int arity);
/* Callback for each value found in a search */
typedef int /* with a FALSE return should abort the search */
(* Yap_UdiCallback) (void *key, /*index key*/
void *clausule, /*clause*/
void *arg); /* auxiliary to callback */
/* Upon each assert the struture insert method is called to perform
* its work
*/
typedef void * (* Yap_UdiInsert)
(void *control, /* indexing structure opaque handle */
YAP_Term term, /* asserted argument */
int arg, /* argument regarding this call */
void *data); /* value to return on search */
/* chamada cada vez que um predicado indexado aparece no código
Returns:
NULL quando não indexação usavel no predicado (fallback to
yap indexing)
FALSE
TRY_RETRY_TRUST quando resultados positivos
*/
typedef void *
(* Yap_UdiSearch)(void * control,
Yap_UdiCallback f, /* callback on each found value*/
void *arg);
/* Callback for each value found in a search
* if it returns FALSE the search should be immediately aborted
*/
typedef int (* Yap_UdiCallback)
(void *key, /* index key */
void *data, /* data */
void *arg); /* auxiliary data to callback */
/* chamada cada vez que um predicado indexado aparece no código
Returns:
NULL quando não indexação usavel no predicado (fallback to
yap indexing)
FALSE
TRY_RETRY_TRUST quando resultados positivos
*/
typedef int
(* Yap_UdiDestroy)(void * control);
/* Called upon search
*
* If there is any search to do with this struture should return >= 0
* corresponding to the values found
*
* returns -1 if there is nothing to search with this indexing structure
* e.g. a Variable as argument
*/
typedef int (* Yap_UdiSearch)
(void * control, /* indexing structure opaque handle */
int arg, /* argument regarding this call */
Yap_UdiCallback f, /* callback on each found value */
void *args); /* auxiliary data to callback */
/* Called upond abolish of the term
* to allow for a clean destroy of the indexing structures
*/
typedef int (* Yap_UdiDestroy)
(void * control);
/*
* Main structure used in UDI
*/
typedef struct udi_control_block {
YAP_Atom decl; //atom that triggers this indexing structure
Yap_UdiInit init;
Yap_UdiInsert insert;
Yap_UdiSearch search;
YAP_Atom decl; //atom that triggers this indexing structure
Yap_UdiInit init;
Yap_UdiInsert insert;
Yap_UdiSearch search;
Yap_UdiDestroy destroy;
} *UdiControlBlock;
} * UdiControlBlock;
/* used to register the new indexing structure */
/* Register a new indexing structure */
void Yap_UdiRegister(UdiControlBlock);

@ -1 +1 @@
Subproject commit 13e78d741400614b2b7da1fecf83a7c6ce1ecb8d
Subproject commit 5ee82f11ac12dbd22ec8fca040bc6589cc9f7683