[gecode-users] kernel issues

Filip Konvička filip.konvicka at logis.cz
Mon Apr 21 12:11:03 CEST 2008


Hi Christian,

> sorry for the long delay, but I was away from my keyboard. Yes, you are
> right! I just added your fix to the trunk. For the integer variables it did
> not show, as med_fst == 0 for them.
> 
> The script that generates the variable stubs is misc/genvariables.perl (line
> 608).
> 
> Thanks for the fix!

You're welcome. By the way, after we removed the "DOM" modification 
event and propagation condition the generated code is OK even without 
the fix, but this is just because the resulting code is simpler.

FloatVar seems to work for us, we'll now spend some time polishing the 
source code and testing before we publish it.

Cheers,
Filip

> 
> -----Original Message-----
> From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On Behalf
> Of Filip Konvicka
> Sent: Monday, April 14, 2008 2:28 PM
> To: users at gecode.org
> Cc: lmoric at logis.cz
> Subject: [gecode-users] kernel issues
> 
> Hi,
> 
> so Lubos started working on the FloatVar implementation and he's 
> discovered something that looks like a bug in Gecode. Initially, we just 
> copied "integer.vis" to "float.vis" and renamed the identifiers so we 
> got "_FLOAT_" instead of "_INT_" everywhere. (Later on, we'll probably 
> at least remove the "DOM" modification event and propagation condition.)
> 
> So in short:
> 
> [General]
> Name:		Float
> Ifdef:		GECODE_HAS_FLOAT_VARS
> Namespace:	Gecode::Float
> 
> and the rest goes exactly the same as with IntVar.
> 
> Then we tried posting a propagator on a FloatVar, but unexpectedly 
> nothing happened. Lubos tracked this down to the following code fragment 
>   in kernel/var-type.icc:
> 
> case ME_FLOAT_BND:
>       {
>         static const Gecode::ModEvent me_c = (
>           ((ME_FLOAT_NONE ^ ME_FLOAT_BND ) <<  0) |
>           ((ME_FLOAT_VAL  ^ ME_FLOAT_VAL ) <<  4) |
>           ((ME_FLOAT_BND  ^ ME_FLOAT_BND ) <<  8) |
>           ((ME_FLOAT_DOM  ^ ME_FLOAT_BND ) << 12)
>         );
>         Gecode::ModEvent me_o = (med & med_mask) >> med_fst;
>         Gecode::ModEvent me_n = (me_c >> (me_o << 2)) & med_mask;
>         if (me_n == 0)
>           return false;
>         med ^= me_n << med_fst;
>         break;
>       }
> 
> This is similar to what is generated for IntVars (ME_INT_BND), but it 
> seems that the condition (me_n == 0) always evaluates to true for 
> FloatVars, and so nothing ever happens.
> 
> Lubos fixed this by changing the appropriate line to
> 
>   Gecode::ModEvent me_n = (me_c >> (me_o << 2)) & (med_mask >> med_fst);
> 
> This seems logical to me. Do you know what script to fix in order to get 
> it generated this way?
> 
> Thanks,
> Filip
> 
> 
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users





More information about the gecode-users mailing list