fix for setvars. also slightly better errors in generated code.

This commit is contained in:
Denys Duchier 2012-03-22 16:10:59 +01:00
parent 48cb3d6543
commit 8b16734e1c
3 changed files with 948 additions and 945 deletions

File diff suppressed because it is too large Load Diff

View File

@ -296,8 +296,9 @@ class Cluster(object):
# discriminating tree based on argument types # discriminating tree based on argument types
class DTree(object): class DTree(object):
def __init__(self, i, preds): def __init__(self, i, preds, cluster):
self.index = i self.index = i
self.cluster = cluster
if len(preds) == 1 and len(preds[0].argtypes) == i: if len(preds) == 1 and len(preds[0].argtypes) == i:
self.is_leaf = True self.is_leaf = True
self.pred = preds[0] self.pred = preds[0]
@ -313,7 +314,7 @@ class DTree(object):
d = [] d = []
dispatch[t.type] = d dispatch[t.type] = d
d.append(p) d.append(p)
self.subtrees = tuple((t2,DTree(i+1,p2)) self.subtrees = tuple((t2,DTree(i+1,p2,cluster))
for t2,p2 in dispatch.iteritems()) for t2,p2 in dispatch.iteritems())
def _generate_body(self, user_vars, lib_vars): def _generate_body(self, user_vars, lib_vars):
@ -325,7 +326,9 @@ class DTree(object):
def _generate_dispatch(self, i, user_vars, lib_vars): def _generate_dispatch(self, i, user_vars, lib_vars):
if i == len(self.subtrees): if i == len(self.subtrees):
return PrologLiteral("throw(gecode_argument_error)") return PrologLiteral("throw(gecode_argument_error(%s/%d,arg=%d,%s))" \
% (self.cluster.name, self.cluster.arity,
self.index+1, user_vars[self.index]))
typ, dtree = self.subtrees[i] typ, dtree = self.subtrees[i]
idx = self.index idx = self.index
X = user_vars[idx] X = user_vars[idx]
@ -371,7 +374,7 @@ class YAPConstraintGeneratorBase(PredGenerator):
def _dtreefy(self): def _dtreefy(self):
dtrees = {} dtrees = {}
for key, cluster in self.clusters.iteritems(): for key, cluster in self.clusters.iteritems():
dtree = DTree(0, cluster.preds) dtree = DTree(0, cluster.preds, cluster)
dtrees[key] = dtree dtrees[key] = dtree
self.dtrees = dtrees self.dtrees = dtrees

View File

@ -284,7 +284,7 @@ new_setvar(SVar, Space, X1, X2, X3, X4, X5) :-
assert_integer(X4), assert_integer(X4),
assert_integer(X5), assert_integer(X5),
gecode_new_setvar_4(Idx,Space_,X1_,X2,X3,X4,X5)), gecode_new_setvar_4(Idx,Space_,X1_,X2,X3,X4,X5)),
SVar='SetVar'(Idx). SVar='SetVar'(Idx,-1).
%% 4 arguments %% 4 arguments
%% (GlbMin,GlbMax,LubMin,LubMax) 4 new_setvar_3 %% (GlbMin,GlbMax,LubMin,LubMax) 4 new_setvar_3
@ -313,7 +313,7 @@ new_setvar(SVar,Space,X1,X2,X3,X4) :-
; ;
assert_integer(X3), assert_integer(X3),
gecode_new_setvar_3(Idx,Space_,X1,X2,X3,X4))), gecode_new_setvar_3(Idx,Space_,X1,X2,X3,X4))),
SVar='SetVar'(Idx). SVar='SetVar'(Idx,-1).
%% 3 arguments %% 3 arguments
%% (Glb,LubMin,LubMax) 3 new_setvar_6 %% (Glb,LubMin,LubMax) 3 new_setvar_6
@ -336,7 +336,7 @@ new_setvar(SVar,Space,X1,X2,X3) :-
assert_integer(X2), assert_integer(X2),
assert_is_IntSet(X3,X3_), assert_is_IntSet(X3,X3_),
gecode_new_setvar_9(Idx,Space_,X1,X2,X3_)), gecode_new_setvar_9(Idx,Space_,X1,X2,X3_)),
SVar='SetVar'(Idx). SVar='SetVar'(Idx,-1).
%% 2 arguments %% 2 arguments
%% (Glb,Lub) 2 new_setvar_12 %% (Glb,Lub) 2 new_setvar_12
@ -346,7 +346,7 @@ new_setvar(SVar,Space,X1,X2) :-
assert_is_IntSet(X1,X1_), assert_is_IntSet(X1,X1_),
assert_is_IntSet(X2,X2_), assert_is_IntSet(X2,X2_),
gecode_new_setvar_12(Idx,Space_,X1_,X2_), gecode_new_setvar_12(Idx,Space_,X1_,X2_),
SVar='SetVar'(Idx). SVar='SetVar'(Idx,-1).
minimize(Space,IVar) :- minimize(Space,IVar) :-
assert_is_Space(Space,Space_), assert_is_Space(Space,Space_),