Line data Source code
1 : #include "FBCache.h"
2 : #include "FBSplitting.h"
3 : #include "FBStopping.h"
4 :
5 : #include <iostream>
6 :
7 : #define DEFAULT_MAXIT 1000
8 : #define DEFAULT_TOL 1e-6
9 :
10 0 : FBSplitting::FBSplitting(FBProblem & prob, Matrix & x0, double gamma) :
11 0 : m_cache(FBCache(prob, x0, gamma)), m_maxit(DEFAULT_MAXIT) {
12 0 : m_it = 0;
13 0 : m_prob = &prob;
14 0 : m_gamma = gamma;
15 0 : m_sc = new FBStopping(DEFAULT_TOL);
16 0 : delete_sc = true;
17 0 : }
18 :
19 0 : FBSplitting::FBSplitting(FBProblem & prob, Matrix & x0, double gamma, FBStopping & sc) :
20 0 : m_cache(FBCache(prob, x0, gamma)), m_maxit(DEFAULT_MAXIT) {
21 0 : m_it = 0;
22 0 : m_prob = &prob;
23 0 : m_gamma = gamma;
24 0 : m_sc = ≻
25 0 : delete_sc = false;
26 0 : }
27 :
28 0 : FBSplitting::FBSplitting(FBProblem & prob, Matrix & x0, double gamma, int maxit) :
29 0 : m_cache(FBCache(prob, x0, gamma)), m_maxit(maxit) {
30 0 : m_it = 0;
31 0 : m_prob = &prob;
32 0 : m_gamma = gamma;
33 0 : m_sc = new FBStopping(DEFAULT_TOL);
34 0 : delete_sc = true;
35 0 : }
36 :
37 901 : FBSplitting::FBSplitting(FBProblem & prob, Matrix & x0, double gamma, FBStopping & sc, int maxit) :
38 901 : m_cache(FBCache(prob, x0, gamma)), m_maxit(maxit) {
39 901 : m_it = 0;
40 901 : m_prob = &prob;
41 901 : m_gamma = gamma;
42 901 : m_sc = ≻
43 901 : delete_sc = false;
44 901 : }
45 :
46 53324 : int FBSplitting::iterate() {
47 53324 : m_cache.set_point(*m_cache.get_forward_backward_step(m_gamma));
48 53324 : return 0;
49 : }
50 :
51 54225 : int FBSplitting::stop() {
52 54225 : return m_sc->stop(m_cache);
53 : }
54 :
55 901 : Matrix& FBSplitting::getSolution() {
56 901 : return *m_cache.get_forward_backward_step(m_gamma);
57 : }
58 :
59 2200 : FBSplitting::~FBSplitting() {
60 900 : if (delete_sc && m_sc != NULL) {
61 0 : delete m_sc;
62 0 : m_sc = NULL;
63 : }
64 1300 : }
65 :
66 901 : int FBSplitting::run() {
67 901 : int status = ForBESUtils::STATUS_OK;
68 55126 : while (m_it < m_maxit && !stop() && !ForBESUtils::is_status_error(status)) {
69 53324 : status = iterate();
70 53324 : m_it++;
71 : }
72 901 : return status;
73 : }
74 :
75 900 : size_t FBSplitting::getIt() {
76 900 : return m_it;
77 9 : }
78 :
|