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, 2011 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/rel.hh> 35 36namespace Gecode { namespace Int { namespace NValues { 37 38 template<class VY> 39 forceinline 40 GqBool<VY>::GqBool(Home home, int status, ViewArray<BoolView>& x, VY y) 41 : BoolBase<VY>(home,status,x,y) {} 42 43 template<class VY> 44 forceinline 45 GqBool<VY>::GqBool(Space& home, GqBool<VY>& p) 46 : BoolBase<VY>(home,p) {} 47 48 template<class VY> 49 Actor* 50 GqBool<VY>::copy(Space& home) { 51 return new (home) GqBool<VY>(home,*this); 52 } 53 54 template<class VY> 55 inline ExecStatus 56 GqBool<VY>::post(Home home, ViewArray<BoolView>& x, VY y) { 57 if (x.size() == 0) { 58 GECODE_ME_CHECK(y.lq(home,0)); 59 return ES_OK; 60 } 61 62 x.unique(); 63 64 if (x.size() == 1) { 65 GECODE_ME_CHECK(y.lq(home,1)); 66 return ES_OK; 67 } 68 69 GECODE_ME_CHECK(y.lq(home,2)); 70 71 if (y.max() <= 1) 72 return ES_OK; 73 74 if (y.min() == 2) { 75 assert(y.assigned()); 76 ViewArray<BoolView> xc(home,x); 77 return Rel::NaryNq<BoolView>::post(home,xc); 78 } 79 80 int n = x.size(); 81 int status = 0; 82 for (int i=n; i--; ) 83 if (x[i].zero()) { 84 if (status & VS_ONE) 85 return ES_OK; 86 x[i] = x[--n]; 87 status |= VS_ZERO; 88 } else if (x[i].one()) { 89 if (status & VS_ZERO) 90 return ES_OK; 91 x[i] = x[--n]; 92 status |= VS_ONE; 93 } 94 95 assert(status != (VS_ZERO | VS_ONE)); 96 if (n == 0) { 97 assert(status != 0); 98 GECODE_ME_CHECK(y.lq(home,1)); 99 return ES_OK; 100 } 101 x.size(n); 102 103 (void) new (home) GqBool<VY>(home,status,x,y); 104 return ES_OK; 105 } 106 107 template<class VY> 108 ExecStatus 109 GqBool<VY>::propagate(Space& home, const ModEventDelta&) { 110 if (status == (VS_ZERO | VS_ONE)) 111 return home.ES_SUBSUMED(*this); 112 113 if (c.empty()) { 114 assert(status != 0); 115 GECODE_ME_CHECK(y.lq(home,1)); 116 return home.ES_SUBSUMED(*this); 117 } 118 119 if (y.max() <= 1) 120 return home.ES_SUBSUMED(*this); 121 122 if (y.min() == 2) { 123 Advisors<ViewAdvisor<BoolView> > as(c); 124 assert(as()); 125 ViewAdvisor<BoolView>& a(as.advisor()); 126 ++as; 127 if (!as()) { 128 // Only a single view is left 129 if (status == VS_ZERO) { 130 GECODE_ME_CHECK(a.view().one(home)); 131 } else if (status == VS_ONE) { 132 GECODE_ME_CHECK(a.view().zero(home)); 133 } else { 134 return ES_FAILED; 135 } 136 return home.ES_SUBSUMED(*this); 137 } 138 } 139 140 return ES_FIX; 141 } 142 143}}} 144 145// STATISTICS: int-prop