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 #include <gecode/float/branch.hh>
00039
00040 namespace Gecode {
00041
00042 void
00043 branch(Home home, const FloatVarArgs& x,
00044 FloatVarBranch vars, FloatValBranch vals,
00045 FloatBranchFilter bf,
00046 FloatVarValPrint vvp) {
00047 using namespace Float;
00048 if (home.failed()) return;
00049 vars.expand(home,x);
00050 ViewArray<FloatView> xv(home,x);
00051 ViewSel<FloatView>* vs[1] = {
00052 Branch::viewsel(home,vars)
00053 };
00054 postviewvalbrancher<FloatView,1,FloatNumBranch,2>
00055 (home,xv,vs,Branch::valselcommit(home,vals),bf,vvp);
00056 }
00057
00058 void
00059 branch(Home home, const FloatVarArgs& x,
00060 TieBreak<FloatVarBranch> vars, FloatValBranch vals,
00061 FloatBranchFilter bf,
00062 FloatVarValPrint vvp) {
00063 using namespace Float;
00064 if (home.failed()) return;
00065 vars.a.expand(home,x);
00066 if ((vars.a.select() == FloatVarBranch::SEL_NONE) ||
00067 (vars.a.select() == FloatVarBranch::SEL_RND))
00068 vars.b = FLOAT_VAR_NONE();
00069 vars.b.expand(home,x);
00070 if ((vars.b.select() == FloatVarBranch::SEL_NONE) ||
00071 (vars.b.select() == FloatVarBranch::SEL_RND))
00072 vars.c = FLOAT_VAR_NONE();
00073 vars.c.expand(home,x);
00074 if ((vars.c.select() == FloatVarBranch::SEL_NONE) ||
00075 (vars.c.select() == FloatVarBranch::SEL_RND))
00076 vars.d = FLOAT_VAR_NONE();
00077 vars.d.expand(home,x);
00078 if (vars.b.select() == FloatVarBranch::SEL_NONE) {
00079 branch(home,x,vars.a,vals,bf,vvp);
00080 } else {
00081 ViewArray<FloatView> xv(home,x);
00082 ValSelCommitBase<FloatView,FloatNumBranch>*
00083 vsc = Branch::valselcommit(home,vals);
00084 if (vars.c.select() == FloatVarBranch::SEL_NONE) {
00085 ViewSel<FloatView>* vs[2] = {
00086 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b)
00087 };
00088 postviewvalbrancher<FloatView,2,FloatNumBranch,2>
00089 (home,xv,vs,vsc,bf,vvp);
00090 } else if (vars.d.select() == FloatVarBranch::SEL_NONE) {
00091 ViewSel<FloatView>* vs[3] = {
00092 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b),
00093 Branch::viewsel(home,vars.c)
00094 };
00095 postviewvalbrancher<FloatView,3,FloatNumBranch,2>
00096 (home,xv,vs,vsc,bf,vvp);
00097 } else {
00098 ViewSel<FloatView>* vs[4] = {
00099 Branch::viewsel(home,vars.a),Branch::viewsel(home,vars.b),
00100 Branch::viewsel(home,vars.c),Branch::viewsel(home,vars.d)
00101 };
00102 postviewvalbrancher<FloatView,4,FloatNumBranch,2>
00103 (home,xv,vs,vsc,bf,vvp);
00104 }
00105 }
00106 }
00107
00108 void
00109 branch(Home home, FloatVar x, FloatValBranch vals, FloatVarValPrint vvp) {
00110 FloatVarArgs xv(1); xv[0]=x;
00111 branch(home, xv, FLOAT_VAR_NONE(), vals, nullptr, vvp);
00112 }
00113
00114 void
00115 assign(Home home, const FloatVarArgs& x, FloatAssign fa,
00116 FloatBranchFilter bf,
00117 FloatVarValPrint vvp) {
00118 using namespace Float;
00119 if (home.failed()) return;
00120 ViewArray<FloatView> xv(home,x);
00121 ViewSel<FloatView>* vs[1] = {
00122 new (home) ViewSelNone<FloatView>(home,FLOAT_VAR_NONE())
00123 };
00124 postviewvalbrancher<FloatView,1,FloatNumBranch,1>
00125 (home,xv,vs,Branch::valselcommit(home,fa),bf,vvp);
00126 }
00127
00128 void
00129 assign(Home home, FloatVar x, FloatAssign fa, FloatVarValPrint vvp) {
00130 FloatVarArgs xv(1); xv[0]=x;
00131 assign(home, xv, fa, nullptr, vvp);
00132 }
00133
00134 }
00135
00136