[gecode-users] Views and serialization

Guido Tack tack at ps.uni-sb.de
Fri Dec 21 11:23:26 CET 2007


Gustavo Gutierrez wrote:
> lems with VarMaps. As you said there are two ways to fill a VarMap:  
> by using put and putArray methods and by iterating on actor  
> specifications. I tried the second but because of a design decision  
> in the past we cannot use it.  In our design we have a class  
> GenericSpace which inherits from Gecode::Space. This class has an  
> attribute that contains a DynamicArray with all variables declared  
> in a computation space. This array contains VarBase pointers  
> (VarImpBase in the trunk version). To fill the VarMap i am using the  
> following code:
>
> void GenericSpace::merge(GenericSpace *src) {
>   Reflection::VarMap vm;
>   for (int i = 0; i < src->vars.getSize(); i++) {
> 	std::stringstream s;
>  	s << "src-" << i;
> 	vm.put(src,src->vars.getVar(i),s.str().c_str());
>   }
>   printf("End merge operation\n");fflush(stdout);
> }
>
> getVar(i) returns a reference to the VarImpBase stored at position i  
> in the array.  When building the following error appears:

You cannot use put with a VarImBase*, you always have to go through  
the actual variable.  This is like update: You cannot call update on a  
VarImpBase*, only on a Var (or View).  The reason is that we do not  
want variables to have any virtual functions.  I guess you have some  
flag indicating which VarImpBase* has which actual variable type, so  
that you can copy (update) variables.  You should use the same  
information for merge.  Cast the VarImpBase* to the corresponding  
IntVarImp* (or SetVarImp* or whatever you have), then use that to get  
an IntVar (or SetVar...), and then call vm.put with that variable.

Cheers,
	Guido

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ps.uni-sb.de/pipermail/users/attachments/20071221/edc6e3f1/attachment.htm>


More information about the gecode-users mailing list