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 ValMin<View>::ValMin(void) {}
00043 template<class View>
00044 forceinline
00045 ValMin<View>::ValMin(Space& home, const ValBranchOptions& vbo)
00046 : ValSelBase<View,int>(home,vbo) {}
00047 template<class View>
00048 forceinline int
00049 ValMin<View>::val(Space&, View x) const {
00050 return x.min();
00051 }
00052 template<class View>
00053 forceinline ModEvent
00054 ValMin<View>::tell(Space& home, unsigned int a, View x, int n) {
00055 return (a == 0) ? x.eq(home,n) : x.gr(home,n);
00056 }
00057
00058 template<class View>
00059 forceinline
00060 ValMed<View>::ValMed(void) {}
00061 template<class View>
00062 forceinline
00063 ValMed<View>::ValMed(Space& home, const ValBranchOptions& vbo)
00064 : ValSelBase<View,int>(home,vbo) {}
00065 template<class View>
00066 forceinline int
00067 ValMed<View>::val(Space&, View x) const {
00068 return x.med();
00069 }
00070 template<class View>
00071 forceinline ModEvent
00072 ValMed<View>::tell(Space& home, unsigned int a, View x, int n) {
00073 return (a == 0) ? x.eq(home,n) : x.nq(home,n);
00074 }
00075
00076
00077 template<class View>
00078 forceinline
00079 ValRnd<View>::ValRnd(void) {}
00080 template<class View>
00081 forceinline
00082 ValRnd<View>::ValRnd(Space&, const ValBranchOptions& vbo)
00083 : r(vbo.seed) {}
00084 template<class View>
00085 forceinline int
00086 ValRnd<View>::val(Space&, View x) {
00087 unsigned int p = r(x.size());
00088 for (ViewRanges<View> i(x); i(); ++i) {
00089 if (i.width() > p)
00090 return i.min() + static_cast<int>(p);
00091 p -= i.width();
00092 }
00093 GECODE_NEVER;
00094 return 0;
00095 }
00096 template<class View>
00097 forceinline ModEvent
00098 ValRnd<View>::tell(Space& home, unsigned int a, View x, int n) {
00099 return (a == 0) ? x.eq(home,n) : x.nq(home,n);
00100 }
00101 template<class View>
00102 forceinline typename ValRnd<View>::Choice
00103 ValRnd<View>::choice(Space&) {
00104 return r;
00105 }
00106 template<class View>
00107 forceinline typename ValRnd<View>::Choice
00108 ValRnd<View>::choice(const Space&, Archive& e) {
00109 return Choice(e.get());
00110 }
00111 template<class View>
00112 forceinline void
00113 ValRnd<View>::commit(Space&, const Choice& c, unsigned int) {
00114 r = c;
00115 }
00116 template<class View>
00117 forceinline void
00118 ValRnd<View>::update(Space&, bool, ValRnd<View>& vr) {
00119 r = vr.r;
00120 }
00121 template<class View>
00122 forceinline void
00123 ValRnd<View>::dispose(Space&) {}
00124
00125
00126 template<class View>
00127 forceinline
00128 ValSplitMin<View>::ValSplitMin(void) {}
00129 template<class View>
00130 forceinline
00131 ValSplitMin<View>::ValSplitMin(Space& home,
00132 const ValBranchOptions& vbo)
00133 : ValSelBase<View,int>(home,vbo) {}
00134 template<class View>
00135 forceinline int
00136 ValSplitMin<View>::val(Space&, View x) const {
00137 return (x.width() == 2) ? x.min() : ((x.min()+x.max()) / 2);
00138 }
00139 template<class View>
00140 forceinline ModEvent
00141 ValSplitMin<View>::tell(Space& home, unsigned int a, View x, int n) {
00142 return (a == 0) ? x.lq(home,n) : x.gr(home,n);
00143 }
00144
00145
00146 template<class View>
00147 forceinline
00148 ValRangeMin<View>::ValRangeMin(void) {}
00149 template<class View>
00150 forceinline
00151 ValRangeMin<View>::ValRangeMin(Space& home,
00152 const ValBranchOptions& vbo)
00153 : ValSelBase<View,int>(home,vbo) {}
00154 template<class View>
00155 forceinline int
00156 ValRangeMin<View>::val(Space&, View x) const {
00157 if (x.range()) {
00158 return (x.width() == 2) ? x.min() : ((x.min()+x.max()) / 2);
00159 } else {
00160 ViewRanges<View> r(x);
00161 return r.max();
00162 }
00163 }
00164 template<class View>
00165 forceinline ModEvent
00166 ValRangeMin<View>::tell(Space& home, unsigned int a, View x, int n) {
00167 return (a == 0) ? x.lq(home,n) : x.gr(home,n);
00168 }
00169
00170
00171 template<class View>
00172 forceinline
00173 ValZeroOne<View>::ValZeroOne(void) {}
00174 template<class View>
00175 forceinline
00176 ValZeroOne<View>::ValZeroOne(Space& home, const ValBranchOptions& vbo)
00177 : ValSelBase<View,NoValue>(home,vbo) {}
00178 template<class View>
00179 forceinline NoValue
00180 ValZeroOne<View>::val(Space&, View) const {
00181 NoValue n; return n;
00182 }
00183 template<class View>
00184 forceinline ModEvent
00185 ValZeroOne<View>::tell(Space& home, unsigned int a, View x, NoValue) {
00186 return (a == 0) ? x.zero(home) : x.one(home);
00187 }
00188
00189
00190 template<class View>
00191 forceinline
00192 AssignValMin<View>::AssignValMin(void) {}
00193 template<class View>
00194 forceinline
00195 AssignValMin<View>::AssignValMin(Space& home, const ValBranchOptions& vbo)
00196 : ValMin<View>(home,vbo) {}
00197
00198
00199 template<class View>
00200 forceinline
00201 AssignValMed<View>::AssignValMed(void) {}
00202 template<class View>
00203 forceinline
00204 AssignValMed<View>::AssignValMed(Space& home, const ValBranchOptions& vbo)
00205 : ValMed<View>(home,vbo) {}
00206
00207
00208 template<class View>
00209 forceinline
00210 AssignValRnd<View>::AssignValRnd(void) {}
00211 template<class View>
00212 forceinline
00213 AssignValRnd<View>::AssignValRnd(Space& home, const ValBranchOptions& vbo)
00214 : ValRnd<View>(home,vbo) {}
00215
00216
00217 template<class View>
00218 forceinline
00219 AssignValZero<View>::AssignValZero(void) {}
00220 template<class View>
00221 forceinline
00222 AssignValZero<View>::AssignValZero(Space& home,
00223 const ValBranchOptions& vbo)
00224 : ValZeroOne<View>(home,vbo) {}
00225
00226 }}}
00227
00228
00229