CVC3
2.4.1
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
src
sat
minisat_varorder.h
Go to the documentation of this file.
1
/*****************************************************************************/
2
/*!
3
*\file minisat_varorder.h
4
*\brief MiniSat decision heuristics
5
*
6
* Author: Alexander Fuchs
7
*
8
* Created: Fri Sep 08 11:04:00 2006
9
*
10
* <hr>
11
*
12
* License to use, copy, modify, sell and/or distribute this software
13
* and its documentation for any purpose is hereby granted without
14
* royalty, subject to the terms and conditions defined in the \ref
15
* LICENSE file provided with this distribution.
16
*
17
* <hr>
18
*/
19
/*****************************************************************************/
20
21
/**************************************************************************************[VarOrder.h]
22
MiniSat -- Copyright (c) 2003-2005, Niklas Een, Niklas Sorensson
23
24
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
25
associated documentation files (the "Software"), to deal in the Software without restriction,
26
including without limitation the rights to use, copy, modify, merge, publish, distribute,
27
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
28
furnished to do so, subject to the following conditions:
29
30
The above copyright notice and this permission notice shall be included in all copies or
31
substantial portions of the Software.
32
33
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
34
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
35
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
36
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
37
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38
**************************************************************************************************/
39
40
#ifndef _cvc3__minisat__varorder_h_
41
#define _cvc3__minisat__varorder_h_
42
43
//=================================================================================================
44
45
#include "
minisat_types.h
"
46
#include "
minisat_heap.h
"
47
#include <iostream>
48
#include <vector>
49
50
// implements the decision heuristics by using a heap over variable ids (which are ints)
51
52
namespace
MiniSat {
53
54
struct
VarOrder_lt
{
55
const
std::vector<double>&
activity
;
56
bool
operator ()
(
Var
x,
Var
y) {
return
activity
[x] >
activity
[y]; }
57
VarOrder_lt
(
const
std::vector<double>& act) :
activity
(act) { }
58
};
59
60
class
VarOrder
{
61
const
std::vector<signed char>&
assigns
;
// var->val. Pointer to external assignment table.
62
const
std::vector<double>&
activity
;
// var->act. Pointer to external activity table.
63
Heap<VarOrder_lt>
heap
;
64
double
random_seed
;
// For the internal random number generator
65
66
public
:
67
VarOrder
(
const
std::vector<signed char>& ass,
const
std::vector<double>& act) :
68
assigns
(ass),
activity
(act),
heap
(
VarOrder_lt
(act)),
random_seed
(91648253)
69
{ }
70
71
inline
void
newVar
(
void
);
72
inline
void
newVar
(
int
varIndex);
73
inline
void
update
(
Var
x);
// Called when variable increased in activity.
74
inline
void
undo
(
Var
x);
// Called when variable is unassigned and may be selected again.
75
inline
Var
select
(
double
random_freq =.0);
// Selects a new, unassigned variable (or 'var_Undef' if none exists).
76
};
77
78
79
void
VarOrder::newVar
(
void
)
80
{
81
heap
.
setBounds
(
assigns
.size());
82
heap
.
insert
(
assigns
.size()-1);
83
}
84
85
void
VarOrder::newVar
(
int
varIndex)
86
{
87
heap
.
setBounds
(
assigns
.size());
88
heap
.
insert
(varIndex);
89
}
90
91
void
VarOrder::update
(
Var
x)
92
{
93
if
(
heap
.
inHeap
(x))
94
heap
.
increase
(x);
95
}
96
97
void
VarOrder::undo
(
Var
x)
98
{
99
if
(!
heap
.
inHeap
(x))
100
heap
.
insert
(x);
101
}
102
103
104
Var
VarOrder::select
(
double
random_var_freq)
105
{
106
// Random decision:
107
/*
108
if (drand(random_seed) < random_var_freq && !heap.empty()){
109
Var next = irand(random_seed,assigns.size());
110
111
// find var which is not undefined or in the heap
112
while (toLbool(assigns[next]) == l_Undef && !heap.inHeap(next)) {
113
next = irand(random_seed,assigns.size());
114
}
115
if (toLbool(assigns[next]) == l_Undef) {
116
return next;
117
}
118
119
// cvc does not necessarily use all variable ids without gaps,
120
// so need to check if the picked id is a valid variable.
121
//if (toLbool(assigns[next]) == l_Undef && heap.inHeap(next)) {
122
// return next;
123
//}
124
}
125
*/
126
127
// Activity based decision:
128
while
(!
heap
.
empty
()){
129
Var
next =
heap
.
getMin
();
130
if
(
toLbool
(
assigns
[next]) ==
l_Undef
)
131
return
next;
132
}
133
134
return
var_Undef
;
135
}
136
137
}
138
139
//=================================================================================================
140
#endif
Generated on Thu Jul 19 2012 08:17:23 for CVC3 by
1.8.1.1