[gecode-users] Problem on cloning spaces

Guido Tack tack at gecode.org
Fri Jan 29 21:52:15 CET 2010


Hi,

the problem is that you're using copy to create the clone, not clone.  Simply try this:
Model* m2 = dynamic_cast<Model*>(m->clone(true));  

Cheers,
	Guido

Ignacio Castiñeiras Pérez wrote:

> Hi,
> I have tried to use clones to reason with models. 
> I got some execution errors which I do not understand. May I show it to you with a little example?
> 
> I create a class Model with an IntVarArray "vars" as its own attribute. 
> The default constructor initializes "vars" with two IntVar, vars[0] = 0, and vars[1] = [0..1].
> The function addVar() adds a new IntVar to "vars". The function postEQ() constraints two IntVars of "vars" to be equal.
> 
> In the main program we create a first model "m" with the default constructor. 
> We add two new vars "vars[2]" and "vars[3]", and constraint vars[2] = vars[0] and vars[3] = vars[1]. 
> We request propagation and show the solution.
> 
> Then we create "m2" by using "m" and the copy constructor.
> We add two new vars "vars[4]" and "vars[5]" and constraints vars[4] = vars[0] and vars[5] = vars[1]. 
> While it succeeds posting vars[4] = vars[0] it fails trying to post vars[5] = vars[1]. 
> 
> If (always in "m2") we try with vars[4] = vars[2] and vars[5] = vars[3] it fails too. 
> It succeeds posting vars[4] = vars[2], but it fails trying to post vars[5] = vars[3]. 
> If we try with vars[4]= vars[5] it also fails.
> 
> It seems that the error appears when we try to constraint a non-asigned "new variable" (created in the current Space "m2")
> with a non-asigned "old variable" (created in the Space "m", from which "m2" has been cloned from). 
> An error also appears when we try to constraint two non-asigned variables in the clonated space. In "m2", both vars[4] = vars[5] and vars[2] = vars[3] fails, while in "m" vars[2] = vars[3] succeeds.
> 
> Do you know what is the problem? Am I doing something wrong with the copy constructor?
> 
> Gecode Version: Gecode 3.2.2
> Compiler tools: Microsoft Visual Studio 2008
> OS: Microsoft Windows XP SP3
> 
> Thank you very much in advance,
> Nacho
> 
> /* EXAMPLE */
> 
> 
> #include <gecode/int.hh>
> #include <gecode/search.hh>
> 
> using namespace Gecode;
> 
> class Model : public Space {
> protected:
>   IntVarArray vars;
> public:
>   Model(void) : Space(), vars(*this, 2, 0, 1){
>       rel(*this, vars[0], IRT_EQ, 0);
>   };
>   
>   Model(bool share, Model& s) : Space(share, s) {
>     vars.update(*this, share, s.vars);
>   }
> 
>   virtual Space* copy(bool share) {
>     return new Model(share,*this);
>   }
> 
>   void print(void) const {
>     std::cout << vars << std::endl;
>   }
> 
>   void newVar(){
>      vars.add(*this, IntVar(*this, 0, 1));
>   }
> 
>   void postEQ(int i, int j){
>     rel(*this, vars[i], IRT_EQ, vars[j]);
>   }
> 
> };
> 
> 
> int main(int argc, char* argv[]) {
>   Model* m = new Model;
>   m->newVar();
>   m->newVar();
>   m->postEQ(2,0);
>   m->postEQ(3,1);
>   m->status();
>   m->print();
> 
>  //------------------//
> 
>   Model* m2 = dynamic_cast<Model*>(m->copy(true));  
>   m2->newVar();
>   m2->newVar();
>   m2->postEQ(4,0);
>   m2->postEQ(5,1);
>   m2->status();
>   m2->print();
> 
>   return 0;
> }
> 
> 
> 
> 
> <code.cpp>_______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users




More information about the users mailing list