[gecode-users] BoolExpr example

Malcolm Ryan malcolmr at cse.unsw.edu.au
Mon Nov 24 08:02:43 CET 2008


Yep. Thanks. I think I've worked it out. Some of my problems were due  
to the fact that I didn't have minimodel.hh included.

Malcolm



On 24/11/2008, at 5:58 PM, Mikael Zayenz Lagerkvist wrote:

> On Mon, Nov 24, 2008 at 2:27 AM, Malcolm Ryan <malcolmr at cse.unsw.edu.au 
> > wrote:
>> I'm sorry. I still don't completely understand how to us post. Say I
>> have a constraint like:
>>
>> ((X1 == Y1) && (X2 == Y2) && ... && (XN == YN)) --> L > 0
>>
>> for general 'N'.
>>
>> What I've got is:
>>
>>       BoolVar allEqual;
>>       BoolVarArgs eq = BoolVarArgs(nRobots);
>>       for (int r = 0; r < N; r++) {
>>          eq[r] = post(space, ~(X[r] == Y[r]));
>>       }
>>       rel(space, BOT_AND, noop, allEqual);
>>
>>       post(space, !allEqual || (L > 0));
>>
>> But I'm getting compilation errors on both the 'post' lines. What
>> should they be? Why?
>
> Assuming that
> a) space is a pointer to a Space
> b) L is an IntVar
> c) X and Y are IntVarArrays och IntVarArgs of length N
> d) N is the same as nRobots
> e) you mean eq instead of noop
> the above code compiles fine in gecode-2.2.0 for. There are two errors
> however. 1) since you didn't put tt(..) around the expression in the
> last post, which means that it just reifies the expression and returns
> the variable. It should be
>        post(space, tt(!allEqual || (L > 0)));
> 2) The allEqual-variable will not be initialized. You should write it
>        BoolVar allEqual(space, 0, 1);
>
> As a matter of style, in C++ you should write
>        BoolVarArgs eq(nRobots);
> for automatic variables.
>
>> Finding documentation on 'post' is tricky, since there are so many
>> different instances of this function across many files. I'm a bit
>> uncomfortable with the fact that sometimes it adds an actual
>> constraint and sometimes it just creates a reified BoolVar. How do I
>> know which case is which?
>
> While there are a number of versions of post, they are all quite
> similar. Versions of the form
>    post(Space* home, expression)
> will post propagators for the expression, and return the resulting
> value. Versions of the form
>    post(Space* home, relation)
> will post propagators for the relation, but will not return anything.
>
> Cheers,
> Mikael
>
> -- 
> Mikael Zayenz Lagerkvist, http://www.ict.kth.se/~zayenz/





More information about the gecode-users mailing list