[gecode-users] iterating/filtering IntView
Mikael Zayenz Lagerkvist
zayenz at gmail.com
Mon May 14 21:20:18 CEST 2007
On 5/14/07, Kilian Sprotte <ml13 at onlinehome.de> wrote:
> At some point, I know that x0 is assigned. What I would like to do is
> to filter the domain of x1 using a given predicate function.
>
> if (x0.assigned()) {
> IntVarValues r1(x1);
> while (r1()) {
> if (!my_predicate(x0.val(), r1.val()))
> GECODE_ME_CHECK(x1.nq(home, r1.val()))
> ++r1;
> }
> return ES_SUBSUMED;
>
> It does not seem to be a good idea however to alter the view x1 while
> iterating over it...(is it true that this should not be done/will
> cause problems?)
As you've discovered, one should not modify a view while iterating over it.
> Hhm, could anyone give me a hint, what I could use in order to do
> this safely?
A solution that works efficiently in many cases is to store the values
to remove on a stack, and then remove them after iteration over the
view is finished. A cheap simple stack can be obtained using the
GECODE_AUTOARRAY macro and a counter of the number of values on the
stack.
This pattern is quite common, it occurs for example in distinct and regular.
Hope this helps,
Mikael
--
Mikael Zayenz Lagerkvist, http://www.ict.kth.se/~zayenz/
More information about the gecode-users
mailing list