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 <template <class,class,class,class> class B>
00041 void
00042 createBranch(Space* home, const IntVarArgs& x,
00043 IntVarBranch vars, IntValBranch vals) {
00044 ViewArray<IntView> xv(home,x);
00045 switch (vars) {
00046 case INT_VAR_NONE:
00047 if (home->failed()) return;
00048 Branch::create<B,IntView,Branch::ByNone>(home,xv,vals); break;
00049 case INT_VAR_MIN_MIN:
00050 if (home->failed()) return;
00051 Branch::create<B,IntView,Branch::ByMinMin>(home,xv,vals); break;
00052 case INT_VAR_MIN_MAX:
00053 if (home->failed()) return;
00054 Branch::create<B,IntView,Branch::ByMinMax>(home,xv,vals); break;
00055 case INT_VAR_MAX_MIN:
00056 if (home->failed()) return;
00057 Branch::create<B,IntView,Branch::ByMaxMin>(home,xv,vals); break;
00058 case INT_VAR_MAX_MAX:
00059 if (home->failed()) return;
00060 Branch::create<B,IntView,Branch::ByMaxMax>(home,xv,vals); break;
00061 case INT_VAR_SIZE_MIN:
00062 if (home->failed()) return;
00063 Branch::create<B,IntView,Branch::BySizeMin>(home,xv,vals); break;
00064 case INT_VAR_SIZE_MAX:
00065 if (home->failed()) return;
00066 Branch::create<B,IntView,Branch::BySizeMax>(home,xv,vals); break;
00067 case INT_VAR_DEGREE_MIN:
00068 if (home->failed()) return;
00069 Branch::create<B,IntView,Branch::ByDegreeMin>(home,xv,vals); break;
00070 case INT_VAR_DEGREE_MAX:
00071 if (home->failed()) return;
00072 Branch::create<B,IntView,Branch::ByDegreeMax>(home,xv,vals); break;
00073 case INT_VAR_SIZE_DEGREE_MIN:
00074 if (home->failed()) return;
00075 Branch::create<B,IntView,Branch::BySizeDegreeMin>(home,xv,vals); break;
00076 case INT_VAR_SIZE_DEGREE_MAX:
00077 if (home->failed()) return;
00078 Branch::create<B,IntView,Branch::BySizeDegreeMax>(home,xv,vals); break;
00079 case INT_VAR_REGRET_MIN_MIN:
00080 if (home->failed()) return;
00081 Branch::create<B,IntView,Branch::ByRegretMinMin>(home,xv,vals); break;
00082 case INT_VAR_REGRET_MIN_MAX:
00083 if (home->failed()) return;
00084 Branch::create<B,IntView,Branch::ByRegretMinMax>(home,xv,vals); break;
00085 case INT_VAR_REGRET_MAX_MIN:
00086 if (home->failed()) return;
00087 Branch::create<B,IntView,Branch::ByRegretMaxMin>(home,xv,vals); break;
00088 case INT_VAR_REGRET_MAX_MAX:
00089 if (home->failed()) return;
00090 Branch::create<B,IntView,Branch::ByRegretMaxMax>(home,xv,vals); break;
00091 default:
00092 throw UnknownBranching("Int::branch");
00093 }
00094 }
00095
00096 template <template <class,class,class,class> class B>
00097 void
00098 createBranch(Space* home, const BoolVarArgs& x,
00099 IntVarBranch vars, IntValBranch vals) {
00100 ViewArray<BoolView> xv(home,x);
00101 switch (vars) {
00102 case INT_VAR_NONE:
00103 case INT_VAR_MIN_MIN:
00104 case INT_VAR_MIN_MAX:
00105 case INT_VAR_MAX_MIN:
00106 case INT_VAR_MAX_MAX:
00107 case INT_VAR_SIZE_MIN:
00108 case INT_VAR_SIZE_MAX:
00109 case INT_VAR_REGRET_MIN_MIN:
00110 case INT_VAR_REGRET_MIN_MAX:
00111 case INT_VAR_REGRET_MAX_MIN:
00112 case INT_VAR_REGRET_MAX_MAX:
00113 switch (vals) {
00114 case INT_VAL_MIN:
00115 case INT_VAL_MED:
00116 case INT_VAL_SPLIT_MIN:
00117 if (home->failed()) return;
00118 (void) new (home)
00119 B<BoolView,Branch::NoValue,
00120 Branch::ByNone<BoolView>,
00121 Branch::ValZeroOne<BoolView> >(home,xv);
00122 break;
00123 case INT_VAL_MAX:
00124 case INT_VAL_SPLIT_MAX:
00125 if (home->failed()) return;
00126 (void) new (home)
00127 B<BoolView,Branch::NoValue,
00128 Branch::ByNone<BoolView>,
00129 Branch::ValOneZero<BoolView> >(home,xv);
00130 break;
00131 default:
00132 throw UnknownBranching("Int::branch");
00133 }
00134 break;
00135 case INT_VAR_DEGREE_MIN:
00136 case INT_VAR_SIZE_DEGREE_MAX:
00137 switch (vals) {
00138 case INT_VAL_MIN:
00139 case INT_VAL_MED:
00140 case INT_VAL_SPLIT_MIN:
00141 if (home->failed()) return;
00142 (void) new (home)
00143 B<BoolView,Branch::NoValue,
00144 Branch::ByDegreeMinNoTies<BoolView>,
00145 Branch::ValZeroOne<BoolView> >(home,xv);
00146 break;
00147 case INT_VAL_MAX:
00148 case INT_VAL_SPLIT_MAX:
00149 if (home->failed()) return;
00150 (void) new (home)
00151 B<BoolView,Branch::NoValue,
00152 Branch::ByDegreeMinNoTies<BoolView>,
00153 Branch::ValOneZero<BoolView> >(home,xv);
00154 break;
00155 default:
00156 throw UnknownBranching("Int::branch");
00157 }
00158 break;
00159 case INT_VAR_DEGREE_MAX:
00160 case INT_VAR_SIZE_DEGREE_MIN:
00161 switch (vals) {
00162 case INT_VAL_MIN:
00163 case INT_VAL_MED:
00164 case INT_VAL_SPLIT_MIN:
00165 if (home->failed()) return;
00166 (void) new (home)
00167 B<BoolView,Branch::NoValue,
00168 Branch::ByDegreeMaxNoTies<BoolView>,
00169 Branch::ValZeroOne<BoolView> >(home,xv);
00170 break;
00171 case INT_VAL_MAX:
00172 case INT_VAL_SPLIT_MAX:
00173 if (home->failed()) return;
00174 (void) new (home)
00175 B<BoolView,Branch::NoValue,
00176 Branch::ByDegreeMaxNoTies<BoolView>,
00177 Branch::ValOneZero<BoolView> >(home,xv);
00178 break;
00179 default:
00180 throw UnknownBranching("Int::branch");
00181 }
00182 break;
00183 default:
00184 throw UnknownBranching("Int::branch");
00185 }
00186 }
00187
00188 }}}
00189
00190