SEP Solver Library  1.0
 All Classes Namespaces Files Functions Variables Typedefs Macros
CGStep.cpp
Go to the documentation of this file.
1 #include "CGStep.h"
2 #include "math.h"
3 #include <iostream>
4 #include <algorithm>
5 
7  // create s=0 same size as mod
8  // create ss=0 same size as data
9 
10  s.clone(&mod);
11  s.zeroElement();
12 
13  ss.clone(&data);
14  ss.zeroElement();
15 }
16 
17 bool SEP::CGStep::Step(int iter, Vector &m, Vector &g, Vector &rr, Vector &gg, double &res, bool verbose){
18 
23 
24  double alpha,beta=0,small=1e-20; // building array size 10 here?
25 
26  double gg_gg= (gg).innerProd(gg);
27  double gg_rr=-(gg).innerProd(rr);
28 
29  if(iter==0){
30  alpha = gg_rr/gg_gg;
31  if(fabs(gg_gg) < small){
32  fprintf(stderr,"Zero dot product in first CG step %g %g\n",gg_gg,gg_rr);
33  return false;
34  }
35  }
36  else{
37  double ss_ss=(ss).innerProd(ss);
38  double gg_ss=(gg).innerProd(ss);
39  if(fabs(gg_gg) < small || fabs(ss_ss) < small){
40  fprintf(stderr,"Zero dot product in CG step %g %g / %g %g \n",gg_gg,gg_rr,ss_ss,gg_ss);
41  return false;
42  }
43 
44  double determ=gg_gg*ss_ss*std::max( 1.-(gg_ss/gg_gg)*(gg_ss/ss_ss) , 1e-12 );
45  double ss_rr=-(ss).innerProd(rr);
46  alpha = (ss_ss*gg_rr - gg_ss*ss_rr)/determ;
47  beta = (-gg_ss*gg_rr + gg_gg*ss_rr)/determ;
48  }
49 
50  if(verbose){
51  std::cout << "iter: " << iter << " , alpha = " << alpha << ", beta = " << beta << "\n";
52  }
53 
54  (s).linearCombo(beta,g,alpha); //Update solution step alpha*g+beta*s
55  (ss).linearCombo(beta,gg,alpha); //Update residual step
56 
57  (m).linearCombo(1.0,s,1.0); //Update solution
58  (rr).linearCombo(1.0,ss,1.0); //Update residual
59 
60  res = (rr).innerProd(rr);
61 
62  return true;
63 
64 }