Generated on Wed Sep 5 2012 18:51:47 for Gecode by doxygen 1.8.1.1
view-base.hpp
Go to the documentation of this file.
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  * Last modified:
10  * $Date: 2011-08-29 22:59:24 +1000 (Mon, 29 Aug 2011) $ by $Author: schulte $
11  * $Revision: 12359 $
12  *
13  * This file is part of Gecode, the generic constraint
14  * development environment:
15  * http://www.gecode.org
16  *
17  * Permission is hereby granted, free of charge, to any person obtaining
18  * a copy of this software and associated documentation files (the
19  * "Software"), to deal in the Software without restriction, including
20  * without limitation the rights to use, copy, modify, merge, publish,
21  * distribute, sublicense, and/or sell copies of the Software, and to
22  * permit persons to whom the Software is furnished to do so, subject to
23  * the following conditions:
24  *
25  * The above copyright notice and this permission notice shall be
26  * included in all copies or substantial portions of the Software.
27  *
28  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35  *
36  */
37 
38 namespace Gecode { namespace Int { namespace Count {
39 
40  template<class VX, class VY, class VZ>
43  ViewArray<VX>& x0, VY y0, VZ z0, int c0)
44  : Propagator(home), x(x0), y(y0), z(z0), c(c0) {
45  if (vtd(y) == VTD_INTSET)
46  home.notice(*this,AP_DISPOSE);
47  x.subscribe(home,*this,PC_INT_DOM);
48  subscribe(home,*this,y);
49  z.subscribe(home,*this,PC_INT_BND);
50  }
51 
52  template<class VX, class VY, class VZ>
55  : Propagator(home,share,p), c(p.c) {
56  x.update(home,share,p.x);
57  y.update(home,share,p.y);
58  z.update(home,share,p.z);
59  }
60 
61  template<class VX, class VY, class VZ>
62  PropCost
64  return PropCost::linear(PropCost::LO,x.size()+1);
65  }
66 
67  template<class VX, class VY, class VZ>
68  forceinline size_t
70  if (vtd(y) == VTD_INTSET)
71  home.ignore(*this,AP_DISPOSE);
72  x.cancel(home,*this,PC_INT_DOM);
73  cancel(home,*this,y);
74  z.cancel(home,*this,PC_INT_BND);
75  (void) Propagator::dispose(home);
76  return sizeof(*this);
77  }
78 
79  template<class VX, class VY, class VZ>
80  forceinline void
82  int n = x.size();
83  for (int i=n; i--; )
84  switch (holds(x[i],y)) {
85  case RT_FALSE:
86  x[i].cancel(home,*this,PC_INT_DOM); x[i]=x[--n];
87  break;
88  case RT_TRUE:
89  x[i].cancel(home,*this,PC_INT_DOM); x[i]=x[--n];
90  c--;
91  break;
92  case RT_MAYBE:
93  break;
94  default:
96  }
97  x.size(n);
98  }
99 
100  template<class VX, class VY, class VZ>
101  forceinline int
103  return -c;
104  }
105 
106  template<class VX, class VY, class VZ>
107  forceinline int
109  return x.size()-c;
110  }
111 
112  template<class VX>
113  forceinline bool
114  shared(const IntSet&, VX) {
115  return false;
116  }
117  template<class VX, class VY, class VZ>
118  forceinline bool
120  const VY& y, const VZ& z) {
121  if (shared(y,z))
122  return true;
123  for (int i = x.size(); i--; )
124  if (shared(x[i],z))
125  return true;
126  return false;
127  }
128 
129 }}}
130 
131 // STATISTICS: int-prop