Generated on Tue Feb 11 2025 17:33:26 for Gecode by doxygen 1.12.0
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 * 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>
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>
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>
60 return PropCost::linear(PropCost::LO,x.size()+1);
61 }
62
63 template<class VX, class VY, class VZ>
64 void
66 x.reschedule(home,*this,PC_INT_DOM);
68 z.reschedule(home,*this,PC_INT_BND);
69 }
70
71 template<class VX, class VY, class VZ>
72 forceinline size_t
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
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:
100 }
101 x.size(n);
102 }
103
104 template<class VX, class VY, class VZ>
105 forceinline int
107 return -c;
108 }
109
110 template<class VX, class VY, class VZ>
111 forceinline int
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
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
int p
Number of positive literals for node type.
int n
Number of negative literals for node type.
virtual size_t dispose(Space &home)
Delete actor and return its size.
Definition core.hpp:3252
Home class for posting propagators
Definition core.hpp:856
void notice(Actor &a, ActorProperty p, bool duplicate=false)
Notice actor property.
Definition core.hpp:3219
Integer sets.
Definition int.hh:174
Base-class for count propagators (view)
Definition count.hh:266
int atleast(void) const
How many views are at least equal.
ViewArray< VX > x
Views still to count.
Definition count.hh:269
void count(Space &home)
Count how many views are equal now.
Definition view-base.hpp:85
virtual void reschedule(Space &home)
Schedule function.
Definition view-base.hpp:65
VZ z
View which yields result of counting.
Definition count.hh:273
virtual size_t dispose(Space &home)
Delete propagator and return its size.
Definition view-base.hpp:73
int atmost(void) const
How many views are at most equal.
virtual PropCost cost(const Space &home, const ModEventDelta &med) const
Cost function (defined as low linear)
Definition view-base.hpp:59
VY y
View to compare to.
Definition count.hh:271
ViewBase(Space &home, ViewBase &p)
Constructor for cloning p.
Definition view-base.hpp:50
static bool sharing(const ViewArray< VX > &x, const VY &y, const VZ &z)
Test whether there is sharing of z with x or y.
Propagation cost.
Definition core.hpp:486
static PropCost linear(PropCost::Mod m, unsigned int n)
Linear complexity for modifier pcm and size measure n.
Definition core.hpp:4796
Base-class for propagators.
Definition core.hpp:1064
Computation spaces.
Definition core.hpp:1742
View arrays.
Definition array.hpp:253
void update(Space &home, ViewArray< View > &a)
Update array to be a clone of array a.
Definition array.hpp:1328
void subscribe(Space &home, Propagator &p, PropCond pc, bool schedule=true)
Subscribe propagator p with propagation condition pc to variable.
Definition array.hpp:1341
void ignore(Actor &a, ActorProperty p, bool duplicate=false)
Ignore actor property.
Definition core.hpp:4074
int ModEventDelta
Modification event deltas.
Definition core.hpp:89
@ AP_DISPOSE
Actor must always be disposed.
Definition core.hpp:562
void cancel(Space &home, Propagator &p, VY y)
Cancel propagator p for view y.
Definition rel.hpp:87
void update(VY &y, Space &home, bool shared, VY py)
Update view y from py.
bool isintset(VY y)
Return whether y is an integer set.
Definition rel.hpp:45
void subscribe(Space &home, Propagator &p, VY y)
Subscribe propagator p to view y.
Definition rel.hpp:76
void reschedule(Space &home, Propagator &p, VY y)
Schedule propagator p for view y.
Definition rel.hpp:97
bool shared(const IntSet &, VX)
RelTest holds(VX x, VX y)
Test whether x and y are equal.
Definition rel.hpp:145
const Gecode::PropCond PC_INT_BND
Propagate when minimum or maximum of a view changes.
Definition var-type.hpp:91
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
Definition var-type.hpp:100
@ RT_TRUE
Relation does hold.
Definition view.hpp:1737
@ RT_MAYBE
Relation may hold or not.
Definition view.hpp:1736
@ RT_FALSE
Relation does not hold.
Definition view.hpp:1735
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar SetRelType SetVar z
Definition set.hh:767
Post propagator for SetVar SetOpType SetVar y
Definition set.hh:767
Post propagator for SetVar x
Definition set.hh:767
#define forceinline
Definition config.hpp:187
#define GECODE_NEVER
Assert that this command is never executed.
Definition macros.hpp:56