void expectedColVecAtDivide() {
        if (_elemInd >= _genColVec.n_elem) {
          return;
        }

        _genColVec.at(_elemInd) /= _genDouble;

        cout << "- Compute expectedColVecAtDivide() ... ";
        save<double>("Col.atDivide", _genColVec);
        cout << "done." << endl;
      }
      void expectedRowsDivide() {
        for(int n = 0; n < _elemInds.n_elem; n++) {
          if(!_genColVec.in_range(_elemInds.at(n))) {
            return;
          }
        }

        cout << "- Compute expectedRowsDivide() ... ";

        _genColVec.rows(_elemInds) /= _genDouble;

        save<double>("Col.rowsDivide", _genColVec);
        cout << "done." << endl;
      }
      void expectedElemTimes() {
        for(int n = 0; n < _elemInds.n_elem; n++) {
          if(!_genColVec.in_range(_elemInds.at(n))) {
            return;
          }
        }

        cout << "- Compute expectedElemTimes() ... ";

        _genColVec.elem(_elemInds) *= _genDouble;

        save<double>("Col.elemTimes", _genColVec);
        cout << "done." << endl;
      }
      void expectedElemDivide() {
        for(int n = 0; n < _elemInds.n_elem; n++) {
          if(!_genMat.in_range(_elemInds.at(n))) {
            return;
          }
        }

        cout << "- Compute expectedElemDivide() ... ";

        _genMat.elem(_elemInds) /= _genDouble;
        save<double>("Mat.elemDivide", _genMat);

        cout << "done." << endl;
      }
      void expectedRowsElemTimes() {
        for(int n = 0; n < _elemInds.n_elem; n++) {
          if(!_genColVec.in_range(_elemInds.at(n))) {
            return;
          }
        }

        if(_genRowVec.n_elem != _elemInds.n_elem) {
          return;
        }

        cout << "- Compute expectedElemElemTimes() ... ";

        _genColVec.rows(_elemInds) %= _genRowVec;
        save<double>("Col.rowsElemTimes", _genColVec);

        cout << "done." << endl;
      }
예제 #6
0
void KeyClassifier::ClassifyKnownTauE(std::vector<KeySeq> &keys, 
                                      ZeromerModelBulk<double> &bg,
                                      Mat<double> &wellFlows,
                                      Mat<double> &refFlows,
                                      Col<double> &time,
                                      const Col<double> &incorp,
                                      double minSnr,
                                      double tauE,
                                      KeyFit &fit,
                                      TraceStore<double> &store,
                                      Mat<double> &predicted) {

  param.set_size(2);// << 0 << 0;
  param[0] = 0;
  param[1] = 0;
  fit.keyIndex = -1;
  fit.snr = 0;
  fit.sd = 0;
  fit.mad = -1;
  signal.set_size(wellFlows.n_cols);
  projSignal.set_size(wellFlows.n_cols); 
  Col<double> weights = ones<vec>(store.GetNumFrames());
  if (fit.bestKey >= 0) {
    fit.bestKey = -1;
  }
  fit.ok = -1;
  size_t frameStart = min(FRAME_START,wellFlows.n_rows);
  size_t frameEnd = min(FRAME_END,wellFlows.n_rows);
  for (size_t keyIx = 0; keyIx < keys.size(); keyIx++) {
    double keyMinSnr = std::max(minSnr, keys[keyIx].minSnr);
    double tauB = 0;
    bg.FitWell(fit.wellIdx, store, keys[keyIx], weights, mDist, mValues);
    param.at(0) = tauB;
    param.at(1) = tauE;
    onemerIncorpMad.Clear();
    onemerProjMax.Init(10);
    onemerProjMax.Clear();
    onemerSig.Clear();
    zeromerSig.Clear();
    zeroStats.Clear();
    traceSd.Clear();
    sigVar.Clear();
    onemerProj.Clear();
    for (size_t flowIx = 0; flowIx < wellFlows.n_cols; flowIx++) {
      bg.ZeromerPrediction(fit.wellIdx, flowIx, store, refFlows.unsafe_col(flowIx),p);
      double sig = 0;
      SampleStats<double> mad;
      diff = wellFlows.unsafe_col(flowIx) - p;
      for (size_t frameIx = frameStart; frameIx < frameEnd; frameIx++) {
        sig += diff.at(frameIx);
      }

      signal.at(flowIx) = sig;
      /* uvec indices;  */
      double pSig = std::numeric_limits<double>::quiet_NaN();
      if (incorp.n_rows == diff.n_rows) {
        pSig =  GetProjection(diff, incorp);
      }
      projSignal.at(flowIx) = pSig;
      sigVar.AddValue(sig);

      if (keys[keyIx].flows[flowIx] == 0) {
        for (size_t frameIx = frameStart; frameIx < frameEnd; frameIx++) {
          mad.AddValue(fabs(diff.at(frameIx)));
        }
        zeroStats.AddValue(mad.GetMean());
        zeromerSig.AddValue(sig);
      }
      else if (keys[keyIx].flows[flowIx] == 1 && flowIx < keys[keyIx].usableKeyFlows) {
        onemerSig.AddValue(sig);
        // double maxValue = 0;
        // for (size_t fIx = frameStart; fIx < frameEnd-1; fIx++) {
        //   maxValue = max(maxValue, (diff.at(fIx)+diff.at(fIx+1))/2);
        // }
        // projSignal.at(flowIx) = maxValue;
        // onemerProjMax.AddValue(maxValue);
        if (isfinite(pSig) && incorp.n_rows == p.n_rows) {
          onemerProj.AddValue(pSig);
          double maxSig = 0;
          for (size_t frameIx = frameStart; frameIx < frameEnd; frameIx++) {
            double projVal =  pSig * incorp.at(frameIx);
            maxSig = max(maxSig, projVal);
            onemerIncorpMad.AddValue(fabs(projVal - (wellFlows.at(frameIx,flowIx) - p.at(frameIx))));
          }
          onemerProjMax.AddValue(maxSig);
        }
      }
    }
    double snr = (onemerSig.GetMedian() - zeromerSig.GetMedian()) / ((onemerSig.GetIqrSd() + zeromerSig.GetIqrSd() + SDFUDGE)/2);
    float sd = sigVar.GetSD();
    if (!isfinite(sd) || isnan(sd)) {
      sd = 0;
    }
    if ((snr >= fit.snr || (isfinite(snr) && !isfinite(fit.snr))) && snr >= keyMinSnr ) {
      fit.keyIndex = keyIx;
      fit.bestKey = keyIx;
      fit.mad = zeroStats.GetMean();
      fit.snr = snr;
      fit.param = param;
      fit.sd = sd;
      fit.onemerAvg = onemerSig.GetCount() > 0 ? onemerSig.GetMedian() : std::numeric_limits<double>::quiet_NaN();
      fit.peakSig = onemerProjMax.GetCount() > 0 ? onemerProjMax.GetMedian() : std::numeric_limits<double>::quiet_NaN();
      fit.onemerProjAvg = onemerProj.GetCount() > 0 ? onemerProj.GetMean() : std::numeric_limits<double>::quiet_NaN();
      fit.projResid = onemerIncorpMad.GetCount() > 0 ? onemerIncorpMad.GetMean() : std::numeric_limits<double>::quiet_NaN();
      fit.ok = true;

      for (size_t flowIx = 0; flowIx < wellFlows.n_cols; flowIx++) {
        bg.ZeromerPrediction(fit.wellIdx, flowIx, store, refFlows.unsafe_col(flowIx),p);
        copy(p.begin(), p.end(), predicted.begin_col(flowIx));
      }
    }
    else if (keyIx == 0) { // || snr > fit.snr) { // just set default...
      fit.bestKey = keyIx;
      fit.mad = zeroStats.GetMean();
      fit.snr = snr;
      fit.param = param;
      fit.sd = sd;
      fit.onemerAvg = onemerSig.GetCount() > 0 ? onemerSig.GetMedian() : std::numeric_limits<double>::quiet_NaN();
      fit.peakSig = onemerProjMax.GetCount() > 0 ? onemerProjMax.GetMedian() : std::numeric_limits<double>::quiet_NaN();
      fit.onemerProjAvg = onemerProj.GetCount() > 0 ? onemerProj.GetMean() : std::numeric_limits<double>::quiet_NaN();
      fit.projResid = onemerIncorpMad.GetCount() > 0 ? onemerIncorpMad.GetMean() : std::numeric_limits<double>::quiet_NaN();
      fit.ok = true;

      for (size_t flowIx = 0; flowIx < wellFlows.n_cols; flowIx++) {
        bg.ZeromerPrediction(fit.wellIdx, flowIx, store, refFlows.unsafe_col(flowIx),p);
        copy(p.begin(), p.end(), predicted.begin_col(flowIx));
      }
    }

  }
  // Reset the params to the right key
  if (fit.keyIndex < 0) {
    bg.FitWell(fit.wellIdx, store, keys[0], weights, mDist, mValues);
  }
  else {
    bg.FitWell(fit.wellIdx, store, keys[fit.keyIndex], weights, mDist, mValues);
  }
  if (!isfinite(fit.mad)) {
    fit.ok = 0;
    fit.mad = std::numeric_limits<float>::max();
  }
}