forked from andre-martins/AD3
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathfactor_graph.pyx
More file actions
155 lines (121 loc) · 5.38 KB
/
factor_graph.pyx
File metadata and controls
155 lines (121 loc) · 5.38 KB
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
from libcpp.vector cimport vector
from libcpp cimport bool
# get the classes from the c++ headers
cdef extern from "../ad3/Factor.h" namespace "AD3":
cdef cppclass BinaryVariable:
BinaryVariable()
double GetLogPotential()
void SetLogPotential(double log_potential)
cdef cppclass Factor:
Factor()
cdef extern from "../ad3/MultiVariable.h" namespace "AD3":
cdef cppclass MultiVariable:
int GetNumStates()
double GetLogPotential(int i)
void SetLogPotential(int i, double log_potential)
cdef extern from "../ad3/FactorGraph.h" namespace "AD3":
cdef cppclass FactorGraph:
FactorGraph()
void SetVerbosity(int verbosity)
void SetEtaAD3(double eta)
void AdaptEtaAD3(bool adapt)
void SetMaxIterationsAD3(int max_iterations)
void FixMultiVariablesWithoutFactors()
int SolveLPMAPWithAD3(vector[double]* posteriors,
vector[double]* additional_posteriors,
double* value)
int SolveExactMAPWithAD3(vector[double] *posteriors,
vector[double] *additional_posteriors,
double *value)
BinaryVariable * CreateBinaryVariable()
MultiVariable * CreateMultiVariable(int num_states)
Factor * CreateFactorDense(vector[MultiVariable*] multi_variables,
vector[double] additional_log_potentials,
bool owned_by_graph)
# wrap them into python extension types
cdef class PBinaryVariable:
cdef BinaryVariable *thisptr
def __cinit__(self, allocate=True):
if allocate:
self.thisptr = new BinaryVariable()
def __dealloc__(self):
del self.thisptr
def get_log_potential(self):
return self.thisptr.GetLogPotential()
def set_log_potential(self, double log_potential):
self.thisptr.SetLogPotential(log_potential)
cdef class PMultiVariable:
cdef MultiVariable *thisptr
cdef bool allocate
def __cinit__(self, allocate=True):
self.allocate = allocate
if allocate:
self.thisptr = new MultiVariable()
def __dealloc__(self):
if self.allocate:
del self.thisptr
def get_log_potential(self, int i):
return self.thisptr.GetLogPotential(i)
def set_log_potential(self, int i, double log_potential):
self.thisptr.SetLogPotential(i, log_potential)
cdef class PFactorGraph:
cdef FactorGraph *thisptr
def __cinit__(self):
self.thisptr = new FactorGraph()
def __dealloc__(self):
del self.thisptr
def set_verbosity(self, int verbosity):
self.thisptr.SetVerbosity(verbosity)
def create_multi_variable(self, int num_states):
cdef MultiVariable * mult = self.thisptr.CreateMultiVariable(num_states)
pmult = PMultiVariable(allocate=False)
pmult.thisptr = mult
return pmult
def fix_multi_variables_without_factors(self):
self.thisptr.FixMultiVariablesWithoutFactors()
def set_eta_ad3(self, double eta):
self.thisptr.SetEtaAD3(eta)
def adapt_eta_ad3(self, bool adapt):
self.thisptr.AdaptEtaAD3(adapt)
def set_max_iterations_ad3(self, int max_iterations):
self.thisptr.SetMaxIterationsAD3(max_iterations)
def solve_lp_map_ad3(self):
cdef vector[double] posteriors
cdef vector[double] additional_posteriors
cdef double value
cdef int solver_status
solver_status = self.thisptr.SolveLPMAPWithAD3(&posteriors,
&additional_posteriors,
&value)
p_posteriors, p_additional_posteriors = [], []
cdef size_t i
for i in range(posteriors.size()):
p_posteriors.append(posteriors[i])
for i in range(additional_posteriors.size()):
p_additional_posteriors.append(additional_posteriors[i])
return value, p_posteriors, p_additional_posteriors, solver_status
def solve_exact_map_ad3(self):
cdef vector[double] posteriors
cdef vector[double] additional_posteriors
cdef double value
cdef int solver_status
solver_status = self.thisptr.SolveExactMAPWithAD3(&posteriors,
&additional_posteriors,
&value)
p_posteriors, p_additional_posteriors = [], []
cdef size_t i
for i in range(posteriors.size()):
p_posteriors.append(posteriors[i])
for i in range(additional_posteriors.size()):
p_additional_posteriors.append(additional_posteriors[i])
return value, p_posteriors, p_additional_posteriors, solver_status
def create_factor_dense(self, p_multi_variables, p_additional_log_potentials, bool owned_by_graph=True):
cdef vector[MultiVariable*] multi_variables
cdef PMultiVariable blub
for var in p_multi_variables:
blub = var
multi_variables.push_back(<MultiVariable*>blub.thisptr)
cdef vector[double] additional_log_potentials
for potential in p_additional_log_potentials:
additional_log_potentials.push_back(potential)
self.thisptr.CreateFactorDense(multi_variables, additional_log_potentials, owned_by_graph)