00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 namespace Gecode { namespace Int { namespace Branch {
00039
00040 template<class View>
00041 forceinline
00042 ValSelMin<View>::ValSelMin(Space& home, const ValBranch& vb)
00043 : ValSel<View,int>(home,vb) {}
00044 template<class View>
00045 forceinline
00046 ValSelMin<View>::ValSelMin(Space& home, bool shared, ValSelMin& vs)
00047 : ValSel<View,int>(home,shared,vs) {}
00048 template<class View>
00049 forceinline int
00050 ValSelMin<View>::val(const Space&, View x, int) {
00051 return x.min();
00052 }
00053
00054 template<class View>
00055 forceinline
00056 ValSelMax<View>::ValSelMax(Space& home, const ValBranch& vb)
00057 : ValSel<View,int>(home,vb) {}
00058 template<class View>
00059 forceinline
00060 ValSelMax<View>::ValSelMax(Space& home, bool shared, ValSelMax& vs)
00061 : ValSel<View,int>(home,shared,vs) {}
00062 template<class View>
00063 forceinline int
00064 ValSelMax<View>::val(const Space&, View x, int) {
00065 return x.max();
00066 }
00067
00068 template<class View>
00069 forceinline
00070 ValSelMed<View>::ValSelMed(Space& home, const ValBranch& vb)
00071 : ValSel<View,int>(home,vb) {}
00072 template<class View>
00073 forceinline
00074 ValSelMed<View>::ValSelMed(Space& home, bool shared, ValSelMed& vs)
00075 : ValSel<View,int>(home,shared,vs) {}
00076 template<class View>
00077 forceinline int
00078 ValSelMed<View>::val(const Space&, View x, int) {
00079 return x.med();
00080 }
00081
00082 template<class View>
00083 forceinline
00084 ValSelAvg<View>::ValSelAvg(Space& home, const ValBranch& vb)
00085 : ValSel<View,int>(home,vb) {}
00086 template<class View>
00087 forceinline
00088 ValSelAvg<View>::ValSelAvg(Space& home, bool shared, ValSelAvg& vs)
00089 : ValSel<View,int>(home,shared,vs) {}
00090 template<class View>
00091 forceinline int
00092 ValSelAvg<View>::val(const Space&, View x, int) {
00093 return (x.width() == 2U) ? x.min() : ((x.min()+x.max()) / 2);
00094 }
00095
00096 template<class View>
00097 forceinline
00098 ValSelRnd<View>::ValSelRnd(Space& home, const ValBranch& vb)
00099 : ValSel<View,int>(home,vb), r(vb.rnd()) {}
00100 template<class View>
00101 forceinline
00102 ValSelRnd<View>::ValSelRnd(Space& home, bool shared, ValSelRnd& vs)
00103 : ValSel<View,int>(home,shared,vs) {
00104 r.update(home,shared,vs.r);
00105 }
00106 template<class View>
00107 forceinline int
00108 ValSelRnd<View>::val(const Space&, View x, int) {
00109 unsigned int p = r(x.size());
00110 for (ViewRanges<View> i(x); i(); ++i) {
00111 if (i.width() > p)
00112 return i.min() + static_cast<int>(p);
00113 p -= i.width();
00114 }
00115 GECODE_NEVER;
00116 return 0;
00117 }
00118 template<class View>
00119 forceinline bool
00120 ValSelRnd<View>::notice(void) const {
00121 return true;
00122 }
00123 template<class View>
00124 forceinline void
00125 ValSelRnd<View>::dispose(Space&) {
00126 r.~Rnd();
00127 }
00128
00129 forceinline
00130 ValSelRangeMin::ValSelRangeMin(Space& home, const ValBranch& vb)
00131 : ValSel<IntView,int>(home,vb) {}
00132 forceinline
00133 ValSelRangeMin::ValSelRangeMin(Space& home, bool shared, ValSelRangeMin& vs)
00134 : ValSel<IntView,int>(home,shared,vs) {}
00135 forceinline int
00136 ValSelRangeMin::val(const Space&, IntView x, int) {
00137 if (x.range()) {
00138 return (x.width() == 2) ? x.min() : (x.min() + (x.max()-x.min())/2);
00139 } else {
00140 ViewRanges<View> r(x);
00141 return r.max();
00142 }
00143 }
00144
00145 forceinline
00146 ValSelRangeMax::ValSelRangeMax(Space& home, const ValBranch& vb)
00147 : ValSel<IntView,int>(home,vb) {}
00148 forceinline
00149 ValSelRangeMax::ValSelRangeMax(Space& home, bool shared, ValSelRangeMax& vs)
00150 : ValSel<IntView,int>(home,shared,vs) {}
00151 forceinline int
00152 ValSelRangeMax::val(const Space&, IntView x, int) {
00153 if (x.range()) {
00154 return (x.width() == 2) ? x.max() : (x.max() - (x.max()-x.min())/2);
00155 } else {
00156 int min;
00157 ViewRanges<IntView> r(x);
00158 do {
00159 min = r.min(); ++r;
00160 } while (r());
00161 return min;
00162 }
00163 }
00164
00165 template<class View, bool min>
00166 forceinline
00167 ValSelNearMinMax<View,min>::ValSelNearMinMax(Space& home,
00168 const ValBranch& vb)
00169 : ValSel<View,int>(home,vb),
00170 c(static_cast<const IntValBranch&>(vb).values()) {}
00171 template<class View, bool min>
00172 forceinline
00173 ValSelNearMinMax<View,min>::ValSelNearMinMax(Space& home, bool shared,
00174 ValSelNearMinMax& vs)
00175 : ValSel<View,int>(home,shared,vs) {
00176 c.update(home,shared,vs.c);
00177 }
00178 template<class View, bool min>
00179 forceinline int
00180 ValSelNearMinMax<View,min>::val(const Space&, View x, int i) {
00181 int n = c[i];
00182 if (x.max() <= n) return x.max();
00183 if (x.min() >= n) return x.min();
00184 if (x.range()) return n;
00185 ViewRanges<View> r(x);
00186 int pmax;
00187 do {
00188 pmax=r.max(); ++r;
00189 } while (r.max() < n);
00190 assert(r());
00191 if ((pmax >= n) || (r.min() <= n))
00192 return n;
00193 assert((pmax < n) && (n < r.min()));
00194 unsigned int dmin = static_cast<unsigned int>(n - pmax);
00195 unsigned int dmax = static_cast<unsigned int>(r.min() - n);
00196 if (dmin == dmax)
00197 return min ? pmax : r.min();
00198 else if (dmin < dmax)
00199 return pmax;
00200 else
00201 return r.min();
00202 }
00203 template<class View, bool min>
00204 forceinline bool
00205 ValSelNearMinMax<View,min>::notice(void) const {
00206 return true;
00207 }
00208 template<class View, bool min>
00209 forceinline void
00210 ValSelNearMinMax<View,min>::dispose(Space&) {
00211 c.~IntSharedArray();
00212 }
00213
00214 template<class View, bool inc>
00215 forceinline
00216 ValSelNearIncDec<View,inc>::ValSelNearIncDec(Space& home,
00217 const ValBranch& vb)
00218 : ValSel<View,int>(home,vb),
00219 c(static_cast<const IntValBranch&>(vb).values()) {}
00220 template<class View, bool inc>
00221 forceinline
00222 ValSelNearIncDec<View,inc>::ValSelNearIncDec(Space& home, bool shared,
00223 ValSelNearIncDec& vs)
00224 : ValSel<View,int>(home,shared,vs) {
00225 c.update(home,shared,vs.c);
00226 }
00227 template<class View, bool inc>
00228 forceinline int
00229 ValSelNearIncDec<View,inc>::val(const Space&, View x, int i) {
00230 int n = c[i];
00231 if (x.max() <= n) return x.max();
00232 if (x.min() >= n) return x.min();
00233 if (x.range()) return n;
00234 if (inc) {
00235 ViewRanges<View> r(x);
00236 while (r.max() < n)
00237 ++r;
00238 assert(r());
00239 return (r.min() <= n) ? n : r.min();
00240 } else {
00241 ViewRanges<View> r(x);
00242 int pmax;
00243 do {
00244 pmax=r.max(); ++r;
00245 } while (r.max() < n);
00246 assert(r());
00247 return (r.min() <= n) ? n : pmax;
00248 }
00249 }
00250 template<class View, bool inc>
00251 forceinline bool
00252 ValSelNearIncDec<View,inc>::notice(void) const {
00253 return true;
00254 }
00255 template<class View, bool inc>
00256 forceinline void
00257 ValSelNearIncDec<View,inc>::dispose(Space&) {
00258 c.~IntSharedArray();
00259 }
00260
00261 }}}
00262
00263
00264