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
float
trigonometric
asinacos.hpp
Go to the documentation of this file.
1
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
/*
3
* Main authors:
4
* Vincent Barichard <Vincent.Barichard@univ-angers.fr>
5
*
6
* Copyright:
7
* Vincent Barichard, 2012
8
*
9
* Last modified:
10
* $Date: 2012-07-27 02:28:31 +0200 (Fri, 27 Jul 2012) $ by $Author: vbarichard $
11
* $Revision: 12968 $
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
Float {
namespace
Trigonometric {
39
40
/*
41
* Bounds consistent arc sinus operator
42
*
43
*/
44
45
template
<
class
A,
class
B>
46
forceinline
47
ASin<A,B>::ASin
(
Home
home, A x0, B x1)
48
:
MixBinaryPropagator
<A,
PC_FLOAT_BND
,B,
PC_FLOAT_BND
>(home,x0,x1) {}
49
50
template
<
class
A,
class
B>
51
ExecStatus
52
ASin<A,B>::post
(
Home
home, A x0, B x1) {
53
if
(
same
(x0,x1)) {
54
GECODE_ME_CHECK
(x0.eq(home,0.0));
55
}
else
{
56
GECODE_ME_CHECK
(x0.gq(home,-1.0));
57
GECODE_ME_CHECK
(x0.lq(home,1.0));
58
(void)
new
(home)
ASin<A,B>
(home,x0,x1);
59
}
60
return
ES_OK
;
61
}
62
63
64
template
<
class
A,
class
B>
65
forceinline
66
ASin<A,B>::ASin
(
Space
& home,
bool
share,
ASin<A,B>
&
p
)
67
:
MixBinaryPropagator
<A,
PC_FLOAT_BND
,B,
PC_FLOAT_BND
>(home,share,
p
) {}
68
69
template
<
class
A,
class
B>
70
Actor
*
71
ASin<A,B>::copy
(
Space
& home,
bool
share) {
72
return
new
(home)
ASin<A,B>
(home,share,*
this
);
73
}
74
75
template
<
class
A,
class
B>
76
ExecStatus
77
ASin<A,B>::propagate
(
Space
& home,
const
ModEventDelta
&) {
78
if
((x0.max() < -1) || (x0.min() > 1))
return
ES_FAILED
;
79
GECODE_ME_CHECK
(x1.eq(home,
asin
(x0.domain())));
80
GECODE_ME_CHECK
(x0.eq(home,
sin
(x1.domain())));
81
return
(x0.assigned() || x1.assigned()) ? home.
ES_SUBSUMED
(*
this
) :
ES_FIX
;
82
}
83
84
85
/*
86
* Bounds consistent arc cosinus operator
87
*
88
*/
89
90
template
<
class
A,
class
B>
91
forceinline
92
ACos<A,B>::ACos
(
Home
home, A x0, B x1)
93
:
MixBinaryPropagator
<A,
PC_FLOAT_BND
,B,
PC_FLOAT_BND
>(home,x0,x1) {}
94
95
template
<
class
A,
class
B>
96
ExecStatus
97
ACos<A,B>::post
(
Home
home, A x0, B x1) {
98
if
(
same
(x0,x1)) {
99
GECODE_ME_CHECK
(x0.gq(home,0.7390851332151));
100
GECODE_ME_CHECK
(x0.lq(home,0.7390851332152));
101
bool
mod
;
102
do
{
103
mod
=
false
;
104
GECODE_ME_CHECK_MODIFIED
(
mod
,x0.eq(home,
acos
(x0.val())));
105
}
while
(
mod
);
106
}
else
{
107
GECODE_ME_CHECK
(x0.gq(home,-1.0));
108
GECODE_ME_CHECK
(x0.lq(home,1.0));
109
(void)
new
(home)
ACos<A,B>
(home,x0,x1);
110
}
111
return
ES_OK
;
112
}
113
114
115
template
<
class
A,
class
B>
116
forceinline
117
ACos<A,B>::ACos
(
Space
& home,
bool
share,
ACos<A,B>
&
p
)
118
:
MixBinaryPropagator
<A,
PC_FLOAT_BND
,B,
PC_FLOAT_BND
>(home,share,
p
) {}
119
120
template
<
class
A,
class
B>
121
Actor
*
122
ACos<A,B>::copy
(
Space
& home,
bool
share) {
123
return
new
(home)
ACos<A,B>
(home,share,*
this
);
124
}
125
126
template
<
class
A,
class
B>
127
ExecStatus
128
ACos<A,B>::propagate
(
Space
& home,
const
ModEventDelta
&) {
129
if
((x0.max() < -1) || (x0.min() > 1))
return
ES_FAILED
;
130
GECODE_ME_CHECK
(x1.eq(home,
acos
(x0.domain())));
131
GECODE_ME_CHECK
(x0.eq(home,
cos
(x1.domain())));
132
return
(x0.assigned() || x1.assigned()) ? home.
ES_SUBSUMED
(*
this
) :
ES_FIX
;
133
}
134
135
}}}
136
137
// STATISTICS: float-prop
138
Gecode::Float::Trigonometric::ACos::propagate
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
Definition:
asinacos.hpp:128
forceinline
#define forceinline
Definition:
config.hpp:173
GECODE_ME_CHECK_MODIFIED
#define GECODE_ME_CHECK_MODIFIED(modified, me)
Check whether me is failed or modified, and forward failure.
Definition:
macros.hpp:68
Gecode::Space::ES_SUBSUMED
ExecStatus ES_SUBSUMED(Propagator &p)
Definition:
core.hpp:3614
Gecode::Float::PC_FLOAT_BND
const Gecode::PropCond PC_FLOAT_BND
Propagate when minimum or maximum of a view changes.
Definition:
var-type.hpp:292
Gecode::Float::Trigonometric::ACos::copy
virtual Actor * copy(Space &home, bool share)
Create copy during cloning.
Definition:
asinacos.hpp:122
Gecode::Int::BinPacking::same
bool same(const Item &i, const Item &j)
Whether two items are the same.
Definition:
propagate.hpp:76
Gecode::Float::Trigonometric::ASin::copy
virtual Actor * copy(Space &home, bool share)
Create copy during cloning.
Definition:
asinacos.hpp:71
Gecode::sin
void sin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
Definition:
trigonometric.cpp:56
Gecode::Float::Trigonometric::ACos
Propagator for bounds consistent arc cosinus operator
Definition:
trigonometric.hh:141
Gecode::Space
Computation spaces.
Definition:
core.hpp:1748
Gecode::Actor
Base-class for both propagators and branchers.
Definition:
core.hpp:696
Gecode::acos
void acos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
Definition:
trigonometric.cpp:63
Gecode
Gecode toplevel namespace
Gecode::MixBinaryPropagator
Mixed binary propagator.
Definition:
propagator.hpp:213
Gecode::Float::Trigonometric::ASin::propagate
virtual ExecStatus propagate(Space &home, const ModEventDelta &med)
Perform propagation.
Definition:
asinacos.hpp:77
Gecode::Home
Home class for posting propagators
Definition:
core.hpp:922
Gecode::Float::Trigonometric::ACos::post
static ExecStatus post(Home home, A x0, B x1)
Post propagator for .
Definition:
asinacos.hpp:97
Gecode::Float::Trigonometric::ACos::ACos
ACos(Space &home, bool share, ACos &p)
Constructor for cloning p.
Definition:
asinacos.hpp:117
Gecode::mod
void mod(Home home, IntVar x0, IntVar x1, IntVar x2, IntPropLevel ipl)
Post propagator for .
Definition:
arithmetic.cpp:267
Gecode::Float::Trigonometric::ASin::ASin
ASin(Space &home, bool share, ASin &p)
Constructor for cloning p.
Definition:
asinacos.hpp:66
Gecode::ES_FIX
@ ES_FIX
Propagation has computed fixpoint.
Definition:
core.hpp:545
Gecode::asin
void asin(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
Definition:
trigonometric.cpp:49
GECODE_ME_CHECK
#define GECODE_ME_CHECK(me)
Check whether modification event me is failed, and forward failure.
Definition:
macros.hpp:56
Gecode::Float::Trigonometric::ASin::post
static ExecStatus post(Home home, A x0, B x1)
Post propagator for .
Definition:
asinacos.hpp:52
Gecode::Float::Trigonometric::ASin
Propagator for bounds consistent arc sinus operator
Definition:
trigonometric.hh:113
Gecode::ES_FAILED
@ ES_FAILED
Execution has resulted in failure.
Definition:
core.hpp:542
Gecode::ModEventDelta
int ModEventDelta
Modification event deltas.
Definition:
core.hpp:169
Gecode::cos
void cos(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
Definition:
trigonometric.cpp:70
Gecode::ES_OK
@ ES_OK
Execution is okay.
Definition:
core.hpp:544
p
int p
Number of positive literals for node type.
Definition:
bool-expr.cpp:236
Gecode::ExecStatus
ExecStatus
Definition:
core.hpp:540