DFA and TupleSet
This commit is contained in:
@@ -171,7 +171,13 @@ extern "C"
|
||||
static inline TupleSet&
|
||||
gecode_TupleSet_from_term(YAP_Term t)
|
||||
{
|
||||
return *(TupleSet *) YAP_IntOfTerm(t);
|
||||
return *(TupleSet *) YAP_OpaqueObjectFromTerm(t);
|
||||
}
|
||||
|
||||
static inline DFA&
|
||||
gecode_DFA_from_term(YAP_Term t)
|
||||
{
|
||||
return *(DFA *) YAP_OpaqueObjectFromTerm(t);
|
||||
}
|
||||
|
||||
static inline FloatNum
|
||||
@@ -1580,7 +1586,6 @@ extern "C"
|
||||
|
||||
static int gecode_tupleset_fail_handler(void* p)
|
||||
{
|
||||
//delete *(GenericSpace**)p;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -1593,19 +1598,11 @@ extern "C"
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static YAP_Term gecode_term_from_tupleset(TupleSet& r)
|
||||
{
|
||||
YAP_Term term =
|
||||
YAP_NewOpaqueObject(gecode_tupleset_tag, sizeof(TupleSet *));
|
||||
TupleSet *ptr =
|
||||
(TupleSet*) YAP_OpaqueObjectFromTerm(term);
|
||||
*ptr = r;
|
||||
return term;
|
||||
}
|
||||
|
||||
static int gecode_new_tupleset(void)
|
||||
{
|
||||
TupleSet ts;
|
||||
YAP_Term term =
|
||||
YAP_NewOpaqueObject(gecode_tupleset_tag, sizeof(TupleSet));
|
||||
TupleSet *ts = new (YAP_OpaqueObjectFromTerm(term)) TupleSet;
|
||||
YAP_Term t = YAP_ARG1;
|
||||
while (YAP_IsPairTerm( t ) ) {
|
||||
YAP_Term l = YAP_HeadOfTerm(t);
|
||||
@@ -1614,14 +1611,79 @@ extern "C"
|
||||
IntArgs is(n);
|
||||
while (YAP_IsPairTerm( l ) ) {
|
||||
YAP_Term ll = YAP_HeadOfTerm(l);
|
||||
if (!YAP_IsIntTerm(ll)) {
|
||||
cerr << "non-integer on tuple set" << endl; exit(1);
|
||||
}
|
||||
is[i++] = YAP_IntOfTerm(ll);
|
||||
l = YAP_TailOfTerm(l);
|
||||
}
|
||||
ts.add(is);
|
||||
ts->add(is);
|
||||
if (l != YAP_TermNil()) {
|
||||
cerr << "non-list on tuple set" << endl; exit(1);
|
||||
}
|
||||
t = YAP_TailOfTerm(t);
|
||||
}
|
||||
ts.finalize();
|
||||
return YAP_Unify(YAP_ARG2, gecode_term_from_tupleset( ts ));
|
||||
if (t != YAP_TermNil()) {
|
||||
cerr << "non-list on tuple set" << endl; exit(1);
|
||||
}
|
||||
ts->finalize();
|
||||
return YAP_Unify(YAP_ARG2, term);
|
||||
}
|
||||
|
||||
static YAP_opaque_tag_t gecode_dfa_tag;
|
||||
static YAP_opaque_handler_t gecode_dfa_handler;
|
||||
|
||||
static int gecode_dfa_fail_handler(void* p)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int
|
||||
gecode_dfa_write_handler
|
||||
(void *stream_, YAP_opaque_tag_t type, void *p, int flags)
|
||||
{
|
||||
IOSTREAM* stream = (IOSTREAM*) stream_;
|
||||
Sfprintf(stream,"<dfa %p>", p);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static int gecode_new_dfa(void)
|
||||
{
|
||||
YAP_Term term =
|
||||
YAP_NewOpaqueObject(gecode_dfa_tag, sizeof(DFA));
|
||||
// DFA ts = new (YAP_OpaqueObjectFromTerm(term)) DFA;
|
||||
YAP_Term t2 = YAP_ARG2;
|
||||
int s0 = YAP_IntOfTerm(t2);
|
||||
YAP_Term t3 = YAP_ARG3;
|
||||
int n = gecode_list_length(t3), i=0;
|
||||
DFA::Transition t[n];
|
||||
while (YAP_IsPairTerm( t3 ) ) {
|
||||
YAP_Term tt = YAP_HeadOfTerm(t3);
|
||||
int is, sy, os;
|
||||
is = YAP_IntOfTerm(YAP_ArgOfTerm(1,tt));
|
||||
sy = YAP_IntOfTerm(YAP_ArgOfTerm(2,tt));
|
||||
os = YAP_IntOfTerm(YAP_ArgOfTerm(3,tt));
|
||||
t[i++] = DFA::Transition(is, sy, os);
|
||||
t3 = YAP_TailOfTerm(t3);
|
||||
}
|
||||
if (t3 != YAP_TermNil()) {
|
||||
cerr << "non-list on DFA" << endl; exit(1);
|
||||
}
|
||||
YAP_Term t4 = YAP_ARG4;
|
||||
n = gecode_list_length(t4)+1;
|
||||
i=0;
|
||||
int s[n];
|
||||
s[n-1] = -1;
|
||||
while (YAP_IsPairTerm( t4 ) ) {
|
||||
YAP_Term tt = YAP_HeadOfTerm(t4);
|
||||
s[i++] = YAP_IntOfTerm(tt);
|
||||
t4 = YAP_TailOfTerm(t4);
|
||||
}
|
||||
if (t4 != YAP_TermNil()) {
|
||||
cerr << "non-list on DFA" << endl; exit(1);
|
||||
}
|
||||
new (YAP_OpaqueObjectFromTerm(term)) DFA(s0, t, s);
|
||||
return YAP_Unify(YAP_ARG1, term);
|
||||
}
|
||||
|
||||
void gecode_init(void)
|
||||
@@ -1813,11 +1875,16 @@ extern "C"
|
||||
gecode_reify_handler.write_handler = gecode_reify_write_handler;
|
||||
gecode_reify_tag = YAP_NewOpaqueType(&gecode_reify_handler);
|
||||
YAP_UserCPredicate("gecode_new_reify", gecode_new_reify, 4);
|
||||
// TupleSet reifications
|
||||
// Opaque TupleSet
|
||||
gecode_tupleset_handler.fail_handler = gecode_tupleset_fail_handler;
|
||||
gecode_tupleset_handler.write_handler = gecode_tupleset_write_handler;
|
||||
gecode_tupleset_tag = YAP_NewOpaqueType(&gecode_tupleset_handler);
|
||||
YAP_UserCPredicate("gecode_new_tupleset", gecode_new_tupleset, 4);
|
||||
YAP_UserCPredicate("gecode_new_tupleset", gecode_new_tupleset, 2);
|
||||
// Opaque DFA
|
||||
gecode_dfa_handler.fail_handler = gecode_dfa_fail_handler;
|
||||
gecode_dfa_handler.write_handler = gecode_dfa_write_handler;
|
||||
gecode_dfa_tag = YAP_NewOpaqueType(&gecode_dfa_handler);
|
||||
YAP_UserCPredicate("gecode_new_dfa", gecode_new_dfa, 4);
|
||||
#ifdef DISJUNCTOR
|
||||
// opaque disjunctors and clauses
|
||||
gecode_disjunctor_handler.write_handler = gecode_disjunctor_write_handler;
|
||||
@@ -1908,8 +1975,5 @@ extern "C"
|
||||
YAP_UserCPredicate("gecode_floatvar_max", gecode_floatvar_max, 3);
|
||||
YAP_UserCPredicate("gecode_floatvar_med", gecode_floatvar_med, 3);
|
||||
YAP_UserCPredicate("gecode_floatvar_size", gecode_floatvar_size, 3);
|
||||
// TupleSets
|
||||
YAP_UserCPredicate("gecode_new_tupleset", gecode_new_tupleset, 2);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user