this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Christian Schulte <schulte@gecode.org> 5 * 6 * Copyright: 7 * Christian Schulte, 2012 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34#include <gecode/int/branch.hh> 35 36namespace Gecode { namespace Int { namespace Branch { 37 38 ViewSel<IntView>* 39 viewsel(Space& home, const IntVarBranch& ivb) { 40 switch (ivb.select()) { 41 case IntVarBranch::SEL_NONE: 42 return new (home) ViewSelNone<IntView>(home,ivb); 43 case IntVarBranch::SEL_RND: 44 return new (home) ViewSelRnd<IntView>(home,ivb); 45 default: break; 46 } 47 if (ivb.tbl() != nullptr) { 48 switch (ivb.select()) { 49 case IntVarBranch::SEL_MERIT_MIN: 50 return new (home) ViewSelMinTbl<MeritFunction<IntView>>(home,ivb); 51 case IntVarBranch::SEL_MERIT_MAX: 52 return new (home) ViewSelMaxTbl<MeritFunction<IntView>>(home,ivb); 53 case IntVarBranch::SEL_MIN_MIN: 54 return new (home) ViewSelMinTbl<MeritMin<IntView>>(home,ivb); 55 case IntVarBranch::SEL_MIN_MAX: 56 return new (home) ViewSelMaxTbl<MeritMin<IntView>>(home,ivb); 57 case IntVarBranch::SEL_MAX_MIN: 58 return new (home) ViewSelMinTbl<MeritMax<IntView>>(home,ivb); 59 case IntVarBranch::SEL_MAX_MAX: 60 return new (home) ViewSelMaxTbl<MeritMax<IntView>>(home,ivb); 61 case IntVarBranch::SEL_SIZE_MIN: 62 return new (home) ViewSelMinTbl<MeritSize<IntView>>(home,ivb); 63 case IntVarBranch::SEL_SIZE_MAX: 64 return new (home) ViewSelMaxTbl<MeritSize<IntView>>(home,ivb); 65 case IntVarBranch::SEL_DEGREE_MIN: 66 return new (home) ViewSelMinTbl<MeritDegree<IntView>>(home,ivb); 67 case IntVarBranch::SEL_DEGREE_MAX: 68 return new (home) ViewSelMaxTbl<MeritDegree<IntView>>(home,ivb); 69 case IntVarBranch::SEL_AFC_MIN: 70 return new (home) ViewSelMinTbl<MeritAFC<IntView>>(home,ivb); 71 case IntVarBranch::SEL_AFC_MAX: 72 return new (home) ViewSelMaxTbl<MeritAFC<IntView>>(home,ivb); 73 case IntVarBranch::SEL_ACTION_MIN: 74 return new (home) ViewSelMinTbl<MeritAction<IntView>>(home,ivb); 75 case IntVarBranch::SEL_ACTION_MAX: 76 return new (home) ViewSelMaxTbl<MeritAction<IntView>>(home,ivb); 77 case IntVarBranch::SEL_CHB_MIN: 78 return new (home) ViewSelMinTbl<MeritCHB<IntView>>(home,ivb); 79 case IntVarBranch::SEL_CHB_MAX: 80 return new (home) ViewSelMaxTbl<MeritCHB<IntView>>(home,ivb); 81 case IntVarBranch::SEL_DEGREE_SIZE_MIN: 82 return new (home) ViewSelMinTbl<MeritDegreeSize<IntView>>(home,ivb); 83 case IntVarBranch::SEL_DEGREE_SIZE_MAX: 84 return new (home) ViewSelMaxTbl<MeritDegreeSize<IntView>>(home,ivb); 85 case IntVarBranch::SEL_AFC_SIZE_MIN: 86 return new (home) ViewSelMinTbl<MeritAFCSize<IntView>>(home,ivb); 87 case IntVarBranch::SEL_AFC_SIZE_MAX: 88 return new (home) ViewSelMaxTbl<MeritAFCSize<IntView>>(home,ivb); 89 case IntVarBranch::SEL_ACTION_SIZE_MIN: 90 return new (home) ViewSelMinTbl<MeritActionSize<IntView>>(home,ivb); 91 case IntVarBranch::SEL_ACTION_SIZE_MAX: 92 return new (home) ViewSelMaxTbl<MeritActionSize<IntView>>(home,ivb); 93 case IntVarBranch::SEL_CHB_SIZE_MIN: 94 return new (home) ViewSelMinTbl<MeritCHBSize<IntView>>(home,ivb); 95 case IntVarBranch::SEL_CHB_SIZE_MAX: 96 return new (home) ViewSelMaxTbl<MeritCHBSize<IntView>>(home,ivb); 97 case IntVarBranch::SEL_REGRET_MIN_MIN: 98 return new (home) ViewSelMinTbl<MeritRegretMin<IntView>>(home,ivb); 99 case IntVarBranch::SEL_REGRET_MIN_MAX: 100 return new (home) ViewSelMaxTbl<MeritRegretMin<IntView>>(home,ivb); 101 case IntVarBranch::SEL_REGRET_MAX_MIN: 102 return new (home) ViewSelMinTbl<MeritRegretMax<IntView>>(home,ivb); 103 case IntVarBranch::SEL_REGRET_MAX_MAX: 104 return new (home) ViewSelMaxTbl<MeritRegretMax<IntView>>(home,ivb); 105 default: 106 throw UnknownBranching("Int::branch"); 107 } 108 } else { 109 switch (ivb.select()) { 110 case IntVarBranch::SEL_MERIT_MIN: 111 return new (home) ViewSelMin<MeritFunction<IntView>>(home,ivb); 112 case IntVarBranch::SEL_MERIT_MAX: 113 return new (home) ViewSelMax<MeritFunction<IntView>>(home,ivb); 114 case IntVarBranch::SEL_MIN_MIN: 115 return new (home) ViewSelMin<MeritMin<IntView>>(home,ivb); 116 case IntVarBranch::SEL_MIN_MAX: 117 return new (home) ViewSelMax<MeritMin<IntView>>(home,ivb); 118 case IntVarBranch::SEL_MAX_MIN: 119 return new (home) ViewSelMin<MeritMax<IntView>>(home,ivb); 120 case IntVarBranch::SEL_MAX_MAX: 121 return new (home) ViewSelMax<MeritMax<IntView>>(home,ivb); 122 case IntVarBranch::SEL_SIZE_MIN: 123 return new (home) ViewSelMin<MeritSize<IntView>>(home,ivb); 124 case IntVarBranch::SEL_SIZE_MAX: 125 return new (home) ViewSelMax<MeritSize<IntView>>(home,ivb); 126 case IntVarBranch::SEL_DEGREE_MIN: 127 return new (home) ViewSelMin<MeritDegree<IntView>>(home,ivb); 128 case IntVarBranch::SEL_DEGREE_MAX: 129 return new (home) ViewSelMax<MeritDegree<IntView>>(home,ivb); 130 case IntVarBranch::SEL_AFC_MIN: 131 return new (home) ViewSelMin<MeritAFC<IntView>>(home,ivb); 132 case IntVarBranch::SEL_AFC_MAX: 133 return new (home) ViewSelMax<MeritAFC<IntView>>(home,ivb); 134 case IntVarBranch::SEL_ACTION_MIN: 135 return new (home) ViewSelMin<MeritAction<IntView>>(home,ivb); 136 case IntVarBranch::SEL_ACTION_MAX: 137 return new (home) ViewSelMax<MeritAction<IntView>>(home,ivb); 138 case IntVarBranch::SEL_CHB_MIN: 139 return new (home) ViewSelMin<MeritCHB<IntView>>(home,ivb); 140 case IntVarBranch::SEL_CHB_MAX: 141 return new (home) ViewSelMax<MeritCHB<IntView>>(home,ivb); 142 case IntVarBranch::SEL_DEGREE_SIZE_MIN: 143 return new (home) ViewSelMin<MeritDegreeSize<IntView>>(home,ivb); 144 case IntVarBranch::SEL_DEGREE_SIZE_MAX: 145 return new (home) ViewSelMax<MeritDegreeSize<IntView>>(home,ivb); 146 case IntVarBranch::SEL_AFC_SIZE_MIN: 147 return new (home) ViewSelMin<MeritAFCSize<IntView>>(home,ivb); 148 case IntVarBranch::SEL_AFC_SIZE_MAX: 149 return new (home) ViewSelMax<MeritAFCSize<IntView>>(home,ivb); 150 case IntVarBranch::SEL_ACTION_SIZE_MIN: 151 return new (home) ViewSelMin<MeritActionSize<IntView>>(home,ivb); 152 case IntVarBranch::SEL_ACTION_SIZE_MAX: 153 return new (home) ViewSelMax<MeritActionSize<IntView>>(home,ivb); 154 case IntVarBranch::SEL_CHB_SIZE_MIN: 155 return new (home) ViewSelMin<MeritCHBSize<IntView>>(home,ivb); 156 case IntVarBranch::SEL_CHB_SIZE_MAX: 157 return new (home) ViewSelMax<MeritCHBSize<IntView>>(home,ivb); 158 case IntVarBranch::SEL_REGRET_MIN_MIN: 159 return new (home) ViewSelMin<MeritRegretMin<IntView>>(home,ivb); 160 case IntVarBranch::SEL_REGRET_MIN_MAX: 161 return new (home) ViewSelMax<MeritRegretMin<IntView>>(home,ivb); 162 case IntVarBranch::SEL_REGRET_MAX_MIN: 163 return new (home) ViewSelMin<MeritRegretMax<IntView>>(home,ivb); 164 case IntVarBranch::SEL_REGRET_MAX_MAX: 165 return new (home) ViewSelMax<MeritRegretMax<IntView>>(home,ivb); 166 default: 167 throw UnknownBranching("Int::branch"); 168 } 169 } 170 GECODE_NEVER; 171 return nullptr; 172 } 173 174 ViewSel<BoolView>* 175 viewsel(Space& home, const BoolVarBranch& bvb) { 176 switch (bvb.select()) { 177 case BoolVarBranch::SEL_NONE: 178 return new (home) ViewSelNone<BoolView>(home,bvb); 179 case BoolVarBranch::SEL_RND: 180 return new (home) ViewSelRnd<BoolView>(home,bvb); 181 default: break; 182 } 183 if (bvb.tbl() != nullptr) { 184 switch (bvb.select()) { 185 case BoolVarBranch::SEL_MERIT_MIN: 186 return new (home) ViewSelMinTbl<MeritFunction<BoolView>>(home,bvb); 187 case BoolVarBranch::SEL_MERIT_MAX: 188 return new (home) ViewSelMaxTbl<MeritFunction<BoolView>>(home,bvb); 189 case BoolVarBranch::SEL_DEGREE_MIN: 190 return new (home) ViewSelMinTbl<MeritDegree<BoolView>>(home,bvb); 191 case BoolVarBranch::SEL_DEGREE_MAX: 192 return new (home) ViewSelMaxTbl<MeritDegree<BoolView>>(home,bvb); 193 case BoolVarBranch::SEL_AFC_MIN: 194 return new (home) ViewSelMinTbl<MeritAFC<BoolView>>(home,bvb); 195 case BoolVarBranch::SEL_AFC_MAX: 196 return new (home) ViewSelMaxTbl<MeritAFC<BoolView>>(home,bvb); 197 case BoolVarBranch::SEL_ACTION_MIN: 198 return new (home) ViewSelMinTbl<MeritAction<BoolView>>(home,bvb); 199 case BoolVarBranch::SEL_ACTION_MAX: 200 return new (home) ViewSelMaxTbl<MeritAction<BoolView>>(home,bvb); 201 case BoolVarBranch::SEL_CHB_MIN: 202 return new (home) ViewSelMinTbl<MeritCHB<BoolView>>(home,bvb); 203 case BoolVarBranch::SEL_CHB_MAX: 204 return new (home) ViewSelMaxTbl<MeritCHB<BoolView>>(home,bvb); 205 default: 206 throw UnknownBranching("Int::branch"); 207 } 208 } else { 209 switch (bvb.select()) { 210 case BoolVarBranch::SEL_MERIT_MIN: 211 return new (home) ViewSelMin<MeritFunction<BoolView>>(home,bvb); 212 case BoolVarBranch::SEL_MERIT_MAX: 213 return new (home) ViewSelMax<MeritFunction<BoolView>>(home,bvb); 214 case BoolVarBranch::SEL_DEGREE_MIN: 215 return new (home) ViewSelMin<MeritDegree<BoolView>>(home,bvb); 216 case BoolVarBranch::SEL_DEGREE_MAX: 217 return new (home) ViewSelMax<MeritDegree<BoolView>>(home,bvb); 218 case BoolVarBranch::SEL_AFC_MIN: 219 return new (home) ViewSelMin<MeritAFC<BoolView>>(home,bvb); 220 case BoolVarBranch::SEL_AFC_MAX: 221 return new (home) ViewSelMax<MeritAFC<BoolView>>(home,bvb); 222 case BoolVarBranch::SEL_ACTION_MIN: 223 return new (home) ViewSelMin<MeritAction<BoolView>>(home,bvb); 224 case BoolVarBranch::SEL_ACTION_MAX: 225 return new (home) ViewSelMax<MeritAction<BoolView>>(home,bvb); 226 case BoolVarBranch::SEL_CHB_MIN: 227 return new (home) ViewSelMin<MeritCHB<BoolView>>(home,bvb); 228 case BoolVarBranch::SEL_CHB_MAX: 229 return new (home) ViewSelMax<MeritCHB<BoolView>>(home,bvb); 230 default: 231 throw UnknownBranching("Int::branch"); 232 } 233 } 234 GECODE_NEVER; 235 return nullptr; 236 } 237 238}}} 239 240 241// STATISTICS: int-branch 242