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 f113dc399809d7f0507a2a6846c1f333f4ea1256
Author: Pieter Kempeneers <kempe...@gmail.com>
Date:   Fri Jun 27 12:12:46 2014 +0200

    support for nodata in model
---
 src/apps/pkkalman.cc | 210 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 140 insertions(+), 70 deletions(-)

diff --git a/src/apps/pkkalman.cc b/src/apps/pkkalman.cc
index 61d93ef..ceb0f1b 100644
--- a/src/apps/pkkalman.cc
+++ b/src/apps/pkkalman.cc
@@ -267,7 +267,7 @@ int main(int argc,char **argv) {
        vector<double> uncertWriteBuffer(ncol);
        imgWriterEst.image2geo(0,irow,x,y);
        imgReaderModel1.geo2image(x,y,modCol,modRow);
-       assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
+       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
        try{
          imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
          //simple nearest neighbor
@@ -295,7 +295,7 @@ int main(int argc,char **argv) {
        vector<double> estReadBuffer;
        imgWriterEst.image2geo(0,irow,x,y);
        imgReaderModel1.geo2image(x,y,modCol,modRow);
-       assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
+       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
        imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
        vector<double> estWriteBuffer(ncol);
        vector<double> uncertWriteBuffer(ncol);
@@ -307,8 +307,11 @@ int main(int argc,char **argv) {
          if(imgReaderObs.isNoData(estWriteBuffer[icol])){
            imgWriterEst.image2geo(icol,irow,x,y);
            imgReaderModel1.geo2image(x,y,modCol,modRow);
-           assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
-           estWriteBuffer[icol]=estReadBuffer[modCol];
+           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+           if(imgReaderModel1.isNoData(estReadBuffer[modCol]))//if both obs 
and model are no-data, set obs to nodata
+             estWriteBuffer[icol]=obsnodata_opt[0];
+           else
+             estWriteBuffer[icol]=estReadBuffer[modCol];
            uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
          }
          else{
@@ -318,13 +321,16 @@ int main(int argc,char **argv) {
            if(uncertModel_opt[0]*stdDev+uncertObs>eps_opt[0]){
              imgWriterEst.image2geo(icol,irow,x,y);
              imgReaderModel1.geo2image(x,y,modCol,modRow);
-             assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
+             assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
              // 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[modCol]+kalmanGain*(estWriteBuffer[icol]-estReadBuffer[modCol]);
+             double kalmanGain=1;
+             if(!imgReaderModel1.isNoData(estReadBuffer[modCol])){
+               //if model is no-data, retain observation value
+               
kalmanGain=uncertModel_opt[0]*stdDev/(uncertModel_opt[0]*stdDev+uncertObs);
+               
estWriteBuffer[icol]=estReadBuffer[modCol]+kalmanGain*(estWriteBuffer[icol]-estReadBuffer[modCol]);
+             }
              uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*(1-kalmanGain);
            }
            else{
@@ -410,8 +416,10 @@ int main(int argc,char **argv) {
        input=outputstream.str();
       }
       ImgReaderGdal imgReaderEst(input);
+      imgReaderEst.setNoData(obsnodata_opt);
 
       vector<double> obsBuffer;
+      vector<double> modelBuffer;
       vector<double> uncertObsBuffer;
       vector<double> estReadBuffer;
       vector<double> uncertReadBuffer;
@@ -422,6 +430,11 @@ int main(int argc,char **argv) {
        assert(irow<imgReaderEst.nrOfRow());
        imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);
        imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
+       //read model2 in case current estimate is nodata
+       imgReaderEst.image2geo(0,irow,x,y);
+       imgReaderModel2.geo2image(x,y,modCol,modRow);
+       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+       imgReaderModel2.readData(modelBuffer,GDT_Float64,modRow,0);
        if(update){
          imgReaderObs.readData(obsBuffer,GDT_Float64,irow,0);
          if(imgReaderObs.nrOfBand()>1)
@@ -429,24 +442,39 @@ int main(int argc,char **argv) {
        }
        for(int icol=0;icol<imgWriterEst.nrOfCol();++icol){
          double estValue=estReadBuffer[icol];
-         double uncertValue=uncertReadBuffer[icol];
          //time update
-         double certNorm=(errMod*errMod+errObs*errObs);
-         double certMod=errObs*errObs/certNorm;
-         double certObs=errMod*errMod/certNorm;
-         double regTime=(c0mod+c1mod*estValue)*certMod;
-         double regSensor=(c0obs+c1obs*estValue)*certObs;
-         estWriteBuffer[icol]=regTime+regSensor;
-         double totalUncertainty=0;
-         if(errMod<eps_opt[0])
-           totalUncertainty=errObs;
-         else if(errObs<eps_opt[0])
-           totalUncertainty=errMod;
+         if(imgReaderEst.isNoData(estValue)){
+           //pk: in case we have not found any valid data yet, better here to 
take the current model value
+           imgReaderEst.image2geo(icol,irow,x,y);
+           imgReaderModel2.geo2image(x,y,modCol,modRow);
+           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+           if(imgReaderModel2.isNoData(modelBuffer[modCol])){//if both 
estimate and model are no-data, set obs to nodata
+             estWriteBuffer[icol]=obsnodata_opt[0];
+             uncertWriteBuffer[icol]=uncertNodata_opt[0];
+           }
+           else{
+             estWriteBuffer[icol]=modelBuffer[modCol];
+             uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
+           }
+         }       
          else{
-           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
-           totalUncertainty=sqrt(1.0/totalUncertainty);
+           double certNorm=(errMod*errMod+errObs*errObs);
+           double certMod=errObs*errObs/certNorm;
+           double certObs=errMod*errMod/certNorm;
+           double regTime=(c0mod+c1mod*estValue)*certMod;
+           double regSensor=(c0obs+c1obs*estValue)*certObs;
+           estWriteBuffer[icol]=regTime+regSensor;
+           double totalUncertainty=0;
+           if(errMod<eps_opt[0])
+             totalUncertainty=errObs;
+           else if(errObs<eps_opt[0])
+             totalUncertainty=errMod;
+           else{
+             totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
+             totalUncertainty=sqrt(1.0/totalUncertainty);
+           }
+           uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];
          }
-         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];
          //observation update
          if(update&&!imgReaderObs.isNoData(obsBuffer[icol])){
            double kalmanGain=1;
@@ -537,7 +565,7 @@ int main(int argc,char **argv) {
        vector<double> uncertWriteBuffer(ncol);
        imgWriterEst.image2geo(0,irow,x,y);
        imgReaderModel1.geo2image(x,y,modCol,modRow);
-       assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
+       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
        try{
          imgReaderModel1.readData(estReadBuffer,GDT_Float64,irow);
          //simple nearest neighbor
@@ -565,7 +593,7 @@ int main(int argc,char **argv) {
        vector<double> estReadBuffer;
        imgWriterEst.image2geo(0,irow,x,y);
        imgReaderModel1.geo2image(x,y,modCol,modRow);
-       assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
+       assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
        imgReaderModel1.readData(estReadBuffer,GDT_Float64,modRow);
        vector<double> estWriteBuffer(ncol);
        vector<double> uncertWriteBuffer(ncol);
@@ -577,8 +605,11 @@ int main(int argc,char **argv) {
          if(imgReaderObs.isNoData(estWriteBuffer[icol])){
            imgWriterEst.image2geo(icol,irow,x,y);
            imgReaderModel1.geo2image(x,y,modCol,modRow);
-           assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
-           estWriteBuffer[icol]=estReadBuffer[modCol];
+           assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
+           if(imgReaderModel1.isNoData(estReadBuffer[modCol]))//if both obs 
and model are no-data, set obs to nodata
+             estWriteBuffer[icol]=obsnodata_opt[0];
+           else
+             estWriteBuffer[icol]=estReadBuffer[modCol];
            uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
          }
          else{
@@ -588,13 +619,16 @@ int main(int argc,char **argv) {
            if(uncertModel_opt[0]*stdDev+uncertObs>eps_opt[0]){
              imgWriterEst.image2geo(icol,irow,x,y);
              imgReaderModel1.geo2image(x,y,modCol,modRow);
-             assert(modRow>=0||modRow<imgReaderModel1.nrOfRow());
+             assert(modRow>=0&&modRow<imgReaderModel1.nrOfRow());
              // 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[modCol]+kalmanGain*(estWriteBuffer[icol]-estReadBuffer[modCol]);
+             double kalmanGain=1;
+             if(!imgReaderModel1.isNoData(estReadBuffer[modCol])){
+               //if model is no-data, retain observation value
+               
kalmanGain=uncertModel_opt[0]*stdDev/(uncertModel_opt[0]*stdDev+uncertObs);
+               
estWriteBuffer[icol]=estReadBuffer[modCol]+kalmanGain*(estWriteBuffer[icol]-estReadBuffer[modCol]);
+             }
              uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev*(1-kalmanGain);
            }
            else{
@@ -680,8 +714,10 @@ int main(int argc,char **argv) {
        input=outputstream.str();
       }
       ImgReaderGdal imgReaderEst(input);
+      imgReaderEst.setNoData(obsnodata_opt);
 
       vector<double> obsBuffer;
+      vector<double> modelBuffer;
       vector<double> uncertObsBuffer;
       vector<double> estReadBuffer;
       vector<double> uncertReadBuffer;
@@ -692,6 +728,10 @@ int main(int argc,char **argv) {
        assert(irow<imgReaderEst.nrOfRow());
        imgReaderEst.readData(estReadBuffer,GDT_Float64,irow,0);
        imgReaderEst.readData(uncertReadBuffer,GDT_Float64,irow,1);
+       //read model2 in case current estimate is nodata
+       imgReaderEst.image2geo(0,irow,x,y);
+       imgReaderModel2.geo2image(x,y,modCol,modRow);
+       assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
        if(update){
          imgReaderObs.readData(obsBuffer,GDT_Float64,irow,0);
          if(imgReaderObs.nrOfBand()>1)
@@ -699,24 +739,39 @@ int main(int argc,char **argv) {
        }
        for(int icol=0;icol<imgWriterEst.nrOfCol();++icol){
          double estValue=estReadBuffer[icol];
-         double uncertValue=uncertReadBuffer[icol];
          //time update
-         double certNorm=(errMod*errMod+errObs*errObs);
-         double certMod=errObs*errObs/certNorm;
-         double certObs=errMod*errMod/certNorm;
-         double regTime=(c0mod+c1mod*estValue)*certMod;
-         double regSensor=(c0obs+c1obs*estValue)*certObs;
-         estWriteBuffer[icol]=regTime+regSensor;
-         double totalUncertainty=0;
-         if(errMod<eps_opt[0])
-           totalUncertainty=errObs;
-         else if(errObs<eps_opt[0])
-           totalUncertainty=errObs;
+         if(imgReaderEst.isNoData(estValue)){
+           //pk: in case we have not found any valid data yet, better here to 
take the current model value
+           imgReaderEst.image2geo(icol,irow,x,y);
+           imgReaderModel2.geo2image(x,y,modCol,modRow);
+           assert(modRow>=0&&modRow<imgReaderModel2.nrOfRow());
+           if(imgReaderModel2.isNoData(modelBuffer[modCol])){//if both 
estimate and model are no-data, set obs to nodata
+             estWriteBuffer[icol]=obsnodata_opt[0];
+             uncertWriteBuffer[icol]=uncertNodata_opt[0];
+           }
+           else{
+             estWriteBuffer[icol]=modelBuffer[modCol];
+             uncertWriteBuffer[icol]=uncertModel_opt[0]*stdDev;
+           }
+         }       
          else{
-           totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
-           totalUncertainty=sqrt(1.0/totalUncertainty);
+           double certNorm=(errMod*errMod+errObs*errObs);
+           double certMod=errObs*errObs/certNorm;
+           double certObs=errMod*errMod/certNorm;
+           double regTime=(c0mod+c1mod*estValue)*certMod;
+           double regSensor=(c0obs+c1obs*estValue)*certObs;
+           estWriteBuffer[icol]=regTime+regSensor;
+           double totalUncertainty=0;
+           if(errMod<eps_opt[0])
+             totalUncertainty=errObs;
+           else if(errObs<eps_opt[0])
+             totalUncertainty=errObs;
+           else{
+             totalUncertainty=1.0/errMod/errMod+1/errObs/errObs;
+             totalUncertainty=sqrt(1.0/totalUncertainty);
+           }
+           uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];
          }
-         uncertWriteBuffer[icol]=totalUncertainty+uncertReadBuffer[icol];
          //observation update
          if(update&&!imgReaderObs.isNoData(obsBuffer[icol])){
            double kalmanGain=1;
@@ -796,8 +851,9 @@ int main(int argc,char **argv) {
       }
       ImgReaderGdal imgReaderForward(inputfw);
       ImgReaderGdal imgReaderBackward(inputbw);
+      imgReaderForward.setNoData(obsnodata_opt);
+      imgReaderBackward.setNoData(obsnodata_opt);
     
-      vector<double> obsBuffer;
       vector<double> estForwardBuffer;
       vector<double> estBackwardBuffer;
       vector<double> uncertObsBuffer;
@@ -832,7 +888,7 @@ int main(int argc,char **argv) {
        imgReaderBackward.readData(uncertBackwardBuffer,GDT_Float64,irow,1);
 
        if(update){
-         imgReaderObs.readData(obsBuffer,GDT_Float64,irow,0);
+         imgReaderObs.readData(estWriteBuffer,GDT_Float64,irow,0);
          if(imgReaderObs.nrOfBand()>1)
            imgReaderObs.readData(uncertObsBuffer,GDT_Float64,irow,1);
        }
@@ -844,33 +900,47 @@ int main(int argc,char **argv) {
          double D=uncertBackwardBuffer[icol]*uncertBackwardBuffer[icol];
          double uncertObs=uncertObs_opt[0];
 
-         if(update){//check for nodata in observation
-           if(imgReaderObs.isNoData(estWriteBuffer[icol]))
-             uncertObs=uncertNodata_opt[0];
-           else if(uncertObsBuffer.size()>icol)
-             uncertObs=uncertObsBuffer[icol];
-         }
+         // if(update){//check for nodata in observation
+         //   if(imgReaderObs.isNoData(estWriteBuffer[icol]))
+         //     uncertObs=uncertNodata_opt[0];
+         //   else if(uncertObsBuffer.size()>icol)
+         //     uncertObs=uncertObsBuffer[icol];
+         // }
 
          double noemer=(C+D);
          //todo: consistently check for division by zero...
-         if(noemer<eps_opt[0]){//simple average if both uncertainties are ~>0
-           estWriteBuffer[icol]=0.5*(A+B);
-           uncertWriteBuffer[icol]=uncertObs;
+         if(imgReaderForward.isNoData(A)&&imgReaderBackward.isNoData(B)){
+           estWriteBuffer[icol]=obsnodata_opt[0];
+           uncertWriteBuffer[icol]=uncertNodata_opt[0];
+         }
+         else if(imgReaderForward.isNoData(A)){
+           estWriteBuffer[icol]=B;
+           uncertWriteBuffer[icol]=uncertBackwardBuffer[icol];
+         }
+         else if(imgReaderForward.isNoData(B)){
+           estWriteBuffer[icol]=A;
+           uncertWriteBuffer[icol]=uncertForwardBuffer[icol];
          }
          else{
-           estWriteBuffer[icol]=(A*D+B*C)/noemer;
-           double P=0;
-           if(C>eps_opt[0])
-             P+=1.0/C;
-           if(D>eps_opt[0])
-             P+=1.0/D;
-           if(uncertObs*uncertObs>eps_opt[0])
-             P-=1.0/uncertObs/uncertObs;
-           if(P>eps_opt[0])
-             P=sqrt(1.0/P);
-           else
-             P=0;
-           uncertWriteBuffer[icol]=P;
+           if(noemer<eps_opt[0]){//simple average if both uncertainties are ~>0
+             estWriteBuffer[icol]=0.5*(A+B);
+             uncertWriteBuffer[icol]=uncertObs;
+           }
+           else{
+             estWriteBuffer[icol]=(A*D+B*C)/noemer;
+             double P=0;
+             if(C>eps_opt[0])
+               P+=1.0/C;
+             if(D>eps_opt[0])
+               P+=1.0/D;
+             if(uncertObs*uncertObs>eps_opt[0])
+               P-=1.0/uncertObs/uncertObs;
+             if(P>eps_opt[0])
+               P=sqrt(1.0/P);
+             else
+               P=0;
+             uncertWriteBuffer[icol]=P;
+           }
          }
        }
        imgWriterEst.writeData(estWriteBuffer,GDT_Float64,irow,0);

-- 
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