[gecode-users] Copy the domain from variable to another in diff. spaces

Guido Tack tack at ps.uni-sb.de
Mon Jun 16 17:49:15 CEST 2008


Mauricio Toro wrote:

> Hello all,
>
> I am doing an application with Gecode using several Spaces.
> I need to copy the domain from IntVars and SetVars from one Space to  
> another.
> But, once I copy the domain, the old space is deleted, therefore I  
> do not
> want some sort of "channel" constraint.
>
> For example:
>
> Space * space1;
> IntVar x(space1, 1,10);
> IntSet y;
> copythedomain(x,y);

What do you mean here, that the set y should reflect the current  
domain of x?

> //do some computation
> delete space1;
> Space * space2;
> IntVar z(space2,1,100);
> copythedomain(z,y);

And now, what should the result be?  Do you expect y to be overwritten  
with the domain of z, or intersected?  Or do you expect z to be  
constrained to the value of y? (I guess the latter)

> //do some computation
> delete space2;
>
> I tried with these constraints:
> dom(space1,x,y); dom(space2,z,y);
> But they did not work.

An IntSet is never modified by a call to dom, after all, it's not a  
constraint variable!  It works exactly the other way around: the  
variable domain is constrained to be a subset of the IntSet.

> What can I do?

The code is not tested, but this is approximately how it should work:

void copythedomain(Space* home, IntVar from, IntVar to) {
   IntVarRanges fromR(from);
   IntSet fromS(fromR);
   dom(home, to, fromS);
}

Note that home has to be the space that "to" lives in, and you don't  
need the space that "from" lives in.

Cheers,
	Guido





More information about the gecode-users mailing list