Hi, Sorry, but the flag thing will not work. You would have to rewrite the entire kernel and how the variable stubs are automatically generated to pull that off.
I think we discussed already that you have to move out the rewriting from the varimp to the views. As it comes to what is most effort I can't really say as I don't know what you want to do. If I just wanted to clarify whether a propagator uses a Boolean variable as a Boolean variable or an integer variable I'd do what I said. Cheers Christian -- Christian Schulte, www.ict.kth.se/~cschulte/ -----Original Message----- From: Vincent Barichard [mailto:[email protected]] Sent: Wednesday, December 02, 2009 10:38 PM To: Christian Schulte Cc: 'Guido Tack'; 'gecode list' Subject: Re: [gecode-users] Remapping of BoolVar propagation conditions Hi Christian, As the remapping is done in VarImp and not in View, I don't see how to solve my problem by defining another View. For example, if I want to make element constraint over booleans variables subscribe to PC_BOOL_SAME, I update the constructor of "Int<V0,V1,Idx,Val>" to make views x0 and x1 subscribe to PC_INT_DOM and PC_BOOL_SAME. If I use the new view, boolean variable will subscribe to PC_INT_DOM instead to PC_BOOL_VAL and integer variables will subscribe to PC_BOOL_SAME that is not meaningful for them. Maybe if subscribe functions could be called like that : x0.subscribe(home, *this, PC_INT_DOM | PC_BOOL_VAL); with PC_X_X propagation conditions seen as flag, the subscribe function of a view may be able to deal only with conditions meaningful for the view and ignore others. For example, in x0.subscribe(home, *this, PC_INT_DOM | PC_BOOL_VAL | PC_BOOL_SAME), PC_INT_DOM is only meaningful for IntView and PC_BOOL_VAL and PC_BOOL_SAME are only meaningful for BoolView. Other problems will occur like the maximum number of PC_X_X conditions managed in Gecode. Sorry my guess is probably irrelevant, but I don't see how to do without changing even a little the propagators. Furthermore, all current "rel()" functions which post propagators use usual BoolView.So I have to change all functions which post propagators to make them post propagators with the new view. I think that It is more painful than just updating the constructor of some propagators. Sorry to bother you with my questions. I think Gecode is a great solver and I like to add inside it my ideas in order to validate them.. Cheers, Vincent Le 2 déc. 09 à 19:06, Christian Schulte a écrit : > No, that wouldn't really work as I think it is best to not change > the code > of the propagators: that's the entire idea behind views! > > I would be happier if your first sentence would read as follows: ... > the > remapping is only meaningful for propagators which use boolean > variables as > (instead of and) integer variables. > > So, what's so bad about defining two views and instantiate the > propagators > accordingly? I even thought that this should have been done in > Gecode right > from the start. > > Christian > > -----Original Message----- > From: Vincent Barichard [mailto:[email protected]] > Sent: Wednesday, December 02, 2009 2:45 PM > To: Christian Schulte > Cc: 'Guido Tack'; 'gecode list' > Subject: Re: [gecode-users] Remapping of BoolVar propagation > conditions > > Hi, > > Ok, if I understood all answers, the remapping is only meaningful for > propagators which use boolean variables and integer variables. As they > can't distinguish boolean variables from integer ones, the propagation > conditions are remapped in the first case. > > If the propagators might distinguish boolean variables from integer > variables, and use the correct propagation condition in each case, the > remapped will be useless. > > If I modify the ViewVarImpTraits and the constructors of propagators > in the following way, will all existing propagators of Gecode work as > usual ? In that case I will be able to add a new PC_BOOL_SAME > condition without breaking anything. > > In gecode/int/view.hpp, I change all ViewVarImpTraits classes: > > Those which are over booleans, > > template<> > class ViewVarImpTraits<Int::IntView> { > public: > /// The variable type of an IntView > typedef Int::IntVarImp VarImp; > static const bool isBool = false; > }; > > Those which deal with booleans, > > template<> > class ViewVarImpTraits<Int::BoolView> { > public: > /// The variable type of a BoolView > typedef Int::BoolVarImp VarImp; > static const bool isBool = true; > }; > > > and in propagator constructors (for example in gecode/int/element/ > int.hpp) replace calls to : > > x0.subscribe(home,*this,PC_INT_DOM); > > by > > x0.subscribe(home,*this,(Gecode::ViewVarImpTraits<V0>::isBool)? > PC_BOOL_VAL:PC_INT_DOM); > > After, in the file gecode/int/var-imp/bool.hpp : > > forceinline void > BoolVarImp::subscribe(Space& home, Propagator& p, PropCond, > bool process) { > // Subscription can be used with integer propagation conditions, > // which must be remapped to the single Boolean propagation > condition. > BoolVarImpBase::subscribe(home,p,PC_BOOL_VAL,assigned(),process); > } > > can be replaced by > > forceinline void > BoolVarImp::subscribe(Space& home, Propagator& p, PropCond pc, > bool process) { > BoolVarImpBase::subscribe(home,p,pc,assigned(),process); > } > > (the same for the cancel member function) > > and everything should work as usual. > Am I right ? > > Cheers, > Vincent > > > Le 1 déc. 09 à 19:26, Christian Schulte a écrit : > >> Actually, what Guido and me tried to say is the following: >> conceptually, >> Gecode should have two Boolean views, say BoolView and >> BoolAsAnIntView. The >> former does not need rewriting and most propagators using Boolean >> views >> should use this one. The latter must use rewriting to map integer >> propagation conditions to the single supported Boolean propagation >> condition. >> >> Then there are integer propagators which we also want to use on >> Boolean >> views (these are few: the extensional ones, including element and >> sequence). >> These propagators should use BoolAsAnIntView including rewriting. >> All other >> - true Boolean propagators should use the real BoolView. >> >> So what you might want to do is to have these two different views, >> one with >> and one without rewriting! Everything will work just fine. >> >> Christian >> >> -----Original Message----- >> From: Vincent Barichard [mailto:[email protected]] >> Sent: Tuesday, December 01, 2009 6:22 PM >> To: Guido Tack >> Cc: Christian Schulte; 'gecode list' >> Subject: Re: [gecode-users] Remapping of BoolVar propagation >> conditions >> >> Hi Guido, >> >> That was my first thought. But I didn't understand why this remapping >> was there. Christian said in a previous mail that removing the >> mapping >> will break all propagators that are used for integer as well as for >> boolean variables! If I pass the pc unchanged, will it break >> something >> in Gecode ? I don't want to break something, I would like to add >> safely my piece of code. >> >> If removing it doesn't break anything, will this mapping be still >> there in the future versions ? >> >> Thank you again, I really appreciate the time you spent to answer my >> questions :) >> >> Cheers, >> Vincent >> >> Le 1 déc. 09 à 16:30, Guido Tack a écrit : >> >>> Hi Vincent, >>> >>> the rewriting is currently done in int/var-imp/bool.hpp. Just >>> remove the rewriting there and pass the pc unchanged, add rewriting >>> to all the normal Gecode BoolView classes, and then add your own >>> BoolView class that doesn't rewrite. >>> >>> Cheers, >>> Guido >>> >>> Vincent Barichard wrote: >>> >>>> Dear Christian, >>>> >>>> Thank you very much for your mail. I'm sorry, I don't understand >>>> your answer. Why having other BoolView classes will >>>> help me ? I added member functions in the BoolViews classes. I >>>> didn't change the existing ones, >>>> I only added member functions which notify the ME_BOOL_SAME event. >>>> >>>> In my own propagator (let's call it M) I call the recently added >>>> functions in the BoolViews. So the ME_BOOL_SAME >>>> event is sent. >>>> >>>> I also modified one propagator of Gecode (let's call it P') and >>>> make it subscribe to the PC_BOOL_SAME propagation condition (I only >>>> added "x1.subscribe(home, *this, PC_BOOL_SAME)" in constructor). >>>> In the "propagate" function of P' I added instructions which are >>>> only relevant if a ME_BOOL_SAME event has been sent before. >>>> >>>> So when M is woke up (because it subscribe to PC_BOOL_VAL >>>> propagation condition) it may call the new member functions in the >>>> BoolViews classes which sent the ME_BOOL_SAME event. I would like >>>> that propagators which subscribe to the PC_BOOL_SAME propagation >>>> condition and only these ones, be scheduled to wake up (for example >>>> P' will be scheduled if it shares a variable with M). As no >>>> assignment has been made by the M propagator, I don't want that >>>> other propagators wake up except if a ME_BOOL_VAL event has been >>>> sent from elsewhere. >>>> >>>> Unfortunately, as all propagation condition subscribings for >>>> Boleans variables are remapped to PC_BOOL_VAL, P' will not awake if >>>> a ME_BOOL_SAME event is sent. >>>> >>>> May have I another choice but to use the ME_BOOL_VAL event instead >>>> of ME_BOOL_SAME in my new member functions of the BoolView >>>> classes ? As a result, all propagators will be awaken even if they >>>> can't propagate removal, indeed no assignment has been made. >>>> >>>> Don't hesitate to ask me if I'm not clear enough. >>>> >>>> Cheers, >>>> Vincent >>>> >>>> Le 30 nov. 09 à 16:35, Christian Schulte a écrit : >>>> >>>>> Actually what you have to do is the following: you define two >>>>> classes for >>>>> Boolean views, one that rewrites its propagation conditions and >>>>> the other >>>>> one that does not. Then your propagators can use the views without >>>>> rewriting >>>>> while the other propagators can use the variables with rewriting. >>>>> >>>>> Christian >>>>> >>>>> -- >>>>> Christian Schulte, www.ict.kth.se/~cschulte/ >>>>> >>>>> >>>>> -----Original Message----- >>>>> From: [email protected] [mailto:[email protected]] >>>>> On Behalf >>>>> Of Vincent Barichard >>>>> Sent: Monday, November 30, 2009 9:33 AM >>>>> To: Christian Schulte >>>>> Cc: 'Guido Tack'; 'gecode list' >>>>> Subject: Re: [gecode-users] Remapping of BoolVar propagation >>>>> conditions >>>>> >>>>> Hi, >>>>> >>>>> Thank you both for your answers. As I don't want to break all >>>>> propagators >>>>> that are used for integer as well as boolean variables, I see no >>>>> choice but >>>>> to use PC_BOOL_VAL. >>>>> >>>>> Maybe one of you may see another way ? I make new functions on >>>>> Boolean >>>>> variables (and associated views) which don't set domain to 1 or 0 >>>>> (I copied >>>>> "ModEvent BoolVarImp::one_none(Space& home)" and removed the >>>>> unwanted >>>>> instructions). These functions notify new events (called >>>>> ME_BOOL_SAME in >>>>> bool.vis file (see attached file)). I mapped this new event to the >>>>> PC_BOOL_SAME propagation condition. >>>>> >>>>> Now I change an existing propagator (like the "Or" propagator), >>>>> and I want >>>>> it to be awaken when ME_BOOL_SAME is emitted. As the variable is >>>>> not yet >>>>> assigned, I didn't want to emit the ME_BOOL_VAL event because I >>>>> didn't want >>>>> to wake up propagators which only subscribed to the PC_BOOL_VAL >>>>> condition. >>>>> >>>>> So during propagation, I call my new functions on Boolean >>>>> variables, the >>>>> ME_BOOL_SAME event is sent and propagators which subscribe to the >>>>> PC_BOOL_SAME condition are wake up. Other propagators are not >>>>> awaken (except >>>>> if a ME_BOOL_VAL event has also been sent). Is it possible ? >>>>> Should I use ME_BOOL_VAL ? If I use ME_BOOL_VAL other propagators >>>>> will be >>>>> awaken for nothing. >>>>> >>>>> Thanks for your help. >>>>> >>>>> Cheers, >>>>> Vincent >>>> >>>> Vincent Barichard Université d'Angers (LERIA) >>>> Tel: 02 41 73 52 06 Département Informatique >>>> Fax: 02 41 73 50 73 H203 >>>> >> >> Vincent Barichard Université d'Angers (LERIA) >> Tel: 02 41 73 52 06 Département Informatique >> Fax: 02 41 73 50 73 H203 >> > > Vincent Barichard Université d'Angers (LERIA) > Tel: 02 41 73 52 06 Département Informatique > Fax: 02 41 73 50 73 H203 > Vincent Barichard Université d'Angers (LERIA) Tel: 02 41 73 52 06 Département Informatique Fax: 02 41 73 50 73 H203 _______________________________________________ Gecode users mailing list [email protected] https://www.gecode.org/mailman/listinfo/gecode-users
