This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch upstream-master
in repository pktools.

commit fb26c6fa17998d4dd9cc6fcdc4b822faf26448d1
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Fri Jun 20 18:06:48 2014 +0200

    pkkalman with uncertainty band in observation input
---
 src/algorithms/ImgRegression.cc  |  2 +-
 src/apps/pkkalman.cc             | 64 +++++++++++++++++++++++++---------------
 src/imageclasses/ImgReaderGdal.h |  1 +
 src/imageclasses/ImgWriterGdal.h |  1 +
 4 files changed, 44 insertions(+), 24 deletions(-)

diff --git a/src/algorithms/ImgRegression.cc b/src/algorithms/ImgRegression.cc
index 8cb444d..b945206 100644
--- a/src/algorithms/ImgRegression.cc
+++ b/src/algorithms/ImgRegression.cc
@@ -78,6 +78,6 @@ double ImgRegression::getRMSE(const ImgReaderGdal& 
imgReader1, const ImgReaderGd
   double err=stat.linear_regression_err(buffer1,buffer2,c0,c1);
   
   if(verbose)
-    std::cout << "linear regression model-model based on " << buffer1.size() 
<< " points: " << c0 << "+" << c1 << " * x " << " with rmse: " << err << 
std::endl;
+    std::cout << "linear regression based on " << buffer1.size() << " points: 
" << c0 << "+" << c1 << " * x " << " with rmse: " << err << std::endl;
   return err;
 }
diff --git a/src/apps/pkkalman.cc b/src/apps/pkkalman.cc
index 0d53bcf..9d31cd9 100644
--- a/src/apps/pkkalman.cc
+++ b/src/apps/pkkalman.cc
@@ -50,8 +50,8 @@ int main(int argc,char **argv) {
   Optionpk<double> uncertModel_opt("um", "uncertmodel", "Multiply this value 
with std dev of first model image to obtain uncertainty of model",2);
   Optionpk<double> uncertObs_opt("uo", "uncertobs", "Uncertainty of valid 
observations",0);
   Optionpk<double> uncertNodata_opt("unodata", "uncertnodata", "Uncertainty in 
case of no-data values in observation", 10000);
-  Optionpk<double> regTime_opt("rt", "regtime", "Relative Weight for 
regression in time series", 0.5);
-  Optionpk<double> regSensor_opt("rs", "regsensor", "Relative Weight for 
regression in sensor series", 0.5);
+  // Optionpk<double> regTime_opt("rt", "regtime", "Relative Weight for 
regression in time series", 1.0);
+  // Optionpk<double> regSensor_opt("rs", "regsensor", "Relative Weight for 
regression in sensor series", 1.0);
   Optionpk<int> down_opt("down", "down", "Downsampling factor for reading 
model data to calculate regression", 9);
   Optionpk<string>  oformat_opt("of", "oformat", "Output image format (see 
also gdal_translate). Empty string: inherit from input image","GTiff",2);
   Optionpk<string> option_opt("co", "co", "Creation option for output file. 
Multiple options can be specified.");
@@ -75,8 +75,8 @@ int main(int argc,char **argv) {
     uncertModel_opt.retrieveOption(argc,argv);
     uncertObs_opt.retrieveOption(argc,argv);
     uncertNodata_opt.retrieveOption(argc,argv);
-    regTime_opt.retrieveOption(argc,argv);
-    regSensor_opt.retrieveOption(argc,argv);
+    // regTime_opt.retrieveOption(argc,argv);
+    // regSensor_opt.retrieveOption(argc,argv);
     down_opt.retrieveOption(argc,argv);
     verbose_opt.retrieveOption(argc,argv);
   }
@@ -187,7 +187,6 @@ int main(int argc,char **argv) {
   double c1obs=0;
   double errObs=uncertNodata_opt[0];//start with high initial value in case we 
do not have first observation at time 0
 
-  //todo: map modindex to real time (e.g., Julian day)
   vector<int> relobsindex;
   // cout << tmodel_opt << endl;
   // cout << tobservation_opt << endl;
@@ -273,10 +272,14 @@ int main(int argc,char **argv) {
            double uncertObs=uncertObs_opt[0];
            if(uncertObsBuffer.size()>icol)
              uncertObs=uncertObsBuffer[icol];
-           if(uncertObs>eps_opt[0]){
-             double noemer=uncertObs*uncertObs+stdDev*stdDev;
-             estWriteBuffer[icol]*=uncertModel_opt[0]*stdDev*stdDev/noemer;
-             
estWriteBuffer[icol]+=uncertModel_opt[0]*uncertObs*uncertObs/noemer;//todo:check!
 error?
+           if(uncertModel_opt[0]*stdDev+uncertObs>eps_opt[0]){
+             // double noemer=uncertObs*uncertObs+stdDev*stdDev;//todo: 
multiply stdDev with uncertModel_opt[0]
+             // estWriteBuffer[icol]*=uncertModel_opt[0]*stdDev*stdDev/noemer;
+             // 
estWriteBuffer[icol]+=uncertModel_opt[0]*uncertObs*uncertObs/noemer;//todo:check!
 error?
+             double 
kalmanGain=uncertModel_opt[0]*stdDev/(uncertModel_opt[0]*stdDev+uncertObs);
+             assert(kalmanGain<=1);
+             
estWriteBuffer[icol]=estReadBuffer[icol]+kalmanGain*(estWriteBuffer[icol]-estReadBuffer[icol]);
+             uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*(1-kalmanGain);
            }
            else{
              //no need to fill write buffer (already done in 
imgReaderObs.readData
@@ -329,7 +332,10 @@ int main(int argc,char **argv) {
       double c0mod=0;
       double c1mod=0;
 
-      double 
errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0mod,c1mod,verbose_opt[0]);
+      if(verbose_opt[0])
+         cout << "Calculating regression for " << 
imgReaderModel1.getFileName() << " " << imgReaderModel2.getFileName() << endl;
+      double 
errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0mod,c1mod);
+      // double 
errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0mod,c1mod,verbose_opt[0]);
 
       bool update=false;
       if(obsindex<relobsindex.size()){
@@ -343,6 +349,8 @@ int main(int argc,char **argv) {
        imgReaderObs.getGeoTransform(geotransform);
        imgReaderObs.setNoData(obsnodata_opt);
        //calculate regression between model and observation
+       if(verbose_opt[0])
+         cout << "Calculating regression for " << 
imgReaderModel1.getFileName() << " " << imgReaderObs.getFileName() << endl;
        
errObs=imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,verbose_opt[0]);
       }
       string input;
@@ -377,11 +385,9 @@ int main(int argc,char **argv) {
          double certNorm=(errMod*errMod+errObs*errObs);
          double certMod=errObs*errObs/certNorm;
          double certObs=errMod*errMod/certNorm;
-         double 
regTime=(c0mod+c1mod*estValue)*certMod*regTime_opt[0]/(regTime_opt[0]+regSensor_opt[0]);
-         double 
regSensor=(c0obs+c1obs*estValue)*certObs*regSensor_opt[0]/(regTime_opt[0]+regSensor_opt[0]);
+         double regTime=(c0mod+c1mod*estValue)*certMod;
+         double regSensor=(c0obs+c1obs*estValue)*certObs;
          estWriteBuffer[icol]=regTime+regSensor;
-         // estWriteBuffer[icol]=(c0mod+c1mod*estValue)*certMod;
-         // estWriteBuffer[icol]+=(c0obs+c1obs*estValue)*certObs;
          double totalUncertainty=0;
          if(errMod<eps_opt[0])
            totalUncertainty=errObs;
@@ -491,11 +497,20 @@ int main(int argc,char **argv) {
            double uncertObs=uncertObs_opt[0];
            if(uncertObsBuffer.size()>icol)
              uncertObs=uncertObsBuffer[icol];
-           if(uncertObs>eps_opt[0]){
-             double noemer=uncertObs*uncertObs+stdDev*stdDev;
-             estWriteBuffer[icol]*=uncertModel_opt[0]*stdDev*stdDev/noemer;
-             
estWriteBuffer[icol]+=uncertModel_opt[0]*uncertObs*uncertObs/noemer;//todo: 
check error?
+           if(uncertModel_opt[0]*stdDev+uncertObs>eps_opt[0]){
+             // double noemer=uncertObs*uncertObs+stdDev*stdDev;//todo: 
multiply stdDev with uncertModel_opt[0]
+             // estWriteBuffer[icol]*=uncertModel_opt[0]*stdDev*stdDev/noemer;
+             // 
estWriteBuffer[icol]+=uncertModel_opt[0]*uncertObs*uncertObs/noemer;//todo:check!
 error?
+             double 
kalmanGain=uncertModel_opt[0]*stdDev/(uncertModel_opt[0]*stdDev+uncertObs);
+             assert(kalmanGain<=1);
+             
estWriteBuffer[icol]=estReadBuffer[icol]+kalmanGain*(estWriteBuffer[icol]-estReadBuffer[icol]);
+             uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*(1-kalmanGain);
            }
+           // if(uncertObs>eps_opt[0]){
+           //   double noemer=uncertObs*uncertObs+stdDev*stdDev;
+           //   estWriteBuffer[icol]*=uncertModel_opt[0]*stdDev*stdDev/noemer;
+           //   
estWriteBuffer[icol]+=uncertModel_opt[0]*uncertObs*uncertObs/noemer;//todo: 
check error?
+           // }
            else{
              //no need to fill write buffer (already done in 
imgReaderObs.readData
              uncertWriteBuffer[icol]=uncertObs;
@@ -545,7 +560,10 @@ int main(int argc,char **argv) {
       double c0mod=0;
       double c1mod=0;
 
-      double 
errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0mod,c1mod,verbose_opt[0]);
+      if(verbose_opt[0])
+       cout << "Calculating regression for " << imgReaderModel1.getFileName() 
<< " " << imgReaderModel2.getFileName() << endl;
+      double 
errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0mod,c1mod);
+      // double 
errMod=imgreg.getRMSE(imgReaderModel1,imgReaderModel2,c0mod,c1mod,verbose_opt[0]);
 
       bool update=false;
       if(obsindex<relobsindex.size()){
@@ -558,6 +576,8 @@ int main(int argc,char **argv) {
        imgReaderObs.getGeoTransform(geotransform);
        imgReaderObs.setNoData(obsnodata_opt);
        //calculate regression between model and observation
+       if(verbose_opt[0])
+         cout << "Calculating regression for " << 
imgReaderModel1.getFileName() << " " << imgReaderObs.getFileName() << endl;
        
errObs=imgreg.getRMSE(imgReaderModel1,imgReaderObs,c0obs,c1obs,verbose_opt[0]);
       }
       //prediction (also to fill cloudy pixels in update mode)
@@ -595,11 +615,9 @@ int main(int argc,char **argv) {
          double certNorm=(errMod*errMod+errObs*errObs);
          double certMod=errObs*errObs/certNorm;
          double certObs=errMod*errMod/certNorm;
-         double 
regTime=(c0mod+c1mod*estValue)*certMod*regTime_opt[0]/(regTime_opt[0]+regSensor_opt[0]);
-         double 
regSensor=(c0obs+c1obs*estValue)*certObs*regSensor_opt[0]/(regTime_opt[0]+regSensor_opt[0]);
+         double regTime=(c0mod+c1mod*estValue)*certMod;
+         double regSensor=(c0obs+c1obs*estValue)*certObs;
          estWriteBuffer[icol]=regTime+regSensor;
-         // estWriteBuffer[icol]=(c0mod+c1mod*estValue)*certMod;
-         // estWriteBuffer[icol]+=(c0obs+c1obs*estValue)*certObs;
          double totalUncertainty=0;
          if(errMod<eps_opt[0])
            totalUncertainty=errObs;
diff --git a/src/imageclasses/ImgReaderGdal.h b/src/imageclasses/ImgReaderGdal.h
index 5b68630..5d4fceb 100644
--- a/src/imageclasses/ImgReaderGdal.h
+++ b/src/imageclasses/ImgReaderGdal.h
@@ -38,6 +38,7 @@ public:
   ~ImgReaderGdal(void);
   void open(const std::string& filename);//, double magicX=1, double magicY=1);
   void close(void);
+  std::string getFileName() const {return m_filename;};
   int nrOfCol(void) const { return m_ncol;};
   int nrOfRow(void) const { return m_nrow;};
   int nrOfBand(void) const { return m_nband;};
diff --git a/src/imageclasses/ImgWriterGdal.h b/src/imageclasses/ImgWriterGdal.h
index a90f586..9cfc9a0 100644
--- a/src/imageclasses/ImgWriterGdal.h
+++ b/src/imageclasses/ImgWriterGdal.h
@@ -39,6 +39,7 @@ public:
   // void open(const std::string& filename, int ncol, int nrow, int nband, 
const GDALDataType& dataType, const std::string& imageType="GTiff", const 
std::string& interleave="BAND", const std::string& compression="LZW", int 
magicX=1, int magicY=1);
   void open(const std::string& filename, int ncol, int nrow, int nband, const 
GDALDataType& dataType, const std::string& imageType, const 
std::vector<std::string>& options=std::vector<std::string>());
   void close(void);
+  std::string getFileName() const {return m_filename;};
   int nrOfCol(void) const { return m_ncol;};
   int nrOfRow(void) const { return m_nrow;};
   int nrOfBand(void) const { return m_nband;};

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-grass/pktools.git

_______________________________________________
Pkg-grass-devel mailing list
Pkg-grass-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel

Reply via email to