File: LinearLeastSquares.hpp

package info (click to toggle)
libpwiz 3.0.18342-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 14,888 kB
  • sloc: cpp: 157,552; sh: 4,182; makefile: 317
file content (86 lines) | stat: -rw-r--r-- 2,431 bytes parent folder | download | duplicates (7)
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
//
// $Id$
// 
// Original author: Robert Burke <robert.burke@cshs.org>
//
// Copyright 2006 Louis Warschaw Prostate Cancer Center
//   Cedars Sinai Medical Center, Los Angeles, California  90048
//
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
//

#ifndef _LINEARLEASTSQUARES_HPP_
#define _LINEARLEASTSQUARES_HPP_


#include "pwiz/utility/misc/Export.hpp"
#include <iostream>
#include "LinearSolver.hpp"
#include "Types.hpp"

namespace pwiz {
namespace math {

enum PWIZ_API_DECL LinearLeastSquaresType {LinearLeastSquaresType_LU, LinearLeastSquaresType_QR};

template <LinearLeastSquaresType lls_type = LinearLeastSquaresType_LU>
class LinearLeastSquares;

template<>
class LinearLeastSquares<LinearLeastSquaresType_LU>
{
public:
    template<typename T>
    boost::numeric::ublas::vector<T> solve(const boost::numeric::ublas::matrix<T>& A,
                           const boost::numeric::ublas::vector<T>& y)
    {
        boost::numeric::ublas::permutation_matrix<std::size_t> m(A.size1());
        boost::numeric::ublas::matrix<T> AtA = prod(trans(A), A);
        boost::numeric::ublas::vector<T> b = y;
        boost::numeric::ublas::vector<T> r;

        // This serves as a sanity check. Note that an exception here
        // probably indicates a data file error.
        if (boost::numeric::ublas::lu_factorize(AtA, m) == 0.)
        {
            r = prod(trans(A), b);

            boost::numeric::ublas::lu_substitute(AtA, m, r);
        }

        return r;
    }
};

template<>
class LinearLeastSquares<LinearLeastSquaresType_QR>
{
public:

    template<typename T>
    boost::numeric::ublas::vector<T> solve(
        const boost::numeric::ublas::matrix<T>& A,
        const boost::numeric::ublas::vector<T>& x)
    {
        LinearSolver<LinearSolverType_QR> solver;

        boost::numeric::ublas::vector<T> y = solver.solve(A, x);

        return y;
    }
};

}
}

#endif // _LINEARLEASTSQUARES_HPP_