00001 #ifndef LSQRINVERT_H
00002 #define LSQRINVERT_H
00003 #include "tnt_array1d.h"
00004 #include "tnt_array2d.h"
00005 #include "linalg.h"
00006
00007 using namespace TNT;
00008
00009 int LeastSquaresInvert(
00010 const Array1D<double>& data,
00011 const Array1D<double>& err,
00012 const Array2D<double> &K,
00013 Array1D<double> &m,
00014 Array2D<double> &Dm
00015 );
00016
00017 int LeastSquaresInvert(
00018 const Array1D<double>& data,
00019 const Array2D<double>& covmtx,
00020 const Array2D<double> &K,
00021 Array1D<double> &m,
00022 Array2D<double> &Dm
00023 );
00024
00025 int SVDConstrainedLeastSquaresInvert(
00026 const Array1D<double>& data,
00027 const Array1D<double>& err,
00028 const Array2D<double> &K,
00029 const Array2D<double> &C,
00030 const Array1D<double> &c,
00031 Array1D<double> &m,
00032 Array2D<double> &Dm
00033 );
00034
00035 int SVDConstrainedLeastSquaresInvert(
00036 const Array1D<double>& data,
00037 const Array2D<double>& covmtx,
00038 const Array2D<double> &K,
00039 const Array2D<double> &C,
00040 const Array1D<double> &c,
00041 Array1D<double> &m,
00042 Array2D<double> &Dm
00043 );
00044
00045 int QRConstrainedLeastSquaresInvert(
00046 const Array1D<double>& data,
00047 const Array1D<double>& err,
00048 const Array2D<double> &K,
00049 const Array2D<double> &C,
00050 const Array1D<double> &c,
00051 Array1D<double> &m,
00052 Array2D<double> &Dm
00053 );
00054
00055 int QRConstrainedLeastSquaresInvert(
00056 const Array1D<double>& data,
00057 const Array2D<double>& covmtx,
00058 const Array2D<double> &K,
00059 const Array2D<double> &C,
00060 const Array1D<double> &c,
00061 Array1D<double> &m,
00062 Array2D<double> &Dm
00063 );
00064
00065 bool compare_dim(
00066 const Array1D<double>& data,
00067 const Array1D<double>& err,
00068 const Array2D<double>& K
00069 );
00070
00071 bool compare_dim(
00072 const Array1D<double>& data,
00073 const Array2D<double>& covmtx,
00074 const Array2D<double>& K
00075 );
00076
00077 bool compare_dim(
00078 const Array1D<double>& data,
00079 const Array1D<double>& err,
00080 const Array2D<double>& K,
00081 const Array2D<double>& C,
00082 const Array1D<double>& c
00083 );
00084
00085 bool compare_dim(
00086 const Array1D<double>& data,
00087 const Array2D<double>& covmtx,
00088 const Array2D<double>& K,
00089 const Array2D<double>& C,
00090 const Array1D<double>& c
00091 );
00092
00093
00095
00096 class CLSqrInvert{
00097
00098 public:
00099 CLSqrInvert(Array2D<double> kern): useprior(false), K(kern), priorm(0),
00100 priorcovm(1,1,0.), m(0), covm(1,1,0.){}
00101 virtual ~CLSqrInvert(void){}
00102 virtual bool solve(Array1D<double> data);
00103 virtual bool solve(Array1D<double> data, Array1D<double> err);
00104 virtual bool solve(Array1D<double> data, Array2D<double> cov);
00105 Array2D<double> err2covmtx(Array1D<double> err);
00106 Array1D<double>& model(void){return m;}
00107 Array2D<double>& covmodel(void){return covm;}
00108 Array2D<double> corrmodel(void);
00109 Array1D<double> errmodel(void);
00110 void usePriorModel(Array1D<double> mprior, Array2D<double> covmprior);
00111 bool check_data_dim(const Array1D<double>& data,
00112 const Array2D<double>& covmtx,const Array2D<double>& K);
00113 bool check_prior_dim(const Array1D<double>& mprior,
00114 const Array2D<double>& covmprior,const Array2D<double>& K);
00115
00116 protected :
00117 bool useprior;
00118 Array2D<double> K;
00119 Array1D<double> priorm;
00120 Array2D<double> priorcovm;
00121 Array1D<double> m;
00122 Array2D<double> covm;
00123
00124 };
00125
00126
00129
00130 class CLSqrInvertConstrained: public CLSqrInvert{
00131
00132 public:
00133 CLSqrInvertConstrained(Array2D<double> kern, Array2D<double> cmtx,
00134 Array1D<double> cvec): CLSqrInvert(kern), conmtx(cmtx), convec(cvec){
00135 if (!check_constraint_dim(kern,cmtx,cvec)) exit(-1);
00136 }
00137 virtual ~CLSqrInvertConstrained(void){}
00138 virtual bool solve(Array1D<double> data, Array2D<double> cov)=0;
00139 bool check_constraint_dim(const Array2D<double>& K,
00140 const Array2D<double>& conmtx,const Array1D<double>& convec);
00141
00142 protected:
00143 Array2D<double> conmtx;
00144 Array1D<double> convec;
00145
00146 };
00147
00148
00151
00152 class CLSqrInvertSVDBigGauss: public CLSqrInvertConstrained{
00153
00154 public:
00155 CLSqrInvertSVDBigGauss(Array2D<double> kern, Array2D<double> cmtx,
00156 Array1D<double> cvec): CLSqrInvertConstrained(kern,cmtx,cvec){}
00157 ~CLSqrInvertSVDBigGauss(void){}
00158 bool solve(Array1D<double> data, Array2D<double> cov);
00159
00160 };
00161
00162
00165
00166 class CLSqrInvertQRBigGauss: public CLSqrInvertConstrained{
00167
00168 public:
00169 CLSqrInvertQRBigGauss(Array2D<double> kern, Array2D<double> cmtx,
00170 Array1D<double> cvec): CLSqrInvertConstrained(kern,cmtx,cvec){}
00171 ~CLSqrInvertQRBigGauss(void){}
00172 bool solve(Array1D<double> data, Array2D<double> cov);
00173
00174 };
00175
00176
00179
00180 class CLSqrInvertSVDLagrange: public CLSqrInvertConstrained{
00181
00182 public:
00183 CLSqrInvertSVDLagrange(Array2D<double> kern, Array2D<double> cmtx,
00184 Array1D<double> cvec): CLSqrInvertConstrained(kern,cmtx,cvec),lagm(0){}
00185 ~CLSqrInvertSVDLagrange(void){}
00186 bool solve(Array1D<double> data, Array2D<double> cov);
00187 Array1D<double> lagrange_multipliers(void){return lagm;}
00188 protected:
00189 Array1D<double> lagm;
00190 };
00191
00192
00195
00196 class CLSqrInvertQRLagrange: public CLSqrInvertConstrained{
00197
00198 public:
00199 CLSqrInvertQRLagrange(Array2D<double> kern, Array2D<double> cmtx,
00200 Array1D<double> cvec): CLSqrInvertConstrained(kern,cmtx,cvec),lagm(0){}
00201 ~CLSqrInvertQRLagrange(void){}
00202 bool solve(Array1D<double> data, Array2D<double> cov);
00203 Array1D<double> lagrange_multipliers(void){return lagm;}
00204 protected:
00205 Array1D<double> lagm;
00206
00207 };
00208
00209 #endif