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, 2003 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 namespace Gecode { namespace Int { namespace Count { 35 36 template<class VX, class VY, class VZ> 37 forceinline ViewBase(Home home,ViewArray<VX> & x0,VY y0,VZ z0,int c0)38 ViewBase<VX,VY,VZ>::ViewBase(Home home, 39 ViewArray<VX>& x0, VY y0, VZ z0, int c0) 40 : Propagator(home), x(x0), y(y0), z(z0), c(c0) { 41 if (isintset(y)) 42 home.notice(*this,AP_DISPOSE); 43 x.subscribe(home,*this,PC_INT_DOM); 44 subscribe(home,*this,y); 45 z.subscribe(home,*this,PC_INT_BND); 46 } 47 48 template<class VX, class VY, class VZ> 49 forceinline ViewBase(Space & home,ViewBase<VX,VY,VZ> & p)50 ViewBase<VX,VY,VZ>::ViewBase(Space& home, ViewBase<VX,VY,VZ>& p) 51 : Propagator(home,p), c(p.c) { 52 x.update(home,p.x); 53 update(y,home,p.y); 54 z.update(home,p.z); 55 } 56 57 template<class VX, class VY, class VZ> 58 PropCost cost(const Space &,const ModEventDelta &) const59 ViewBase<VX,VY,VZ>::cost(const Space&, const ModEventDelta&) const { 60 return PropCost::linear(PropCost::LO,x.size()+1); 61 } 62 63 template<class VX, class VY, class VZ> 64 void reschedule(Space & home)65 ViewBase<VX,VY,VZ>::reschedule(Space& home) { 66 x.reschedule(home,*this,PC_INT_DOM); 67 Gecode::Int::Count::reschedule(home,*this,y); 68 z.reschedule(home,*this,PC_INT_BND); 69 } 70 71 template<class VX, class VY, class VZ> 72 forceinline size_t dispose(Space & home)73 ViewBase<VX,VY,VZ>::dispose(Space& home) { 74 if (isintset(y)) 75 home.ignore(*this,AP_DISPOSE); 76 x.cancel(home,*this,PC_INT_DOM); 77 cancel(home,*this,y); 78 z.cancel(home,*this,PC_INT_BND); 79 (void) Propagator::dispose(home); 80 return sizeof(*this); 81 } 82 83 template<class VX, class VY, class VZ> 84 forceinline void count(Space & home)85 ViewBase<VX,VY,VZ>::count(Space& home) { 86 int n = x.size(); 87 for (int i=n; i--; ) 88 switch (holds(x[i],y)) { 89 case RT_FALSE: 90 x[i].cancel(home,*this,PC_INT_DOM); x[i]=x[--n]; 91 break; 92 case RT_TRUE: 93 x[i].cancel(home,*this,PC_INT_DOM); x[i]=x[--n]; 94 c--; 95 break; 96 case RT_MAYBE: 97 break; 98 default: 99 GECODE_NEVER; 100 } 101 x.size(n); 102 } 103 104 template<class VX, class VY, class VZ> 105 forceinline int atleast(void) const106 ViewBase<VX,VY,VZ>::atleast(void) const { 107 return -c; 108 } 109 110 template<class VX, class VY, class VZ> 111 forceinline int atmost(void) const112 ViewBase<VX,VY,VZ>::atmost(void) const { 113 return x.size()-c; 114 } 115 116 template<class VX> 117 forceinline bool shared(const IntSet &,VX)118 shared(const IntSet&, VX) { 119 return false; 120 } 121 template<class VX, class VY, class VZ> 122 forceinline bool sharing(const ViewArray<VX> & x,const VY & y,const VZ & z)123 ViewBase<VX,VY,VZ>::sharing(const ViewArray<VX>& x, 124 const VY& y, const VZ& z) { 125 if (shared(y,z)) 126 return true; 127 for (int i=0; i<x.size(); i++) 128 if (shared(x[i],z)) 129 return true; 130 return false; 131 } 132 133 }}} 134 135 // STATISTICS: int-prop 136