this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Filip Konvicka <filip.konvicka@logis.cz> 5 * Lubomir Moric <lubomir.moric@logis.cz> 6 * Vincent Barichard <Vincent.Barichard@univ-angers.fr> 7 * 8 * Contributing authors: 9 * Christian Schulte <schulte@gecode.org> 10 * 11 * Copyright: 12 * LOGIS, s.r.o., 2008 13 * Christian Schulte, 2010 14 * Vincent Barichard, 2012 15 * 16 * This file is part of Gecode, the generic constraint 17 * development environment: 18 * http://www.gecode.org 19 * 20 * Permission is hereby granted, free of charge, to any person obtaining 21 * a copy of this software and associated documentation files (the 22 * "Software"), to deal in the Software without restriction, including 23 * without limitation the rights to use, copy, modify, merge, publish, 24 * distribute, sublicense, and/or sell copies of the Software, and to 25 * permit persons to whom the Software is furnished to do so, subject to 26 * the following conditions: 27 * 28 * The above copyright notice and this permission notice shall be 29 * included in all copies or substantial portions of the Software. 30 * 31 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 32 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 33 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 34 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 35 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 36 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 37 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 38 * 39 */ 40 41namespace Gecode { namespace Float { 42 43 /* 44 * Creation of new variable implementations 45 * 46 */ 47 48 forceinline 49 FloatVarImp::FloatVarImp(Space& home, const FloatVal& d) 50 : FloatVarImpBase(home), dom(d) {} 51 52 forceinline 53 FloatVarImp::FloatVarImp(Space& home, FloatVarImp& x) 54 : FloatVarImpBase(home, x), dom(x.dom) {} 55 56 57 /* 58 * Operations on float variable implementations 59 * 60 */ 61 62 forceinline FloatVal 63 FloatVarImp::domain(void) const { 64 return dom; 65 } 66 forceinline FloatNum 67 FloatVarImp::min(void) const { 68 return dom.min(); 69 } 70 forceinline FloatNum 71 FloatVarImp::max(void) const { 72 return dom.max(); 73 } 74 forceinline FloatVal 75 FloatVarImp::val(void) const { 76 return dom; 77 } 78 forceinline FloatNum 79 FloatVarImp::med(void) const { 80 return dom.med(); 81 } 82 83 forceinline bool 84 FloatVarImp::assigned(void) const { 85 return dom.tight(); 86 } 87 88 forceinline FloatNum 89 FloatVarImp::size(void) const { 90 return dom.size(); 91 } 92 93 94 /* 95 * Tests 96 * 97 */ 98 99 forceinline bool 100 FloatVarImp::zero_in(void) const { 101 return dom.zero_in(); 102 } 103 forceinline bool 104 FloatVarImp::in(FloatNum n) const { 105 return dom.in(n); 106 } 107 forceinline bool 108 FloatVarImp::in(const FloatVal& n) const { 109 return subset(n,dom); 110 } 111 112 113 /* 114 * Support for delta information 115 * 116 */ 117 forceinline FloatNum 118 FloatVarImp::min(const Delta& d) { 119 return static_cast<const FloatDelta&>(d).min(); 120 } 121 forceinline FloatNum 122 FloatVarImp::max(const Delta& d) { 123 return static_cast<const FloatDelta&>(d).max(); 124 } 125 126 127 /* 128 * Tell operations (to be inlined: performing bounds checks first) 129 * 130 */ 131 132 forceinline ModEvent 133 FloatVarImp::gq(Space& home, FloatNum n) { 134 if (n > dom.max()) return fail(home); 135 if ((n <= dom.min()) || assigned()) return ME_FLOAT_NONE; 136 FloatDelta d(dom.min(),n); 137 ModEvent me = ME_FLOAT_BND; 138 dom = intersect(dom,FloatVal(n,dom.max())); 139 if (assigned()) me = ME_FLOAT_VAL; 140 GECODE_ASSUME((me == ME_FLOAT_VAL) | 141 (me == ME_FLOAT_BND)); 142 return notify(home,me,d); 143 } 144 forceinline ModEvent 145 FloatVarImp::gq(Space& home, const FloatVal& n) { 146 if (n.min() > dom.max()) return fail(home); 147 if ((n.min() <= dom.min()) || assigned()) return ME_FLOAT_NONE; 148 FloatDelta d(dom.min(),n.min()); 149 ModEvent me = ME_FLOAT_BND; 150 dom = intersect(dom,FloatVal(n.min(),dom.max())); 151 if (assigned()) me = ME_FLOAT_VAL; 152 GECODE_ASSUME((me == ME_FLOAT_VAL) | 153 (me == ME_FLOAT_BND)); 154 return notify(home,me,d); 155 } 156 157 158 forceinline ModEvent 159 FloatVarImp::lq(Space& home, FloatNum n) { 160 if (n < dom.min()) return fail(home); 161 if ((n >= dom.max()) || assigned()) return ME_FLOAT_NONE; 162 FloatDelta d(n,dom.max()); 163 ModEvent me = ME_FLOAT_BND; 164 dom = intersect(dom,FloatVal(dom.min(),n)); 165 if (assigned()) me = ME_FLOAT_VAL; 166 GECODE_ASSUME((me == ME_FLOAT_VAL) | 167 (me == ME_FLOAT_BND)); 168 return notify(home,me,d); 169 } 170 forceinline ModEvent 171 FloatVarImp::lq(Space& home, const FloatVal& n) { 172 if (n.max() < dom.min()) return fail(home); 173 if ((n.max() >= dom.max()) || assigned()) return ME_FLOAT_NONE; 174 FloatDelta d(n.max(),dom.max()); 175 ModEvent me = ME_FLOAT_BND; 176 dom = intersect(dom,FloatVal(dom.min(),n.max())); 177 if (assigned()) me = ME_FLOAT_VAL; 178 GECODE_ASSUME((me == ME_FLOAT_VAL) | 179 (me == ME_FLOAT_BND)); 180 return notify(home,me,d); 181 } 182 183 184 forceinline ModEvent 185 FloatVarImp::eq(Space& home, FloatNum n) { 186 if (!dom.in(n)) 187 return fail(home); 188 if (assigned()) 189 return ME_FLOAT_NONE; 190 FloatDelta d; 191 dom = n; 192 return notify(home,ME_FLOAT_VAL,d); 193 } 194 forceinline ModEvent 195 FloatVarImp::eq(Space& home, const FloatVal& n) { 196 if (!overlap(dom,n)) 197 return fail(home); 198 if (assigned() || subset(dom,n)) 199 return ME_FLOAT_NONE; 200 FloatDelta d; 201 ModEvent me = ME_FLOAT_BND; 202 dom = intersect(dom,n); 203 if (assigned()) me = ME_FLOAT_VAL; 204 GECODE_ASSUME((me == ME_FLOAT_VAL) | 205 (me == ME_FLOAT_BND)); 206 return notify(home,me,d); 207 } 208 209 210 /* 211 * Copying a variable 212 * 213 */ 214 215 forceinline FloatVarImp* 216 FloatVarImp::copy(Space& home) { 217 return copied() ? static_cast<FloatVarImp*>(forward()) 218 : perform_copy(home); 219 } 220 221 /// Return copy of not-yet copied variable 222 forceinline FloatVarImp* 223 FloatVarImp::perform_copy(Space& home) { 224 return new (home) FloatVarImp(home, *this); 225 } 226 227 forceinline ModEventDelta 228 FloatVarImp::med(ModEvent me) { 229 return FloatVarImpBase::med(me); 230 } 231 232}} 233 234// STATISTICS: float-var