Re: [eclipse-clp-users] More Info Dynamically Imposing Constraints

From: Igor Kondrasovas <ikondrasovas_at_gmail.com>
Date: Wed, 4 Nov 2009 22:41:53 -0200
Hello Joachim,

 

Sorry for the delayed answer. Don't know why I was not receiving the e-mails
from the group (probably I did some silly change on the user preferences)..

 

I could successfully use and understand (I think) those different options in
imposing the constraints. I decided using: 

 

sum(M[1,1..3]) #= 1.

 

It is clean and functional.

 

I decided also to go further and make the following test in a different
constraint (now performing a multiplication after addition), but its seems
to be something wrong in the last line when LHS is finally constrained. I'm
getting a "number expected in set_up_ic_con." at run-time (no messages at
compilation).

 

 

(for(K,1,NPieces),fromto(0,LHS1,LHS2,LHS), param(M, PieceLengths) do

                  LHS2 = LHS1 + M[K,1] * PieceLengths[K]

),

#Something not good here....

LHS #=< BarsLengths[1],

 

I had a look in the examples you mentioned but couldn't find anything
similar..

 

Any clues?

 

Thanks in Advance,

 

Igor.

 

 

Old Message body:

 

Igor Kondrasovas wrote:
> I have a preliminary version of my program running, but one important
> thing missing is that I need to dynamically impose the constraints,
> based on the length of the input arrays. Let me show an example with
> what I mean:
> 
> linear(PieceLengths, BarsLengths, M) :- 
> dim(PieceLengths, [NPieces]),
> dim(BarsLengths, [NBars]),
> dim(M,[NPieces,NBars]),
> M #::0..1,
> 
> % Constraints that the sum of every column value in each row must be
equals 1
> M[1,1] + M[1,2] + M[1,3] #= 1,
> M[2,1] + M[2,2] + M[2,3] #= 1,
> M[3,1] + M[3,2] + M[3,3] #= 1,
> M[4,1] + M[4,2] + M[4,3] #= 1,
> M[5,1] + M[5,2] + M[5,3] #= 1,
> M[6,1] + M[6,2] + M[6,3] #= 1,
> M[7,1] + M[7,2] + M[7,3] #= 1,
> M[8,1] + M[8,2] + M[8,3] #= 1,
> M[9,1] + M[9,2] + M[9,3] #= 1,
> M[10,1] + M[10,2] + M[10,3] #= 1,
> 
> As you can see here, this constrains are fixed and will work only when M
> is 10x3 matrix. I must change it in order to accept any input
> configuration.
> 
> I imagine I can iterate to every single line of the M matrix using a
> simple for loop. But for the sum of the columns values a loop will not
> help me since I must "construct" the constraint instead of perform any
> calculation at every iteration. Is it possible to do with Eclipse?

Yes, ECLiPSe is very good at symbolic manipulation, e.g. you could write

LeftHandSide = M[1,1] + M[1,2] + M[1,3],
LeftHandSide #= 1.

Here, LeftHandSide contains the symbolic expression _as_a_data_structure_,
and you can use that in the #= constraint.

You can then of course construct such a data structure in a loop:

( for(J,1,3), fromto(0,LHS1,LHS2,LHS), param(M) do
LHS2 = LHS1 + M[1,J]
),
LHS #= 1.

A little bit simpler is to construct a list and use sum(List):

( for(J,1,3), foreach(M[1,J],MIJs), param(M) do
true
),
sum(MIJs) #= 1.

And even simpler is the following shorthand:

sum(M[1,1..3]) #= 1.

Have a look at some examples on the web site
 <http://eclipse-clp.org/examples/magicsquare.ecl.txt>
http://eclipse-clp.org/examples/magicsquare.ecl.txt or
 <http://eclipse-clp.org/examples/tomo.ecl.txt>
http://eclipse-clp.org/examples/tomo.ecl.txt

 

 
Received on Thu Nov 05 2009 - 00:42:17 CET

This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET