Generated on Tue Feb 11 2025 17:33:26 for Gecode by doxygen 1.12.0
pair.cpp
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, 2009
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/element.hh>
35
36namespace Gecode { namespace Int { namespace Element {
37
38 Actor*
40 return new (home) Pair(home,*this);
41 }
42
44 class PairValues {
45 private:
47 IntView x;
53 int w;
54 public:
56
57
58 PairValues(IntView x, IntView y, int w);
60
62
63
64 bool operator ()(void) const;
66 void operator ++(void);
68
70
71
72 int val(void) const;
74 };
75
78 : x(x0), xv(x0), yv(y0), w(w0) {}
79 forceinline void
81 ++xv;
82 if (!xv()) {
83 xv.init(x); ++yv;
84 }
85 }
86 forceinline bool
88 return yv();
89 }
90 forceinline int
91 PairValues::val(void) const {
92 return xv.val()+w*yv.val();
93 }
94
95
98 Region r;
99
100 if (x0.assigned()) {
101 // Bitset for supported div and mod values
102 Support::BitSet<Region> d(r,static_cast<unsigned int>((x2.max() / w)+1));
103 for (ViewValues<IntView> i(x2); i(); ++i) {
104 d.set(static_cast<unsigned int>(i.val() / w));
105 }
107 GECODE_ME_CHECK(x1.inter_v(home,id,false));
108 } else {
109 // Bitset for supported div and mod values
111 d(r,static_cast<unsigned int>((x2.max() / w)+1)),
112 m(r,static_cast<unsigned int>(w));
113 for (ViewValues<IntView> i(x2); i(); ++i) {
114 d.set(static_cast<unsigned int>(i.val() / w));
115 m.set(static_cast<unsigned int>(i.val() % w));
116 }
118 GECODE_ME_CHECK(x0.inter_v(home,im,false));
120 GECODE_ME_CHECK(x1.inter_v(home,id,false));
121 }
122
123 if (x0.assigned() && x1.assigned()) {
124 GECODE_ME_CHECK(x2.eq(home,x0.val()+w*x1.val()));
125 return home.ES_SUBSUMED(*this);
126 } else if (x1.assigned()) {
127 OffsetView x0x1w(x0,x1.val()*w);
129 ::post(home(*this),x0x1w,x2)));
130 }
131
132 PairValues xy(x0,x1,w);
133 GECODE_ME_CHECK(x2.inter_v(home,xy,false));
134
135 if (x2.assigned()) {
136 GECODE_ME_CHECK(x0.eq(home,x2.val() % w));
137 GECODE_ME_CHECK(x1.eq(home,static_cast<int>(x2.val() / w)));
138 return home.ES_SUBSUMED(*this);
139 }
140
141 return ES_NOFIX;
142 }
143
144}}}
145
146// STATISTICS: int-prop
147
Node * x
Pointer to corresponding Boolean expression node.
Value iterator for pair of iterators.
Definition pair.cpp:44
int val(void) const
Return current value.
Definition pair.cpp:91
void operator++(void)
Move iterator to next value (if possible)
Definition pair.cpp:80
bool operator()(void) const
Test whether iterator is still at a value or done.
Definition pair.cpp:87
PairValues(IntView x, IntView y, int w)
Initialize with views x and y and width w.
Definition pair.cpp:77
Pair(Space &home, Pair &p)
Constructor for cloning p.
Definition pair.hpp:64
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
Definition pair.cpp:97
static ExecStatus post(Home home, IntView x0, IntView x1, IntView x2, int w, int h)
Post propagator .
Definition pair.hpp:43
virtual Actor * copy(Space &home)
Copy propagator during cloning.
Definition pair.cpp:39
Integer view for integer variables.
Definition view.hpp:129
int min(void) const
Return minimum of domain.
Definition int.hpp:58
ModEvent inter_v(Space &home, I &i, bool depends=true)
Intersect domain with values described by i.
Definition int.hpp:201
int val(void) const
Return assigned value (only if assigned)
Definition int.hpp:70
int max(void) const
Return maximum of domain.
Definition int.hpp:62
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
Definition int.hpp:166
Offset integer view.
Definition view.hpp:443
Binary domain consistent equality propagator.
Definition rel.hh:68
Value iterator for integer views.
Definition view.hpp:94
void init(const View &x)
Initialize with values x.
Definition iter.hpp:53
int val(void) const
Return current value.
Value iterator for values in a bitset.
unsigned int id(void) const
Return propagator id.
Definition core.hpp:3542
Handle to region.
Definition region.hpp:55
Computation spaces.
Definition core.hpp:1742
void set(unsigned int i)
Set bit i.
Simple bitsets.
Definition bitset.hpp:45
bool assigned(void) const
Test whether view is assigned.
Definition view.hpp:516
ExecStatus ES_SUBSUMED(Propagator &p)
Definition core.hpp:3563
int ModEventDelta
Modification event deltas.
Definition core.hpp:89
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Definition macros.hpp:52
#define GECODE_REWRITE(prop, post)
Rewrite propagator by executing post function.
Definition macros.hpp:116
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar SetRelType r
Definition set.hh:767
Post propagator for SetVar SetOpType SetVar y
Definition set.hh:767
ExecStatus
Definition core.hpp:472
@ ES_NOFIX
Propagation has not computed fixpoint.
Definition core.hpp:475
Post propagator for SetVar x
Definition set.hh:767
#define forceinline
Definition config.hpp:187