main page
modules
namespaces
classes
files
Gecode home
Generated on Mon Jul 27 2020 00:00:00 for Gecode by
doxygen
1.8.18
gecode
int
channel
link-multi.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, 2007
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
namespace
Gecode
{
namespace
Int {
namespace
Channel {
35
36
forceinline
37
LinkMulti::LinkMulti(Home home, ViewArray<BoolView>&
x
, IntView
y
,
int
o0)
38
: MixNaryOnePropagator<BoolView,
PC_BOOL_NONE
,IntView,
PC_INT_DOM
>
39
(home,
x
,
y
),
c
(home), status(S_NONE), o(o0) {
40
x
.
subscribe
(home,*
new
(home)
Advisor
(home,*
this
,c));
41
// Propagator is scheduled because of the dependency subscription
42
}
43
44
forceinline
45
LinkMulti::LinkMulti(Space& home, LinkMulti&
p
)
46
: MixNaryOnePropagator<BoolView,
PC_BOOL_NONE
,IntView,
PC_INT_DOM
>
47
(home,
p
), status(S_NONE), o(
p
.o) {
48
assert(
p
.status == S_NONE);
49
c.update(home,
p
.c);
50
}
51
52
forceinline
ExecStatus
53
LinkMulti::post
(
Home
home,
ViewArray<BoolView>
&
x
,
IntView
y
,
int
o) {
54
int
n
=
x
.
size
();
55
GECODE_ME_CHECK
(
y
.
gq
(home,o));
56
GECODE_ME_CHECK
(
y
.
lq
(home,o+
n
-1));
57
assert(
n
> 0);
58
if
(
n
== 1) {
59
GECODE_ME_CHECK
(
x
[0].
one
(home));
60
assert(
y
.
val
() == o);
61
}
else
if
(
y
.
assigned
()) {
62
int
j=
y
.
val
()-o;
63
GECODE_ME_CHECK
(
x
[j].
one
(home));
64
for
(
int
i
=0;
i
<j;
i
++)
65
GECODE_ME_CHECK
(
x
[
i
].zero(home));
66
for
(
int
i
=j+1;
i
<
n
;
i
++)
67
GECODE_ME_CHECK
(
x
[
i
].zero(home));
68
}
else
{
69
for
(
int
i
=0;
i
<
n
;
i
++)
70
if
(
x
[
i
].
one
()) {
71
for
(
int
j=0; j<
i
; j++)
72
GECODE_ME_CHECK
(
x
[j].zero(home));
73
for
(
int
j=
i
+1; j<
n
; j++)
74
GECODE_ME_CHECK
(
x
[j].zero(home));
75
GECODE_ME_CHECK
(
y
.
eq
(home,o+
i
));
76
return
ES_OK
;
77
}
else
if
(
x
[
i
].zero()) {
78
GECODE_ME_CHECK
(
y
.
nq
(home,o+
i
));
79
}
80
(void)
new
(home)
LinkMulti
(home,
x
,
y
,o);
81
}
82
return
ES_OK
;
83
}
84
85
}}}
86
87
// STATISTICS: int-prop
88
Gecode::MixNaryOnePropagator< BoolView, PC_BOOL_NONE, IntView, PC_INT_DOM >::y
IntView y
Single view.
Definition:
pattern.hpp:277
Gecode::Int::PC_BOOL_NONE
const Gecode::PropCond PC_BOOL_NONE
Propagation condition to be ignored (convenience)
Definition:
var-type.hpp:118
Gecode::x
Post propagator for SetVar x
Definition:
set.hh:767
Gecode::y
Post propagator for SetVar SetOpType SetVar y
Definition:
set.hh:767
Gecode::VarImpView::assigned
bool assigned(void) const
Test whether view is assigned.
Definition:
view.hpp:516
Gecode::ViewArray::subscribe
void subscribe(Space &home, Propagator &p, PropCond pc, bool schedule=true)
Subscribe propagator p with propagation condition pc to variable.
Definition:
array.hpp:1341
Gecode::MixNaryOnePropagator< BoolView, PC_BOOL_NONE, IntView, PC_INT_DOM >::x
ViewArray< BoolView > x
Array of views.
Definition:
pattern.hpp:275
Gecode::Int::Channel::LinkMulti::post
static ExecStatus post(Home home, ViewArray< BoolView > &x, IntView y, int o)
Post propagator for .
Definition:
link-multi.hpp:53
Gecode
Gecode toplevel namespace
Gecode::Int::Channel::LinkMulti
Link propagator for multiple Boolean views.
Definition:
channel.hh:198
Gecode::Int::IntView::val
int val(void) const
Return assigned value (only if assigned)
Definition:
int.hpp:70
Gecode::Home
Home class for posting propagators
Definition:
core.hpp:856
Gecode::Int::IntView::nq
ModEvent nq(Space &home, int n)
Restrict domain values to be different from n.
Definition:
int.hpp:157
Test::Float::Linear::one
bool one(const Gecode::FloatValArgs &a)
Check whether has only one coefficients.
Definition:
linear.cpp:46
Gecode::Int::IntView
Integer view for integer variables.
Definition:
view.hpp:129
Gecode::ViewArray::size
int size(void) const
Return size of array (number of elements)
Definition:
array.hpp:1156
forceinline
#define forceinline
Definition:
config.hpp:185
GECODE_ME_CHECK
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Definition:
macros.hpp:52
Gecode::Int::IntView::lq
ModEvent lq(Space &home, int n)
Restrict domain values to be less or equal than n.
Definition:
int.hpp:121
Test::Float::Arithmetic::c
Gecode::FloatVal c(-8, 8)
Gecode::ViewArray< BoolView >
Gecode::Int::IntView::gq
ModEvent gq(Space &home, int n)
Restrict domain values to be greater or equal than n.
Definition:
int.hpp:139
n
int n
Number of negative literals for node type.
Definition:
bool-expr.cpp:234
Gecode::Int::PC_INT_DOM
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
Definition:
var-type.hpp:100
Test::Int::Basic::i
Gecode::IntArgs i({1, 2, 3, 4})
Gecode::ES_OK
@ ES_OK
Execution is okay.
Definition:
core.hpp:476
Gecode::Propagator::Advisor
friend class Advisor
Definition:
core.hpp:1068
p
int p
Number of positive literals for node type.
Definition:
bool-expr.cpp:232
Gecode::Int::IntView::eq
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
Definition:
int.hpp:166
Gecode::ExecStatus
ExecStatus
Definition:
core.hpp:472