-
Notifications
You must be signed in to change notification settings - Fork 10
/
dempstershafer.hpp
213 lines (206 loc) · 7.72 KB
/
dempstershafer.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
/*
* Dempster-Shafer Library for Evidence-Theory
* Thilo Michael, Jeffrey Jedele
* 2012
* > library, definition
*/
#include <list>
#include <set>
#include <bitset>
/*
* The MAX_HYPOTHESESES constant determines how many hypotheseses can be contained in the universe.
*/
#define MAX_HYPOTHESESES 64
using namespace std;
class DempsterShaferUniverse;
class Evidence;
typedef struct {
double mass;
bitset<MAX_HYPOTHESESES> items;
} FocalSet;
/**
* This class represents the basic collection of all hypotheses and is used to
* create evidences using them.
*/
class DempsterShaferUniverse {
private:
void* hypotheseses[MAX_HYPOTHESESES];
int last_hypothesis_number;
public:
/**
* Simple Constructor
*/
DempsterShaferUniverse();
/**
* Adds a set of pointers to arbitrary objects as hypotheseses. All other methods will
* need and return the same pointers that are added here.
*
* @param hypotheseses A reference to a set of pointers to arbitrary hypothesis objects.
* @throws 1 if more hypotheseses than allowed by MAX_HYPOTHESESES are added
*/
void add_hypotheseses(set<void*>& hypotheseses);
/**
* Adds a set of pointers to arbitrary objects as hypotheseses. All other methods will
* need and return the same pointers that are added here.
*
* This var-arg version is a convenience wrapper for better readability when using hard-coded
* sets.
*
* @param hypothesis A list of pointers to arbitary hypothesis objects. The list MUST be terminated
* with NULL as sentinel value.
*/
void add_hypotheseses(void* hypothesis, ...);
/**
* Creates and returns a new Evidence object. The sets must be added using the returned object.
* @return The new Evidence.
*/
Evidence add_evidence();
/**
* Translates a set of hypotheseses to the internally used bitset representation.
* This can be used to save performance when the same set of hypotheseses is used several times.
*
* @param members A reference to a set of hypothesis-pointers.
* @return The bitset with MAX_HYPOTHESESES positions.
*/
bitset<MAX_HYPOTHESESES> bitset_representation(set<void*>& members);
/**
* Translates a set of hypotheseses to the internally used bitset representation.
* This can be used to save performance when the same set of hypotheseses is used several times.
*
* @param member A variable length list of hypothesis-pointers. MUST be terminated with NULL.
* @return The bitset with MAX_HYPOTHESESES positions.
*/
bitset<MAX_HYPOTHESESES> bitset_representation(void* member, ...);
friend class Evidence;
};
/**
* This class represents a Evidence and is linked to the DempsterShaferUniverse it was created with.
* All relevant operations are performed with these Evidence objects.
*/
class Evidence {
private:
DempsterShaferUniverse *universe;
list<FocalSet> focal_sets;
Evidence(DempsterShaferUniverse *universe);
void add_focal_set(FocalSet set);
public:
/**
* Add a set of hypotheseses to the evidence and assign a mass to it.
* If not all mass is distributed to focal sets, add_omega_set() must be called to finish the evidence.
*
* @param mass The mass that is assigned to the set.
* @param members A set of hypotheseses in bitset representation. May be obtained by the bitset_representation() methods of
* DempsterShaferUniverse.
*/
void add_focal_set(double mass, bitset<MAX_HYPOTHESESES>& members);
/**
* Add a set of hypotheseses to the evidence and assign a mass to it.
* If not all mass is distributed to focal sets, add_omega_set() must be called to finish the evidence.
*
* @param mass The mass that is assigned to the set.
* @param members The set of pointers to the hypotheseses. Must be the same pointers that were added to the universe.
*/
void add_focal_set(double mass, set<void*>& members);
/**
* Add a set of hypotheseses to the evidence and assign a mass to it.
* var-arg version for convenience.
* If not all mass is distributed to focal sets, add_omega_set() must be called to finish the evidence.
*
* @param mass The mass that is assigned to the set.
* @param member A list of pointers to the hypotheseses. Must be the same pointers that were added to the universe.
* The list MUST be terminated with NULL as sentinel value.
*/
void add_focal_set(double mass, void *member, ...);
/**
* Adds the omega set to the evidence if the entire mass is not distributed already.
*/
void add_omega_set();
/**
* Overrides the & operator to combine two evidences. Conflicts are resolved automatically.
*/
Evidence operator&(Evidence& other);
/**
* Calculates the conflict between two evidences.
*
* @param other A reference to the second evidence.
* @return The calculated conflict.
*/
double conflict(Evidence& other);
/**
* Calculates the belief for a set of hypotheseses.
*
* @param members A reference to a set of hypotheseses in the internally used bitset representation. May be obtained with the
* bitset_representation() methods of DempsterShaferUniverse.
* @return The calculated belief.
*/
double belief(bitset<MAX_HYPOTHESESES>& members);
/**
* Calculates the belief for a set of hypotheseses.
*
* @param members A reference to a set of hypothesis object pointers.
* @return The calculated belief.
*/
double belief(set<void*>& members);
/**
* Calculates the belief for a list of hypotheseses.
* Var-arg version for convenience.
*
* @param member A list of pointers to hypothesis objects.
* The list must be terminated with NULL as sentinel value.
* @return The calculated belief.
*/
double belief(void *member, ...);
/**
* Calculates the plausability for a set of hypotheseses.
*
* @param members A reference to a set of hypotheses in the internally used bitset representation. My be obtained with the
* bitset_representation() mathods of DempsterShaferUniverse().
* @return The calculated plausability.
*/
double plausability(bitset<MAX_HYPOTHESESES>& members);
/**
* Calculates the plausability for a set of hypotheseses.
*
* @param members A reference to a set of hypothesis object pointers.
* @return The calculated plausability.
*/
double plausability(set<void*>& members);
/**
* Calculates the plausability for a list of hypotheseses.
* Var-arg version for convenience.
*
* @param member A list of pointers to hypothesis objects.
* The list must be terminated with NULL as sentinel value.
* @return The calculated plausability.
*/
double plausability(void *member, ...);
/**
* Searches and returns the single hypothesis with the largest belief.
* If several hypotheseses with the same belief are found, an arbitrary one is returned.
*
* @return A pointer to the most believable hypothesis object.
*/
void* most_believable();
/**
* Searches and returns the single hypothesis with the largest plausability.
* If several hypotheseses with the same plausability are found, an arbitrary one is returned.
*
* @return A pointer to the most plausible hypothesis object.
*/
void* most_plausible();
/**
* Searches and returns the single hypothesis with the largest belief.
* If several hypotheseses with the same belief are found, the one with the highest plausability is returned.
*
* @return A pointer to the hypothesis object selected like described above.
*/
void* best_match();
/**
* Prints a human readable representation of the evidence to the standard output.
*
* @param hypothesis_to_string A pointer to a function that receives a pointer to a hypothesis object and returns
* a string representation for it.
*/
void pretty_print(string (*hypothesis_to_string)(void *element));
friend class DempsterShaferUniverse;
};