inline std::string Comparator::compare(std::string x_n, SetVar x, SetVar y) { SetVarGlbRanges xglbr(x), yglbr(y); SetVarLubRanges xlubr(x), ylubr(y); if (! (Iter::Ranges::equal(xglbr,yglbr) && Iter::Ranges::equal(xlubr,ylubr) && x.cardMin() == y.cardMin() && y.cardMax() == y.cardMax()) ) { std::ostringstream ret; ret << x_n << "=" << x << " -> " << y; return ret.str(); } return ""; }
//int bpfs[1][12]; /// Actual model Profils(const ProfilsOptions& opt) : Script(opt), xs(*this,opt.size(),IntSet::empty,1,opt.nn()) { # if 0 // was the hamming constrain SetVarArray cxs(*this,xs.size()); for (int i=0; i<xs.size(); i++) rel(*this, xs[i], SRT_CMPL, cxs[i]); for (int i=0; i<xs.size(); i++) { SetVar y = xs[i]; SetVar cy = cxs[i]; for (int j=i+1; j<xs.size(); j++) { SetVar x = xs[j]; SetVar cx = cxs[j]; SetVar xIntCy(*this); SetVar yIntCx(*this); rel(*this, x, SOT_INTER, cy, SRT_EQ, xIntCy); rel(*this, y, SOT_INTER, cx, SRT_EQ, yIntCx); IntVar xIntCyCard(*this,0,x.cardMax()); IntVar yIntCxCard(*this,0,y.cardMax()); cardinality(*this, xIntCy, xIntCyCard); cardinality(*this, yIntCx, yIntCxCard); post(*this, xIntCyCard+yIntCxCard >= opt.distance()); } } #endif for (int i=0; i<(xs.size() - 1); i++) { IntVar min0(*this,0,120); IntVar min1(*this,0,120); IntVar max0(*this,0,120); IntVar max1(*this,0,120); min(*this,xs[i],min0); min(*this,xs[i+1],min1); if (opt.profils[0][i] == 1) rel(*this, min1,IRT_GR, min0); else rel(*this, min1,IRT_LE, min0); max(*this,xs[i],max0); max(*this,xs[i+1],max1); if (opt.profils[1][i] == 1) rel(*this, max1,IRT_GR, max0); else rel(*this, max1,IRT_LE, max0); } //contrainte de cardinalité IntVar card(*this,opt.densMin,opt.densMax); for (int i=0; i<(xs.size()); i++) cardinality(*this, xs[i], card); branch(*this, xs, SET_VAR_NONE(), SET_VAL_MIN_INC()); }