3 import numpy.linalg
as npl
6 This file implements a sparse linear problem (quadric cost, linear constraints -- LCQP) 7 where the decision variables are denoted by x=(x1 ... xn), n being the number of factors. 8 The problem can be written: 9 min Sum_i=1^p || A_i x - b_i ||^2 12 so that forall j=1:q C_j x = d_i 14 Matrices A_i and C_j are block sparse, i.e. they are acting only on some (few) of the variables 17 The file implements the main class FactorGraph, which stores the LCQP problem and solve it. 18 It also provides a secondary class Factor, used to set up FactorGraph 24 A factor is a part of a linear constraint corresponding either a cost ||A x - b|| or 26 In both cases, we have Ax = sum A_i x_i, where some A_i are null. One object of class 27 Factor stores one of the A_i, along with the correspond <i> index. It is simply a pair 30 This class is used as a arguments of some of the setup functions of FactorGraph. 39 The class FactorGraph stores a block-sparse linear-constrained quadratic program (LCQP) 40 of variable x=(x1...xn). The size of the problem is set up at construction of the object. 41 Methods add_factor() and add_factor_constraint() are used to set up the problem. 42 Method solve() is used to compute the solution to the problem. 46 Initialize a QP sparse problem as min || A x - b || so that C x = d 47 where x = (x1, .., xn), and dim(xi) = variableSize and n = nbVariables 48 After construction, A, b, C and d are allocated and set to 0. 50 self.
nx = variableSize
59 Internal function: not designed to be called by the user. 60 Create a factor matrix [ A1 0 A2 0 A3 ... ] where the Ai's are placed at 61 the indexes of the factors. 63 assert(len(factors) > 0)
64 nr = factors[0].matrix.shape[0]
69 for factor
in factors:
70 assert(factor.matrix.shape == (nr, self.
nx))
71 A[:, self.
nx * factor.index:self.
nx * (factor.index + 1)] = factor.matrix
76 Add a factor || sum_{i} factor[i].matrix * x_{factor[i].index} - reference || 81 self.
b = np.vstack([self.
b, reference])
85 Add a factor sum_{i} factor[i].matrix * x_{factor[i].index} = reference 90 self.
d = np.vstack([self.
d, reference])
94 Implement a LCQP solver, with numerical threshold eps. 96 Cp = npl.pinv(self.
C, eps)
98 P =
eye(self.
nx * self.
N) - Cp * self.
C 99 xopt += npl.pinv(self.
A * P, eps) * (self.
b - self.
A * xopt)
def __init__(self, index, matrix)
def matrix_form_factor(self, factors)
def solve(self, eps=1e-8)
def __init__(self, variableSize, nbVariables)
def add_factor(self, factors, reference)
def add_factor_constraint(self, factors, reference)