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, 2004 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 Bool { 35 36 template<class BVA, class BVB, class BVC> 37 forceinline 38 Eqv<BVA,BVB,BVC>::Eqv(Home home, BVA b0, BVB b1, BVC b2) 39 : BoolTernary<BVA,BVB,BVC>(home,b0,b1,b2) {} 40 41 template<class BVA, class BVB, class BVC> 42 forceinline 43 Eqv<BVA,BVB,BVC>::Eqv(Space& home, Eqv<BVA,BVB,BVC>& p) 44 : BoolTernary<BVA,BVB,BVC>(home,p) {} 45 46 template<class BVA, class BVB, class BVC> 47 inline ExecStatus 48 Eqv<BVA,BVB,BVC>::post(Home home, BVA b0, BVB b1, BVC b2){ 49 switch (bool_test(b0,b1)) { 50 case BT_SAME: 51 GECODE_ME_CHECK(b2.one(home)); break; 52 case BT_COMP: 53 GECODE_ME_CHECK(b2.zero(home)); break; 54 case BT_NONE: 55 if (b2.one()) 56 return Eq<BVA,BVB>::post(home,b0,b1); 57 if (b0.one()) { 58 if (b1.one()) { 59 GECODE_ME_CHECK(b2.one(home)); return ES_OK; 60 } else if (b1.zero()) { 61 GECODE_ME_CHECK(b2.zero(home)); return ES_OK; 62 } 63 } 64 if (b0.zero()) { 65 if (b1.one()) { 66 GECODE_ME_CHECK(b2.zero(home)); return ES_OK; 67 } else if (b1.zero()) { 68 GECODE_ME_CHECK(b2.one(home)); return ES_OK; 69 } 70 } 71 (void) new (home) Eqv(home,b0,b1,b2); 72 break; 73 default: 74 GECODE_NEVER; 75 } 76 return ES_OK; 77 } 78 79 template<class BVA, class BVB, class BVC> 80 Actor* 81 Eqv<BVA,BVB,BVC>::copy(Space& home) { 82 return new (home) Eqv<BVA,BVB,BVC>(home,*this); 83 } 84 85 template<class BVA, class BVB, class BVC> 86 ExecStatus 87 Eqv<BVA,BVB,BVC>::propagate(Space& home, const ModEventDelta&) { 88#define GECODE_INT_STATUS(S0,S1,S2) \ 89 ((BVA::S0<<(2*BVA::BITS))|(BVB::S1<<(1*BVB::BITS))|(BVC::S2<<(0*BVC::BITS))) 90 switch ((x0.status() << (2*BVA::BITS)) | (x1.status() << (1*BVB::BITS)) | 91 (x2.status() << (0*BVC::BITS))) { 92 case GECODE_INT_STATUS(NONE,NONE,NONE): 93 GECODE_NEVER; 94 case GECODE_INT_STATUS(NONE,NONE,ZERO): 95 case GECODE_INT_STATUS(NONE,NONE,ONE): 96 case GECODE_INT_STATUS(NONE,ZERO,NONE): 97 return ES_FIX; 98 case GECODE_INT_STATUS(NONE,ZERO,ZERO): 99 GECODE_ME_CHECK(x0.one_none(home)); break; 100 case GECODE_INT_STATUS(NONE,ZERO,ONE): 101 GECODE_ME_CHECK(x0.zero_none(home)); break; 102 case GECODE_INT_STATUS(NONE,ONE,NONE): 103 return ES_FIX; 104 case GECODE_INT_STATUS(NONE,ONE,ZERO): 105 GECODE_ME_CHECK(x0.zero_none(home)); break; 106 case GECODE_INT_STATUS(NONE,ONE,ONE): 107 GECODE_ME_CHECK(x0.one_none(home)); break; 108 case GECODE_INT_STATUS(ZERO,NONE,NONE): 109 return ES_FIX; 110 case GECODE_INT_STATUS(ZERO,NONE,ZERO): 111 GECODE_ME_CHECK(x1.one_none(home)); break; 112 case GECODE_INT_STATUS(ZERO,NONE,ONE): 113 GECODE_ME_CHECK(x1.zero_none(home)); break; 114 case GECODE_INT_STATUS(ZERO,ZERO,NONE): 115 GECODE_ME_CHECK(x2.one_none(home)); break; 116 case GECODE_INT_STATUS(ZERO,ZERO,ZERO): 117 return ES_FAILED; 118 case GECODE_INT_STATUS(ZERO,ZERO,ONE): 119 break; 120 case GECODE_INT_STATUS(ZERO,ONE,NONE): 121 GECODE_ME_CHECK(x2.zero_none(home)); break; 122 case GECODE_INT_STATUS(ZERO,ONE,ZERO): 123 break; 124 case GECODE_INT_STATUS(ZERO,ONE,ONE): 125 return ES_FAILED; 126 case GECODE_INT_STATUS(ONE,NONE,NONE): 127 return ES_FIX; 128 case GECODE_INT_STATUS(ONE,NONE,ZERO): 129 GECODE_ME_CHECK(x1.zero_none(home)); break; 130 case GECODE_INT_STATUS(ONE,NONE,ONE): 131 GECODE_ME_CHECK(x1.one_none(home)); break; 132 case GECODE_INT_STATUS(ONE,ZERO,NONE): 133 GECODE_ME_CHECK(x2.zero_none(home)); break; 134 case GECODE_INT_STATUS(ONE,ZERO,ZERO): 135 break; 136 case GECODE_INT_STATUS(ONE,ZERO,ONE): 137 return ES_FAILED; 138 case GECODE_INT_STATUS(ONE,ONE,NONE): 139 GECODE_ME_CHECK(x2.one_none(home)); break; 140 case GECODE_INT_STATUS(ONE,ONE,ZERO): 141 return ES_FAILED; 142 case GECODE_INT_STATUS(ONE,ONE,ONE): 143 break; 144 default: 145 GECODE_NEVER; 146 } 147 return home.ES_SUBSUMED(*this); 148#undef GECODE_INT_STATUS 149 } 150 151 152 /* 153 * N-ary Boolean equivalence propagator 154 * 155 */ 156 157 forceinline 158 NaryEqv::NaryEqv(Home home, ViewArray<BoolView>& x0, int pm20) 159 : BinaryPropagator<BoolView,PC_BOOL_VAL>(home,x0[0],x0[1]), 160 x(x0), pm2(pm20) { 161 assert(x.size() >= 2); 162 x.drop_fst(2); 163 } 164 165 forceinline 166 NaryEqv::NaryEqv(Space& home, NaryEqv& p) 167 : BinaryPropagator<BoolView,PC_BOOL_VAL>(home,p), pm2(p.pm2) { 168 x.update(home,p.x); 169 } 170 171 forceinline size_t 172 NaryEqv::dispose(Space& home) { 173 (void) BinaryPropagator<BoolView,PC_BOOL_VAL>::dispose(home); 174 return sizeof(*this); 175 } 176 177 forceinline void 178 NaryEqv::resubscribe(Space& home, BoolView& x0) { 179 if (x0.assigned()) { 180 pm2 ^= x0.val(); 181 int n = x.size(); 182 for (int i=n; i--; ) 183 if (x[i].assigned()) { 184 pm2 ^= x[i].val(); 185 x[i] = x[--n]; 186 } else { 187 // Move to x0 and subscribe 188 x0=x[i]; x[i]=x[--n]; 189 x0.subscribe(home,*this,PC_BOOL_VAL,false); 190 break; 191 } 192 x.size(n); 193 } 194 } 195 196}}} 197 198// STATISTICS: int-prop