Changeset 11051 in ntrip for trunk/BNC/src/PPP/pppFilter.cpp


Ignore:
Timestamp:
Sep 28, 2026, 9:55:30 PM (11 hours ago)
Author:
stuerze
Message:

filter reset after exception

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/PPP/pppFilter.cpp

    r10938 r11051  
    255255    // Kalman update step
    256256    // ------------------
    257     kalman(AA, ll, PP, _QFlt, _xFlt);
     257    try {
     258      kalman(AA, ll, PP, _QFlt, _xFlt);
     259    }
     260    catch (Exception&) {
     261      logNonPosDef(_QFlt, params);
     262      throw;
     263    }
    258264
    259265    // Check Residuals
    … …  
    319325  }
    320326  return success;
     327}
     328
     329// Diagnose a Variance-Covariance Matrix that failed Cholesky decomposition
     330////////////////////////////////////////////////////////////////////////////
     331void t_pppFilter::logNonPosDef(const SymmetricMatrix& QQ,
     332                               const vector<t_pppParam*>& params) const {
     333
     334  string epoTimeStr = string(_epoTime);
     335  int nn = QQ.Nrows();
     336
     337  for (int ii = 1; ii <= nn; ii++) {
     338    double qq = QQ(ii,ii);
     339    if (!(qq > 0.0)) {
     340      LOG << epoTimeStr << " NotPosDef diag " << params[ii-1]->toString()
     341          << " Q = " << scientific << qq << fixed << endl;
     342    }
     343  }
     344
     345  // Cholesky pivots: first index where the matrix stops being positive definite
     346  // ---------------------------------------------------------------------------
     347  Matrix LL(nn, nn); LL = 0.0;
     348  for (int jj = 1; jj <= nn; jj++) {
     349    double sum = QQ(jj,jj);
     350    for (int kk = 1; kk < jj; kk++) {
     351      sum -= LL(jj,kk) * LL(jj,kk);
     352    }
     353    if (!(sum > 0.0)) {
     354      const t_pppParam* par = params[jj-1];
     355      LOG << epoTimeStr << " NotPosDef pivot " << jj << " " << par->toString()
     356          << " Q = " << scientific << QQ(jj,jj) << " pivot = " << sum
     357          << fixed << " indexOld = " << par->indexOld() << endl;
     358      for (int kk = 1; kk < jj; kk++) {
     359        double rho = QQ(jj,kk) / sqrt(QQ(jj,jj) * QQ(kk,kk));
     360        if (fabs(rho) > 0.999) {
     361          LOG << epoTimeStr << " NotPosDef   corr " << params[kk-1]->toString()
     362              << ' ' << setprecision(9) << rho << endl;
     363        }
     364      }
     365      return;
     366    }
     367    LL(jj,jj) = sqrt(sum);
     368    for (int ii = jj + 1; ii <= nn; ii++) {
     369      double hlp = QQ(ii,jj);
     370      for (int kk = 1; kk < jj; kk++) {
     371        hlp -= LL(ii,kk) * LL(jj,kk);
     372      }
     373      LL(ii,jj) = hlp / LL(jj,jj);
     374    }
     375  }
    321376}
    322377
Note: See TracChangeset for help on using the changeset viewer.