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, 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
34namespace Gecode { namespace Int { namespace Count {
35
36 template<class VX, class VY, class VZ>
37 forceinline
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
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
59 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
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
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
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
106 ViewBase<VX,VY,VZ>::atleast(void) const {
107 return -c;
108 }
109
110 template<class VX, class VY, class VZ>
111 forceinline int
112 ViewBase<VX,VY,VZ>::atmost(void) const {
113 return x.size()-c;
114 }
115
116 template<class VX>
117 forceinline bool
118 shared(const IntSet&, VX) {
119 return false;
120 }
121 template<class VX, class VY, class VZ>
122 forceinline bool
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