OK thanks for that. This makes the code simpler but I do still have to make a 
set of variables to contain the multiplicities (the v’s).
Of course they immediately become assigned to a single value. Would it be right 
in assuming the cost of that on the model is very small?

Sent from Mail<https://go.microsoft.com/fwlink/?LinkId=550986> for Windows 10

From: Christian Schulte <cschu...@kth.se>
Sent: Monday, March 12, 2018 2:31:26 AM
To: Neill Clift; users@gecode.org
Subject: RE: Extra level of variables needed for count?


I think you stopped reading a little too early. MPG says that you can also use 
integer sets instead of variables.

Then, in your example you do not need x and c, just pass b and v directly! 
IntVarArray is automatically casted to IntVarArgs.


Christian Schulte, https://chschulte.github.io/
Professor of Computer Science, KTH, cschu...@kth.se<mailto:cschu...@kth.se>
Expert Researcher, RISE SICS, 

From: users-boun...@gecode.org [mailto:users-boun...@gecode.org] On Behalf Of 
Neill Clift
Sent: Saturday, March 10, 2018 20:37
To: users@gecode.org
Subject: [gecode-users] Extra level of variables needed for count?

I want to restrict the values of an array to members of a multiset. This is a 
bit like distinct but can have repeated values.
So for example I want the values of b[0..7] to come from the multiset 
{5,5,5,4,3,2,1,0}. The b’s are essentially a permutation of the multiset
Count seems to be the way to achieve this but I have to add a whole new set of 
variables (the v’s below) that contain the counts of the multiplicities.
I cut out a bunch of stuff that’s not relevant to the code below so I hope it 
still makes  sense.
bp.MaxBit is the number of distinct values in the multiset. And bp.Bits[i] is 
the multiplicity for the multiset value i.
Is this the expected way to do what I am trying to do here?

                IntVarArray b;

                PartialOrderSort(LPTYPER n, BIT_PATTERN &bp, LPTYPER TopIndex) :
                                b(*this, n, 0, TopIndex)
                                IntVarArgs x(n);
                                IntVarArgs c((LPTYPER)bp.MaxBit);
                                for (int i = 0; i < n; i++) {
                                                x[i] = b[i];
                                IntVarArray v(*this, (LPTYPER)bp.MaxBit, 0, n - 
                                for (int i = 0; i < bp.MaxBit; i++) {
                                                c[i] = v[i];
                                                rel(*this, v[i] == 

                                count(*this, x, c, IPL_DOM);

Sent from Mail<https://go.microsoft.com/fwlink/?LinkId=550986> for Windows 10

Gecode users mailing list

Reply via email to