[gecode-users] Generating constraints

Max chaosangel at gmx.de
Wed Oct 29 11:25:27 CET 2008


I habe a little problem now with the operators.
Now i do not want to use the minimodel part und tried to convert my tree 
the long/boring way.
There is a little problem, all arithmetic functions seem to be 
implemented for variables only.
So  plus(this, v1,v2); is ok, but  plus(this, 5,v2); or plus(this, 
v1,5); is not.
Now Guido Tack somewhen wrote:

div(this, x0, x1, IntVar(this, 42, 42));
There's no specialized version for constant integers (yet).


But as i wanted to do something similiar, Christian Schulte answered:

Yes, it is even worse: it sacrifices propagation! 


So how can i post constants, not using minimodel. Is this the right way 
? (IntVar(this, 42,42))

Mfg
Max





Christian Schulte wrote:
> Yes, it is even worse: it sacrifices propagation! 
>
> If you need to get started look to the code that posts propagators based on
> LinExpr and LinRel values. That is actually nothing but a tree analyzer
> posting the minimal number of required propagators for linear relations.
>
> Cheers
> Christian
>
> --
> Christian Schulte, www.ict.kth.se/~cschulte/
>
>
> -----Original Message-----
> From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On Behalf
> Of Max
> Sent: Tuesday, October 28, 2008 1:56 PM
> To: Mikael Zayenz Lagerkvist
> Cc: users at gecode.org
> Subject: Re: [gecode-users] Generating constraints
>
> I have no problem in writing a tree analyzer but i looked for a uniform 
> representation of the variables, operators, relations and constants, so 
> i do not have to write an extra function for all of them.
> I want to write
>
> recursive_function_call rfc(X):
> IntVar temp;
> //switch for operator
> add(rfc(x1), ADD, rfc(x2), temp);
> return temp;
>
> I don't want to distinguish the leafs of the node at this step. So i 
> need a uniform return value.
> PS: Does it influence the performance if i use temporary variables for 
> my constants.
>
> IntVar x(this, 5,5);
>
>
>
>
> Mikael Zayenz Lagerkvist wrote:
>   
>> Hi,
>>
>> If you have a tree representing an expression, then you should write a
>> tree-analyzer (a tree-walker for example) that posts constraints that
>> correspond to the tree. This is how the linear expressions in Gecodes
>> MiniModel works. For more information on writing tree analyzers, see a
>> compiler text as it corresponds to instruction selection.
>>
>> There is no way to undo a tell - you have to copy the space.
>>
>> Cheers,
>> Mikael
>>
>>
>> On Tue, Oct 28, 2008 at 12:58 PM, Max <chaosangel at gmx.de> wrote:
>>   
>>     
>>> Hello all,
>>>
>>> i currently try to post constraints and need your help.
>>> I have my constraints not in a textual format, but in a self made tree
>>> structure of the form
>>>
>>>
>>>                              rel">="
>>>                             /         \
>>>                           op+      const=5
>>>                        /       \
>>>                var=x       const=7
>>>
>>>
>>> (i hope this is readable)
>>>
>>> Now i want to generate and post a gecode constraint of it.
>>> Is there an easy way to recursivly define a constraint, because it seems
>>> to me that there is no baseclass or something that can be used.
>>>
>>> I wanted to to something of the form
>>>
>>> GeCodeConstraint recursive_converter(MyConstraint)
>>> {
>>>       if "variable" return x;
>>>       if "constant" return 5;
>>>       if "op+" return recursive_converter(left_node) +
>>> recursive_converter(right_node);
>>>       if "rel>=" return recursive_converter(left_node) >=
>>> recursive_converter(right_node);
>>> }
>>>
>>>
>>> I i found for GeCodeConstraint was MiniModel::LinRel<>, is there
>>> something more uniform, because i want to use boolean and integer
>>> variables (reified constraints) and stuff.
>>> (the arithmetic functions seem very generic returning a variable, but
>>> then a lot of extra variables would have to be generated)
>>>
>>>
>>> Any ideas ?
>>>
>>> 2nd question:
>>>
>>> Is there a way to post the value of a variable not in form of a
>>> constraint, so "branch" on a boolean variable but being able to undo it
>>>       
> so
>   
>>> so
>>> b[0].set(0);
>>> //after some time
>>> b[0].set(1);
>>>
>>> without copying the whole space?
>>>
>>> Thank you a lot.
>>>
>>> Max
>>>
>>> _______________________________________________
>>> Gecode users mailing list
>>> users at gecode.org
>>> https://www.gecode.org/mailman/listinfo/gecode-users
>>>
>>>     
>>>       
>>
>>   
>>     
>
>
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users
>
>
> _______________________________________________
> Gecode users mailing list
> users at gecode.org
> https://www.gecode.org/mailman/listinfo/gecode-users
>
>   





More information about the gecode-users mailing list