Generated on Tue Feb 11 2025 17:33:26 for Gecode by doxygen 1.12.0
common.hpp
Go to the documentation of this file.
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2/*
3 * Main authors:
4 * Guido Tack <tack@gecode.org>
5 * Christian Schulte <schulte@gecode.org>
6 *
7 * Contributing authors:
8 * Gabor Szokoli <szokoli@gecode.org>
9 *
10 * Copyright:
11 * Guido Tack, 2004
12 * Christian Schulte, 2004
13 * Gabor Szokoli, 2004
14 *
15 * This file is part of Gecode, the generic constraint
16 * development environment:
17 * http://www.gecode.org
18 *
19 * Permission is hereby granted, free of charge, to any person obtaining
20 * a copy of this software and associated documentation files (the
21 * "Software"), to deal in the Software without restriction, including
22 * without limitation the rights to use, copy, modify, merge, publish,
23 * distribute, sublicense, and/or sell copies of the Software, and to
24 * permit persons to whom the Software is furnished to do so, subject to
25 * the following conditions:
26 *
27 * The above copyright notice and this permission notice shall be
28 * included in all copies or substantial portions of the Software.
29 *
30 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
31 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
32 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
33 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
34 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
35 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
36 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
37 *
38 */
39
40namespace Gecode { namespace Set { namespace Sequence {
41
42 inline ExecStatus
43 propagateSeq(Space& home, bool& modified, bool& assigned,
45 int lastElem = x.size()-1;
46 int cur_max = BndSet::MAX_OF_EMPTY;
47 int cur_min = BndSet::MIN_OF_EMPTY;
48
49 Region r;
51
52 for (int i=0; i<lastElem; i++) {
53 if (x[i].glbSize() > 0)
54 cur_max = std::max(cur_max, x[i].glbMax());
55 if (x[i].cardMin() > 0)
56 cur_max = std::max(cur_max, x[i].lubMinN(x[i].cardMin()-1));
57 if (cur_max >= Limits::min)
59 x[i+1].exclude(home, Limits::min,
60 cur_max),
61 assigned);
62
63 if (x[lastElem-i].lubSize() > 0) {
64 cur_min = std::min(cur_min, x[lastElem-i].glbMin());
65 if (x[lastElem-i].cardMin() > 0) {
66 // Compute n-th largest element in x[lastElem-i].lub
67 // for n = x[lastElem-i].cardMin()-1
68 int maxN = BndSet::MAX_OF_EMPTY;
69 int j=0;
70 for (LubRanges<SetView> ubr(x[lastElem-i]); ubr(); ++ubr, ++j) {
71 ub[2*j]=ubr.min(); ub[2*j+1]=ubr.max();
72 }
73 unsigned int xcm = x[lastElem-i].cardMin()-1;
74 while (j--) {
75 unsigned int width = static_cast<unsigned int>(ub[2*j+1]-ub[2*j]+1);
76 if (width > xcm) {
77 maxN = static_cast<int>(ub[2*j+1]-xcm);
78 break;
79 }
80 xcm -= width;
81 }
82 cur_min = std::min(cur_min, maxN);
83 }
84 }
85 if (Limits::max>=cur_min)
87 x[lastElem-i-1].exclude(home, cur_min,
89 assigned);
90 }
91 return ES_NOFIX;
92 }
93
94}}}
95
96// STATISTICS: set-prop
Handle to region.
Definition region.hpp:55
unsigned int cardMin(void) const
Return cardinality minimum.
Definition set.hpp:78
static const int MAX_OF_EMPTY
Returned by empty sets when asked for their maximum element.
Definition var-imp.hpp:110
static const int MIN_OF_EMPTY
Returned by empty sets when asked for their minimum element.
Definition var-imp.hpp:112
Range iterator for the least upper bound.
Definition var-imp.hpp:317
Computation spaces.
Definition core.hpp:1742
Array with arbitrary number of elements.
View arrays.
Definition array.hpp:253
const int min
Smallest allowed integer value.
Definition int.hh:118
const int max
Largest allowed integer value.
Definition int.hh:116
ModEvent exclude(Space &home, View &x, int s)
Prune view x to exclude all values from s.
Definition set-op.hpp:137
ExecStatus propagateSeq(Space &home, bool &modified, bool &assigned, ViewArray< SetView > &x)
Definition common.hpp:43
Gecode toplevel namespace
Post propagator for SetVar SetOpType SetVar SetRelType r
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 GECODE_SET_ME_CHECK_VAL_B(modified, tell, f)
Definition common.hpp:45