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 34namespace Gecode { namespace Int { namespace Branch { 35 36 // Minimum merit 37 template<class View> 38 forceinline 39 MeritMin<View>::MeritMin 40 (Space& home, const VarBranch<typename MeritMin<View>::Var>& vb) 41 : MeritBase<View,int>(home,vb) {} 42 template<class View> 43 forceinline 44 MeritMin<View>::MeritMin(Space& home, MeritMin& m) 45 : MeritBase<View,int>(home,m) {} 46 template<class View> 47 forceinline int 48 MeritMin<View>::operator ()(const Space&, View x, int) { 49 return x.min(); 50 } 51 52 // Maximum merit 53 template<class View> 54 forceinline 55 MeritMax<View>::MeritMax 56 (Space& home, const VarBranch<typename MeritMax<View>::Var>& vb) 57 : MeritBase<View,int>(home,vb) {} 58 template<class View> 59 forceinline 60 MeritMax<View>::MeritMax(Space& home, MeritMax& m) 61 : MeritBase<View,int>(home,m) {} 62 template<class View> 63 forceinline int 64 MeritMax<View>::operator ()(const Space&, View x, int) { 65 return x.max(); 66 } 67 68 // Size merit 69 template<class View> 70 forceinline 71 MeritSize<View>::MeritSize 72 (Space& home, const VarBranch<typename MeritSize<View>::Var>& vb) 73 : MeritBase<View,unsigned int>(home,vb) {} 74 template<class View> 75 forceinline 76 MeritSize<View>::MeritSize(Space& home, MeritSize& m) 77 : MeritBase<View,unsigned int>(home,m) {} 78 template<class View> 79 forceinline unsigned int 80 MeritSize<View>::operator ()(const Space&, View x, int) { 81 return x.size(); 82 } 83 84 // Degree over size merit 85 template<class View> 86 forceinline 87 MeritDegreeSize<View>::MeritDegreeSize 88 (Space& home, const VarBranch<typename MeritDegreeSize<View>::Var>& vb) 89 : MeritBase<View,double>(home,vb) {} 90 template<class View> 91 forceinline 92 MeritDegreeSize<View>::MeritDegreeSize(Space& home, MeritDegreeSize& m) 93 : MeritBase<View,double>(home,m) {} 94 template<class View> 95 forceinline double 96 MeritDegreeSize<View>::operator ()(const Space&, View x, int) { 97 return static_cast<double>(x.degree()) / static_cast<double>(x.size()); 98 } 99 100 // AFC over size merit 101 template<class View> 102 forceinline 103 MeritAFCSize<View>::MeritAFCSize 104 (Space& home, const VarBranch<typename MeritAFCSize<View>::Var>& vb) 105 : MeritBase<View,double>(home,vb), afc(vb.afc()) {} 106 template<class View> 107 forceinline 108 MeritAFCSize<View>::MeritAFCSize(Space& home, MeritAFCSize& m) 109 : MeritBase<View,double>(home,m), afc(m.afc) {} 110 template<class View> 111 forceinline double 112 MeritAFCSize<View>::operator ()(const Space&, View x, int) { 113 return x.afc() / static_cast<double>(x.size()); 114 } 115 template<class View> 116 forceinline bool 117 MeritAFCSize<View>::notice(void) const { 118 return false; 119 } 120 template<class View> 121 forceinline void 122 MeritAFCSize<View>::dispose(Space&) { 123 // Not needed 124 afc.~AFC(); 125 } 126 127 // Action over size merit 128 template<class View> 129 forceinline 130 MeritActionSize<View>::MeritActionSize 131 (Space& home, const VarBranch<typename MeritActionSize<View>::Var>& vb) 132 : MeritBase<View,double>(home,vb), action(vb.action()) {} 133 template<class View> 134 forceinline 135 MeritActionSize<View>::MeritActionSize(Space& home, MeritActionSize& m) 136 : MeritBase<View,double>(home,m), action(m.action) {} 137 template<class View> 138 forceinline double 139 MeritActionSize<View>::operator ()(const Space&, View x, int i) { 140 return action[i] / static_cast<double>(x.size()); 141 } 142 template<class View> 143 forceinline bool 144 MeritActionSize<View>::notice(void) const { 145 return true; 146 } 147 template<class View> 148 forceinline void 149 MeritActionSize<View>::dispose(Space&) { 150 action.~Action(); 151 } 152 153 // CHB over size merit 154 template<class View> 155 forceinline 156 MeritCHBSize<View>::MeritCHBSize 157 (Space& home, const VarBranch<typename MeritCHBSize<View>::Var>& vb) 158 : MeritBase<View,double>(home,vb), chb(vb.chb()) {} 159 template<class View> 160 forceinline 161 MeritCHBSize<View>::MeritCHBSize(Space& home, MeritCHBSize& m) 162 : MeritBase<View,double>(home,m), chb(m.chb) {} 163 template<class View> 164 forceinline double 165 MeritCHBSize<View>::operator ()(const Space&, View x, int i) { 166 return chb[i] / static_cast<double>(x.size()); 167 } 168 template<class View> 169 forceinline bool 170 MeritCHBSize<View>::notice(void) const { 171 return true; 172 } 173 template<class View> 174 forceinline void 175 MeritCHBSize<View>::dispose(Space&) { 176 chb.~CHB(); 177 } 178 179 // Minimum regret merit 180 template<class View> 181 forceinline 182 MeritRegretMin<View>::MeritRegretMin 183 (Space& home, const VarBranch<typename MeritRegretMin<View>::Var>& vb) 184 : MeritBase<View,unsigned int>(home,vb) {} 185 template<class View> 186 forceinline 187 MeritRegretMin<View>::MeritRegretMin(Space& home, MeritRegretMin& m) 188 : MeritBase<View,unsigned int>(home,m) {} 189 template<class View> 190 forceinline unsigned int 191 MeritRegretMin<View>::operator ()(const Space&, View x, int) { 192 return x.regret_min(); 193 } 194 195 // Maximum regret merit 196 template<class View> 197 forceinline 198 MeritRegretMax<View>::MeritRegretMax 199 (Space& home, const VarBranch<typename MeritRegretMax<View>::Var>& vb) 200 : MeritBase<View,unsigned int>(home,vb) {} 201 template<class View> 202 forceinline 203 MeritRegretMax<View>::MeritRegretMax(Space& home, MeritRegretMax& m) 204 : MeritBase<View,unsigned int>(home,m) {} 205 template<class View> 206 forceinline unsigned int 207 MeritRegretMax<View>::operator ()(const Space&, View x, int) { 208 return x.regret_max(); 209 } 210 211}}} 212 213// STATISTICS: int-branch