I'm using Gecode as a library (of course :-) ) and don't know if the performance will suffer using such an interface. I dont want to go back to textual representation, as i would have to build it. Searching your online documentation i found nothing using "Zinc" or "minizinc" as search words. Only for FlatZinc i found an operation writing flatzinc output, but i would need the input. Where can i find it. Max
Christian Schulte wrote: > Yes, you have to flip (or just normalize your tree before). > > Remember, Gecode is a library with a minimal interface: only variants that > matter for efficiency are there. That explains that some variants are just > not there. Maybe we should change that... > > On a different take. Did you consider translating your representation to > MiniZinc and use the MiniZinc to FlatZinc converter and Gecode's flatzinc > interface? > > Christian > > -- > Christian Schulte, www.ict.kth.se/~cschulte/ > > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf > Of Max > Sent: Tuesday, October 28, 2008 2:36 PM > To: Christian Schulte > Cc: 'Mikael Zayenz Lagerkvist'; [EMAIL PROTECTED] > Subject: Re: [gecode-users] Generating constraints > > I have written the code for the analyzer now, but i just wanted to avoid > this code-bloating. > > 46 void GecodeSolver::SearchSpace::generateConstraint(CSPConstraint c, > unsigned int boolvar) > 47 { > 48 > 49 if (c.getType() == CSPConstraint::RELATION) > 50 { > 51 CSPConstraint* x; > 52 CSPConstraint* y; > 53 CSPConstraint::Relation r = c.getRelation(x,y); > 54 > 55 IntVar r1; > 56 IntVar r2; > 57 int i1; > 58 int i2; > 59 bool b1 = false; > 60 bool b2 = false; > 61 if (x->getType() == CSPConstraint::VARIABLE | x->getType() == > CSPConstraint::OPERATOR) > 62 { > 63 r1 = generateVariable(*x); > 64 b1 = true; > 65 } > 66 else > 67 if (x->getType() == CSPConstraint::INTEGER) > 68 { > 69 i1 = x->getInteger(); > 70 } > 71 > 72 if (y->getType() == CSPConstraint::VARIABLE | y->getType() == > CSPConstraint::OPERATOR) > 73 { > 74 r2 = generateVariable(*y); > 75 b1 = true; > 76 } > 77 else > 78 if (y->getType() == CSPConstraint::INTEGER) > 79 { > 80 i2 = y->getInteger(); > 81 } > 82 > 83 Gecode::IntRelType ir; > 84 switch(r) > 85 { > 86 case CSPConstraint::EQ: > 87 ir = IRT_EQ; > 88 break; > 89 case CSPConstraint::NE: > 90 ir = IRT_NQ; > 91 break; > 92 case CSPConstraint::LT: > 93 ir = IRT_LE; > 94 break; > 95 case CSPConstraint::LE: > 96 ir = IRT_LQ; > 97 break; > 98 case CSPConstraint::GE: > 99 ir = IRT_GQ; > 100 break; > 101 case CSPConstraint::GT: > 102 ir = IRT_GR; > 103 break; > 104 } > 105 > 106 if (b1) > 107 { > 108 if (b2) > 109 Gecode::rel(this, r1, ir, r2, b_[boolvar]); > 110 else > 111 Gecode::rel(this, r1, ir, i2, b_[boolvar]); > 112 } > 113 else > 114 { > 115 if (b2) > 116 Gecode::rel(this, i1, ir, r2, b_[boolvar]); > 117 else > 118 Gecode::rel(this, i1, ir, i2, b_[boolvar]); > 119 > 120 } > 121 } > > > This is not very nice, but maybe i have to change my tree structure for > better code. > (as you can see i wanted to avoid all the different kind of variables of > type IntVar and integer and all the if else constructs) > But, with this code written i do get some errors, because the rel method > is not defined for constants > as: > - both arguments > - first argument > > so i can not write > > rel(this, 5, IRT_GR, x, b); > > Why? > Do i have manually to flip the operands ? > > > 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: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf >> Of Max >> Sent: Tuesday, October 28, 2008 1:56 PM >> To: Mikael Zayenz Lagerkvist >> Cc: [EMAIL PROTECTED] >> 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 <[EMAIL PROTECTED]> 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 >>>> [EMAIL PROTECTED] >>>> https://www.gecode.org/mailman/listinfo/gecode-users >>>> >>>> >>>> >>>> >>> >>> >>> >> _______________________________________________ >> Gecode users mailing list >> [EMAIL PROTECTED] >> https://www.gecode.org/mailman/listinfo/gecode-users >> >> >> _______________________________________________ >> Gecode users mailing list >> [EMAIL PROTECTED] >> https://www.gecode.org/mailman/listinfo/gecode-users >> >> >> > > > _______________________________________________ > Gecode users mailing list > [EMAIL PROTECTED] > https://www.gecode.org/mailman/listinfo/gecode-users > > _______________________________________________ Gecode users mailing list [EMAIL PROTECTED] https://www.gecode.org/mailman/listinfo/gecode-users