I've been learning and coding in Gecode for the past few weeks. I read and
re-read the modeling parts of MPG, and checked the online docs for syntax.I've
tried recasting my application several times and each time I get blocked by
syntax I'd expect to exist that doesn't.I hardly ever seem to have a
reification-suitable situation, and when I do, it's with a function that
doesn't support reification.I'm used to languages that let you put data in
arrays and then index into the arrays to solve problems. The Gecode examples
seem to have variable arrays, and constant integer indices into them, based on
a fixed problem structures, like Sudoku etc., but in my case the application
structure that's constant is the array, and the parts of it that I need to
index into are determined by the finite-domain variables.
Below is an example. I'm trying to use an IntVarArgs to index into a vector of
constants (in this case booleans).I can't figure out how to get Gecode to index
directly into the C++ vector, so I create a BoolVarArgs vector and copy the
constants into it...seems wasteful but ok.Then I do the indexing into a vector
of constants, with a single number (1-item domain), and it tells me the binary
result is [0..1] -- not especially enlightening news about a binary.So I must
be missing something obvious about how to index in Gecode. Any thoughts?Any
help or guidance would be appreciated.Thanks,-Milt
//notCD is a C++ boolean vector: knows nothing about Gecode bool
* notCD notCD = new bool [VecLength]; for (int i = 0;
i<VecLength; i++) { notCD[i] =
abs(some2D_integer_array[i][2])==1; } //Create
nCD: BoolVarArgs vector of notCD //only creating nCD because I can't get
Gecode to let me work directly with notCD BoolVarArgs nCD(VecLength);
for(int i=0; i<VecLength; i++){ //expected to write nCD[i]=notCD[i]; or
maybe nCD[i]=expr(*this,notCD[i]); or nCD[i]=expr(*this,element(notCD,i));
// but none of these forms compiled
if (notCD[i]){ nCD[i]=T; }
else { nCD[i]=F; } }
//I'm really just trying to index with an item of an IntVarArgs vector into a
C++ boolean vector IntVar da; for(int i=0; i<3; i++){
da = p[iterm+i]; //p is an IntVarArgs with all terms assigned, and
p[iTerm+0] is 192 ds[i] = expr(*this,element(nCD,da),ICL_DOM);
cout<<"da: "<<da<<", ds["<<i<<"]: "<<ds[i]<<", nCD[192]:
"<<nCD[192]<<" "; } //------------------- //so
unfortunately the output is: //da: 192, ds[0]: [0..1], nCD[192]: 1
// //why isn't the output: //da: 192, ds[0]: 1, nCD[192]: 1
//why is there indecision about ds[0]?...how do I get Gecode to understand
that ds[0] must be 1? _______________________________________________
Gecode users mailing list
[email protected]
https://www.gecode.org/mailman/listinfo/gecode-users