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 #include <gecode/float/branch.hh>
00035
00036 namespace Gecode {
00037
00038 void
00039 branch(Home home, const FloatVarArgs& x,
00040 FloatVarBranch vars, FloatValBranch vals,
00041 FloatBranchFilter bf,
00042 FloatVarValPrint vvp) {
00043 using namespace Float;
00044 if (home.failed()) return;
00045 vars.expand(home,x);
00046 ViewArray<FloatView> xv(home,x);
00047 ViewSel<FloatView>* vs[1] = {
00048 Branch::viewsel(home,vars)
00049 };
00050 postviewvalbrancher<FloatView,1,FloatNumBranch,2>
00051 (home,xv,vs,Branch::valselcommit(home,vals),bf,vvp);
00052 }
00053
00054 void
00055 branch(Home home, const FloatVarArgs& x,
00056 TieBreak<FloatVarBranch> vars, FloatValBranch vals,
00057 FloatBranchFilter bf,
00058 FloatVarValPrint vvp) {
00059 using namespace Float;
00060 if (home.failed()) return;
00061 vars.a.expand(home,x);
00062 if ((vars.a.select() == FloatVarBranch::SEL_NONE) ||
00063 (vars.a.select() == FloatVarBranch::SEL_RND))
00064 vars.b = FLOAT_VAR_NONE();
00065 vars.b.expand(home,x);
00066 if ((vars.b.select() == FloatVarBranch::SEL_NONE) ||
00067 (vars.b.select() == FloatVarBranch::SEL_RND))
00068 vars.c = FLOAT_VAR_NONE();
00069 vars.c.expand(home,x);
00070 if ((vars.c.select() == FloatVarBranch::SEL_NONE) ||
00071 (vars.c.select() == FloatVarBranch::SEL_RND))
00072 vars.d = FLOAT_VAR_NONE();
00073 vars.d.expand(home,x);
00074 if (vars.b.select() == FloatVarBranch::SEL_NONE) {
00075 branch(home,x,vars.a,vals,bf,vvp);
00076 } else {
00077 ViewArray<FloatView> xv(home,x);
00078 ValSelCommitBase<FloatView,FloatNumBranch>*
00079 vsc = Branch::valselcommit(home,vals);
00080 if (vars.c.select() == FloatVarBranch::SEL_NONE) {
00081 ViewSel<FloatView>* vs[2] = {
00082 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b)
00083 };
00084 postviewvalbrancher<FloatView,2,FloatNumBranch,2>
00085 (home,xv,vs,vsc,bf,vvp);
00086 } else if (vars.d.select() == FloatVarBranch::SEL_NONE) {
00087 ViewSel<FloatView>* vs[3] = {
00088 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b),
00089 Branch::viewsel(home,vars.c)
00090 };
00091 postviewvalbrancher<FloatView,3,FloatNumBranch,2>
00092 (home,xv,vs,vsc,bf,vvp);
00093 } else {
00094 ViewSel<FloatView>* vs[4] = {
00095 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b),
00096 Branch::viewsel(home,vars.c),Branch::viewsel(home,vars.d)
00097 };
00098 postviewvalbrancher<FloatView,4,FloatNumBranch,2>
00099 (home,xv,vs,vsc,bf,vvp);
00100 }
00101 }
00102 }
00103
00104 void
00105 branch(Home home, FloatVar x, FloatValBranch vals, FloatVarValPrint vvp) {
00106 FloatVarArgs xv(1); xv[0]=x;
00107 branch(home, xv, FLOAT_VAR_NONE(), vals, nullptr, vvp);
00108 }
00109
00110 void
00111 assign(Home home, const FloatVarArgs& x,
00112 FloatVarBranch vars, FloatAssign vals,
00113 FloatBranchFilter bf,
00114 FloatVarValPrint vvp) {
00115 using namespace Float;
00116 if (home.failed()) return;
00117 ViewArray<FloatView> xv(home,x);
00118 ViewSel<FloatView>* vs[1] = {
00119 new (home) ViewSelNone<FloatView>(home,vars)
00120 };
00121 postviewvalbrancher<FloatView,1,FloatNumBranch,1>
00122 (home,xv,vs,Branch::valselcommit(home,vals),bf,vvp);
00123 }
00124
00125 void
00126 assign(Home home, const FloatVarArgs& x,
00127 TieBreak<FloatVarBranch> vars, FloatAssign vals,
00128 FloatBranchFilter bf,
00129 FloatVarValPrint vvp) {
00130 using namespace Float;
00131 if (home.failed()) return;
00132 vars.a.expand(home,x);
00133 if ((vars.a.select() == FloatVarBranch::SEL_NONE) ||
00134 (vars.a.select() == FloatVarBranch::SEL_RND))
00135 vars.b = FLOAT_VAR_NONE();
00136 vars.b.expand(home,x);
00137 if ((vars.b.select() == FloatVarBranch::SEL_NONE) ||
00138 (vars.b.select() == FloatVarBranch::SEL_RND))
00139 vars.c = FLOAT_VAR_NONE();
00140 vars.c.expand(home,x);
00141 if ((vars.c.select() == FloatVarBranch::SEL_NONE) ||
00142 (vars.c.select() == FloatVarBranch::SEL_RND))
00143 vars.d = FLOAT_VAR_NONE();
00144 vars.d.expand(home,x);
00145 if (vars.b.select() == FloatVarBranch::SEL_NONE) {
00146 assign(home,x,vars.a,vals,bf,vvp);
00147 } else {
00148 ViewArray<FloatView> xv(home,x);
00149 ValSelCommitBase<FloatView,FloatNumBranch>*
00150 vsc = Branch::valselcommit(home,vals);
00151 if (vars.c.select() == FloatVarBranch::SEL_NONE) {
00152 ViewSel<FloatView>* vs[2] = {
00153 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b)
00154 };
00155 postviewvalbrancher<FloatView,2,FloatNumBranch,1>
00156 (home,xv,vs,vsc,bf,vvp);
00157 } else if (vars.d.select() == FloatVarBranch::SEL_NONE) {
00158 ViewSel<FloatView>* vs[3] = {
00159 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b),
00160 Branch::viewsel(home,vars.c)
00161 };
00162 postviewvalbrancher<FloatView,3,FloatNumBranch,1>
00163 (home,xv,vs,vsc,bf,vvp);
00164 } else {
00165 ViewSel<FloatView>* vs[4] = {
00166 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b),
00167 Branch::viewsel(home,vars.c),Branch::viewsel(home,vars.d)
00168 };
00169 postviewvalbrancher<FloatView,4,FloatNumBranch,1>
00170 (home,xv,vs,vsc,bf,vvp);
00171 }
00172 }
00173 }
00174
00175 void
00176 assign(Home home, FloatVar x, FloatAssign vals, FloatVarValPrint vvp) {
00177 FloatVarArgs xv(1); xv[0]=x;
00178 assign(home, xv, FLOAT_VAR_NONE(), vals, nullptr, vvp);
00179 }
00180
00181 }
00182
00183