eqv.hpp
Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 00002 /* 00003 * Main authors: 00004 * Christian Schulte <schulte@gecode.org> 00005 * 00006 * Copyright: 00007 * Christian Schulte, 2004 00008 * 00009 * Last modified: 00010 * $Date: 2010-03-03 17:32:21 +0100 (Wed, 03 Mar 2010) $ by $Author: schulte $ 00011 * $Revision: 10364 $ 00012 * 00013 * This file is part of Gecode, the generic constraint 00014 * development environment: 00015 * http://www.gecode.org 00016 * 00017 * Permission is hereby granted, free of charge, to any person obtaining 00018 * a copy of this software and associated documentation files (the 00019 * "Software"), to deal in the Software without restriction, including 00020 * without limitation the rights to use, copy, modify, merge, publish, 00021 * distribute, sublicense, and/or sell copies of the Software, and to 00022 * permit persons to whom the Software is furnished to do so, subject to 00023 * the following conditions: 00024 * 00025 * The above copyright notice and this permission notice shall be 00026 * included in all copies or substantial portions of the Software. 00027 * 00028 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00029 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00030 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00031 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00032 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00033 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00034 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00035 * 00036 */ 00037 00038 namespace Gecode { namespace Int { namespace Bool { 00039 00040 template<class BVA, class BVB, class BVC> 00041 forceinline 00042 Eqv<BVA,BVB,BVC>::Eqv(Home home, BVA b0, BVB b1, BVC b2) 00043 : BoolTernary<BVA,BVB,BVC>(home,b0,b1,b2) {} 00044 00045 template<class BVA, class BVB, class BVC> 00046 forceinline 00047 Eqv<BVA,BVB,BVC>::Eqv(Space& home, bool share, Eqv<BVA,BVB,BVC>& p) 00048 : BoolTernary<BVA,BVB,BVC>(home,share,p) {} 00049 00050 template<class BVA, class BVB, class BVC> 00051 inline ExecStatus 00052 Eqv<BVA,BVB,BVC>::post(Home home, BVA b0, BVB b1, BVC b2){ 00053 switch (bool_test(b0,b1)) { 00054 case BT_SAME: 00055 GECODE_ME_CHECK(b2.one(home)); break; 00056 case BT_COMP: 00057 GECODE_ME_CHECK(b2.zero(home)); break; 00058 case BT_NONE: 00059 if (b2.one()) 00060 return Eq<BVA,BVB>::post(home,b0,b1); 00061 if (b0.one()) { 00062 if (b1.one()) { 00063 GECODE_ME_CHECK(b2.one(home)); return ES_OK; 00064 } else if (b1.zero()) { 00065 GECODE_ME_CHECK(b2.zero(home)); return ES_OK; 00066 } 00067 } 00068 if (b0.zero()) { 00069 if (b1.one()) { 00070 GECODE_ME_CHECK(b2.zero(home)); return ES_OK; 00071 } else if (b1.zero()) { 00072 GECODE_ME_CHECK(b2.one(home)); return ES_OK; 00073 } 00074 } 00075 (void) new (home) Eqv(home,b0,b1,b2); 00076 break; 00077 default: 00078 GECODE_NEVER; 00079 } 00080 return ES_OK; 00081 } 00082 00083 template<class BVA, class BVB, class BVC> 00084 Actor* 00085 Eqv<BVA,BVB,BVC>::copy(Space& home, bool share) { 00086 return new (home) Eqv<BVA,BVB,BVC>(home,share,*this); 00087 } 00088 00089 template<class BVA, class BVB, class BVC> 00090 ExecStatus 00091 Eqv<BVA,BVB,BVC>::propagate(Space& home, const ModEventDelta&) { 00092 #define GECODE_INT_STATUS(S0,S1,S2) \ 00093 ((BVA::S0<<(2*BVA::BITS))|(BVB::S1<<(1*BVB::BITS))|(BVC::S2<<(0*BVC::BITS))) 00094 switch ((x0.status() << (2*BVA::BITS)) | (x1.status() << (1*BVB::BITS)) | 00095 (x2.status() << (0*BVC::BITS))) { 00096 case GECODE_INT_STATUS(NONE,NONE,NONE): 00097 GECODE_NEVER; 00098 case GECODE_INT_STATUS(NONE,NONE,ZERO): 00099 case GECODE_INT_STATUS(NONE,NONE,ONE): 00100 case GECODE_INT_STATUS(NONE,ZERO,NONE): 00101 return ES_FIX; 00102 case GECODE_INT_STATUS(NONE,ZERO,ZERO): 00103 GECODE_ME_CHECK(x0.one_none(home)); break; 00104 case GECODE_INT_STATUS(NONE,ZERO,ONE): 00105 GECODE_ME_CHECK(x0.zero_none(home)); break; 00106 case GECODE_INT_STATUS(NONE,ONE,NONE): 00107 return ES_FIX; 00108 case GECODE_INT_STATUS(NONE,ONE,ZERO): 00109 GECODE_ME_CHECK(x0.zero_none(home)); break; 00110 case GECODE_INT_STATUS(NONE,ONE,ONE): 00111 GECODE_ME_CHECK(x0.one_none(home)); break; 00112 case GECODE_INT_STATUS(ZERO,NONE,NONE): 00113 return ES_FIX; 00114 case GECODE_INT_STATUS(ZERO,NONE,ZERO): 00115 GECODE_ME_CHECK(x1.one_none(home)); break; 00116 case GECODE_INT_STATUS(ZERO,NONE,ONE): 00117 GECODE_ME_CHECK(x1.zero_none(home)); break; 00118 case GECODE_INT_STATUS(ZERO,ZERO,NONE): 00119 GECODE_ME_CHECK(x2.one_none(home)); break; 00120 case GECODE_INT_STATUS(ZERO,ZERO,ZERO): 00121 return ES_FAILED; 00122 case GECODE_INT_STATUS(ZERO,ZERO,ONE): 00123 break; 00124 case GECODE_INT_STATUS(ZERO,ONE,NONE): 00125 GECODE_ME_CHECK(x2.zero_none(home)); break; 00126 case GECODE_INT_STATUS(ZERO,ONE,ZERO): 00127 break; 00128 case GECODE_INT_STATUS(ZERO,ONE,ONE): 00129 return ES_FAILED; 00130 case GECODE_INT_STATUS(ONE,NONE,NONE): 00131 return ES_FIX; 00132 case GECODE_INT_STATUS(ONE,NONE,ZERO): 00133 GECODE_ME_CHECK(x1.zero_none(home)); break; 00134 case GECODE_INT_STATUS(ONE,NONE,ONE): 00135 GECODE_ME_CHECK(x1.one_none(home)); break; 00136 case GECODE_INT_STATUS(ONE,ZERO,NONE): 00137 GECODE_ME_CHECK(x2.zero_none(home)); break; 00138 case GECODE_INT_STATUS(ONE,ZERO,ZERO): 00139 break; 00140 case GECODE_INT_STATUS(ONE,ZERO,ONE): 00141 return ES_FAILED; 00142 case GECODE_INT_STATUS(ONE,ONE,NONE): 00143 GECODE_ME_CHECK(x2.one_none(home)); break; 00144 case GECODE_INT_STATUS(ONE,ONE,ZERO): 00145 return ES_FAILED; 00146 case GECODE_INT_STATUS(ONE,ONE,ONE): 00147 break; 00148 default: 00149 GECODE_NEVER; 00150 } 00151 return home.ES_SUBSUMED(*this); 00152 #undef GECODE_INT_STATUS 00153 } 00154 00155 }}} 00156 00157 // STATISTICS: int-prop