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<Var>& 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<Var>& 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<Var>& 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<Var>& 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<Var>& 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<IntVar>& 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<IntVar>& 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 }}}
00166
00167
00168