diff --git a/analyze.py b/analyze.py index 4811155ef54d4ebaf18db544b0f8e2ca35b94d16_YW5hbHl6ZS5weQ==..5d6eb24cd8d2c59a676ac13bf96e6762fdf3cbe7_YW5hbHl6ZS5weQ== 100644 --- a/analyze.py +++ b/analyze.py @@ -112,6 +112,13 @@ _EQ = 2 _EQV = 3 +OPSYM={ + _AND:"and", + _OR:"or", + _EQ:"eq", + _EQV:"eqv" +} + class GecodeCSPProblem(object): """Builds an internal representation of the constraint that will be passed to the rql_solve module which implements @@ -139,6 +146,6 @@ self.values = {} # maps val name -> val index self.all_values = set() # this gets turned into a list later self.idx_domains = [] # maps var index -> list of val index - + self.ivalues = {} # only used for debugging def debug(self): @@ -143,3 +150,6 @@ def debug(self): + self.ivalues = {} + for val_name, val_num in self.values.items(): + self.ivalues[val_num] = val_name print "Domains:", self.domains @@ -145,5 +155,5 @@ print "Domains:", self.domains - print "Ops:", self.op + print "Ops:", self.pretty_print_ops(self.op) print "Variables:", self.variables print "Values:", self.values @@ -147,5 +157,20 @@ print "Variables:", self.variables print "Values:", self.values + + def pretty_print_ops(self, ops): + if ops[0] in (_AND, _OR): + res = [ OPSYM[ops[0]], '(' ] + for op in ops[1:]: + res.append(self.pretty_print_ops(op)) + res.append(',') + res.append( ')' ) + return "".join(res) + elif ops[0] == _EQ: + return "%s==%s" % (self.ivariables[ops[1]], self.ivalues[ops[2]]) + elif ops[0] == _EQV: + res = [ self.ivariables[k] for k in ops[1:] ] + return '~='.join(res) + def get_output(self): return "" @@ -150,5 +175,6 @@ def get_output(self): return "" + def solve(self): constraints = self.op @@ -240,6 +266,8 @@ else: CSPProblem = GecodeCSPProblem +#CSPProblem = ConstraintCSPProblem + class ETypeResolver(object): """Resolve variables types according to the schema. diff --git a/gecode_solver.cpp b/gecode_solver.cpp index 4811155ef54d4ebaf18db544b0f8e2ca35b94d16_Z2Vjb2RlX3NvbHZlci5jcHA=..5d6eb24cd8d2c59a676ac13bf96e6762fdf3cbe7_Z2Vjb2RlX3NvbHZlci5jcHA= 100644 --- a/gecode_solver.cpp +++ b/gecode_solver.cpp @@ -6,6 +6,13 @@ #include "gecode/int.hh" #include "gecode/search.hh" +#if 1 +#define debug(fmt,...) +#else +#define debug(fmt,...) printf(fmt, ##__VA_ARGS__) +#endif + + #define PM_VERSION(a,b,c) ((a<<16)+(b<<8)+(c)) // There is no easy way to test for gecode version here // so the build system must pass GE_VERSION accordingly @@ -95,7 +102,7 @@ RqlContext(long nvars, PyObject* domains, long nvalues, PyObject* constraints, PyObject* sols): solutions(-1), // return every solutions - time(1000), // time limit in case the problem is too big + time(-1), // time limit in case the problem is too big fails(-1), // ?? used by GecodeStop ... nvars(nvars), // Number of variables nvalues(nvalues), // Number of values @@ -263,6 +270,11 @@ variable = get_uint( desc, 1 ); value = get_uint( desc, 2 ); + if (variable==1) { + debug("RQL:%ld == %ld ***\n", variable, value); + } else { + debug("RQL:%ld == %ld\n", variable, value); + } rel(SELF, variables[variable], IRT_EQ, value, expr_value); } @@ -280,5 +292,6 @@ int len = PyList_Size(desc); int var0 = get_uint( desc, 1 ); BoolVarArray terms(SELF, len-2,0,1); + debug("RQL:EQV(%d",var0); for (int i=1;i<len-1;++i) { int var1 = get_uint(desc, i+1); @@ -283,4 +296,5 @@ for (int i=1;i<len-1;++i) { int var1 = get_uint(desc, i+1); + debug(",%d",var1); rel(SELF, variables[var0], IRT_EQ, variables[var1], terms[i-1] ); } @@ -285,5 +299,6 @@ rel(SELF, variables[var0], IRT_EQ, variables[var1], terms[i-1] ); } + debug(")\n"); rel(SELF, BOT_AND, terms, expr_value); } @@ -292,7 +307,8 @@ int len = PyList_Size(desc); BoolVarArray terms(SELF, len-1,0,1); + debug("RQL:AND(\n"); for(int i=0;i<len-1;++i) { PyObject* expr = PyList_GetItem(desc, i+1); add_constraints( expr, terms[i] ); } @@ -295,7 +311,8 @@ for(int i=0;i<len-1;++i) { PyObject* expr = PyList_GetItem(desc, i+1); add_constraints( expr, terms[i] ); } + debug("RQL:)\n"); rel(SELF, BOT_AND, terms, var); } @@ -304,7 +321,8 @@ int len = PyList_Size(desc); BoolVarArray terms(SELF, len-1,0,1); + debug("RQL:OR(\n"); for(int i=0;i<len-1;++i) { PyObject* expr = PyList_GetItem(desc, i+1); add_constraints( expr, terms[i] ); } @@ -307,7 +325,8 @@ for(int i=0;i<len-1;++i) { PyObject* expr = PyList_GetItem(desc, i+1); add_constraints( expr, terms[i] ); } + debug("RQL:)\n"); rel(SELF, BOT_OR, terms, var); } @@ -340,7 +359,7 @@ delete ex; t0 = t0 + t.stop(); - } while (--i != 0 && t0 < pb.time); + } while (--i != 0 && (pb.time<0 || t0 < pb.time)); Search::Statistics stat = e.statistics(); if (pb.verbosity) { cout << endl;