main page
modules
namespaces
classes
files
Gecode home
Generated on Tue Jan 28 2020 00:00:00 for Gecode by
doxygen
1.8.17
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
* Last modified:
10
* $Date: 2016-05-23 22:18:23 +0200 (Mon, 23 May 2016) $ by $Author: schulte $
11
* $Revision: 15073 $
12
*
13
* This file is part of Gecode, the generic constraint
14
* development environment:
15
* http://www.gecode.org
16
*
17
* Permission is hereby granted, free of charge, to any person obtaining
18
* a copy of this software and associated documentation files (the
19
* "Software"), to deal in the Software without restriction, including
20
* without limitation the rights to use, copy, modify, merge, publish,
21
* distribute, sublicense, and/or sell copies of the Software, and to
22
* permit persons to whom the Software is furnished to do so, subject to
23
* the following conditions:
24
*
25
* The above copyright notice and this permission notice shall be
26
* included in all copies or substantial portions of the Software.
27
*
28
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
30
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
32
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
33
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
34
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35
*
36
*/
37
38
namespace
Gecode
{
namespace
Int {
namespace
Channel {
39
40
forceinline
41
LinkMulti::LinkMulti(Home home, ViewArray<BoolView>&
x
, IntView
y
,
int
o0)
42
: MixNaryOnePropagator<BoolView,
PC_BOOL_NONE
,IntView,
PC_INT_DOM
>
43
(home,
x
,
y
),
c
(home), status(S_NONE), o(o0) {
44
x
.
subscribe
(home,*
new
(home)
Advisor
(home,*
this
,c));
45
// Propagator is scheduled because of the dependency subscription
46
}
47
48
forceinline
49
LinkMulti::LinkMulti(Space& home,
bool
share, LinkMulti&
p
)
50
: MixNaryOnePropagator<BoolView,
PC_BOOL_NONE
,IntView,
PC_INT_DOM
>
51
(home,share,
p
), status(S_NONE), o(
p
.o) {
52
assert(
p
.status == S_NONE);
53
c.update(home,share,
p
.c);
54
}
55
56
forceinline
ExecStatus
57
LinkMulti::post
(
Home
home,
ViewArray<BoolView>
&
x
,
IntView
y
,
int
o) {
58
int
n
=
x
.
size
();
59
GECODE_ME_CHECK
(
y
.
gq
(home,o));
60
GECODE_ME_CHECK
(
y
.
lq
(home,o+
n
-1));
61
assert(
n
> 0);
62
if
(
n
== 1) {
63
GECODE_ME_CHECK
(
x
[0].
one
(home));
64
assert(
y
.
val
() == o);
65
}
else
if
(
y
.
assigned
()) {
66
int
j=
y
.
val
()-o;
67
GECODE_ME_CHECK
(
x
[j].
one
(home));
68
for
(
int
i
=0;
i
<j;
i
++)
69
GECODE_ME_CHECK
(
x
[
i
].zero(home));
70
for
(
int
i
=j+1;
i
<
n
;
i
++)
71
GECODE_ME_CHECK
(
x
[
i
].zero(home));
72
}
else
{
73
for
(
int
i
=
n
;
i
--; )
74
if
(
x
[
i
].
one
()) {
75
for
(
int
j=0; j<
i
; j++)
76
GECODE_ME_CHECK
(
x
[j].zero(home));
77
for
(
int
j=
i
+1; j<
n
; j++)
78
GECODE_ME_CHECK
(
x
[j].zero(home));
79
GECODE_ME_CHECK
(
y
.
eq
(home,o+
i
));
80
return
ES_OK
;
81
}
else
if
(
x
[
i
].zero()) {
82
GECODE_ME_CHECK
(
y
.
nq
(home,o+
i
));
83
}
84
(void)
new
(home)
LinkMulti
(home,
x
,
y
,o);
85
}
86
return
ES_OK
;
87
}
88
89
}}}
90
91
// STATISTICS: int-prop
92
Gecode::MixNaryOnePropagator< BoolView, PC_BOOL_NONE, IntView, PC_INT_DOM >::y
IntView y
Single view.
Definition:
propagator.hpp:287
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:784
Gecode::y
Post propagator for SetVar SetOpType SetVar y
Definition:
set.hh:784
forceinline
#define forceinline
Definition:
config.hpp:173
Gecode::VarImpView::assigned
bool assigned(void) const
Test whether view is assigned.
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:1400
Gecode::MixNaryOnePropagator< BoolView, PC_BOOL_NONE, IntView, PC_INT_DOM >::x
ViewArray< BoolView > x
Array of views.
Definition:
propagator.hpp:285
Test::Int::Basic::i
Gecode::IntArgs i(4, 1, 2, 3, 4)
Gecode::Int::Channel::LinkMulti::post
static ExecStatus post(Home home, ViewArray< BoolView > &x, IntView y, int o)
Post propagator for .
Definition:
link-multi.hpp:57
Gecode
Gecode toplevel namespace
Gecode::Int::Channel::LinkMulti
Link propagator for multiple Boolean views.
Definition:
channel.hh:201
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:922
Gecode::Int::IntView::nq
ModEvent nq(Space &home, int n)
Restrict domain values to be different from n.
Definition:
int.hpp:151
Test::Float::Linear::one
bool one(const Gecode::FloatValArgs &a)
Check whether has only one coefficients.
Definition:
linear.cpp:50
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:1215
GECODE_ME_CHECK
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Definition:
macros.hpp:56
Gecode::Int::IntView::lq
ModEvent lq(Space &home, int n)
Restrict domain values to be less or equal than n.
Definition:
int.hpp:115
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:133
n
int n
Number of negative literals for node type.
Definition:
bool-expr.cpp:238
Gecode::Int::PC_INT_DOM
const Gecode::PropCond PC_INT_DOM
Propagate when domain changes.
Definition:
var-type.hpp:100
Gecode::ES_OK
@ ES_OK
Execution is okay.
Definition:
core.hpp:544
Gecode::Propagator::Advisor
friend class Advisor
Definition:
core.hpp:1096
p
int p
Number of positive literals for node type.
Definition:
bool-expr.cpp:236
Gecode::Int::IntView::eq
ModEvent eq(Space &home, int n)
Restrict domain values to be equal to n.
Definition:
int.hpp:160
Gecode::ExecStatus
ExecStatus
Definition:
core.hpp:540