void DiscreteFrustum::addExample(double ground_truth, double measurement)
  {
    double mult = ground_truth / measurement;
    if(mult > MAX_MULT || mult < MIN_MULT)
      return;
  
    int idx = min(num_bins_ - 1, (int)floor(measurement / bin_depth_));
    UASSERT(idx >= 0);

    total_numerators_(idx) += ground_truth * ground_truth;
    total_denominators_(idx) += ground_truth * measurement;
    ++counts_(idx);
    multipliers_(idx) = total_numerators_(idx) / total_denominators_(idx);
  }
Example #2
0
    void floquet(size_t nVar, double* a, std::vector<double>& multipliers, VecD& evecs, VecSZ& types)
    {
      // adjust jacobian for the Poincare variable
      multipliers.resize(2*nVar);
      evecs.resize(nVar*nVar);
      VecD multipliers_(2*nVar);
      VecD evecs_(nVar*nVar);
      eigen_(int(nVar),a,&multipliers_[0],&evecs_[0]);
      
      /* sort multipliers (and corresponding eigenvectors)
	 into the following types:
	 0: real, positive, stable (<1)
	 1: real, positive, neutral (=1)
	 2: real, positive, unstable (>1)
	 3: complex, stable (modulus <1)
	 4: complex, neutral (modulus =1)
	 5: complex, unstable (modulus >1)
	 6: real, negative, stable (>-1)
	 7: real, negative, neutral (=-1)
	 8: real, negative, unstable (<-1)
      */
      
      types.resize(N_FLOQUET_TYPES,0);
      for(size_t i(0);i<nVar;++i)
	{
	  size_t base((multipliers_[nVar+i]>0||multipliers_[nVar+i]<0)?3:(multipliers_[i]>0?0:6)); // set whether positive real, complex or negative real
	  double modulus(sqrt(multipliers_[i]*multipliers_[i]+multipliers_[nVar+i]*multipliers_[nVar+i])); // set whether stable, neutral or unstable
	  size_t offset(modulus>1?2:(modulus<1?0:1)); 
	  ++types[base+offset];
	}
      
      // sort eigenvalues by ascending modulus
      VecSZ index(nVar);
      for(size_t i(0);i<nVar;++i)
	index[i]=i;
      auto compare_by_modulus= [&multipliers_,nVar](size_t i, size_t j)
	{return multipliers_[i]*multipliers_[i]+multipliers_[i+nVar]*multipliers_[i+nVar]
	 < multipliers_[j]*multipliers_[j]+multipliers_[j+nVar]*multipliers_[j+nVar];};
      std::sort(index.begin(),index.end(),compare_by_modulus);
      
      for(size_t i(0);i<nVar;++i)
	{
	  multipliers[i]=multipliers_[index[i]];
	  multipliers[i+nVar]=multipliers_[index[i]+nVar];
	  for(size_t j(0);j<nVar;++j)
	    evecs[i*nVar+j]=evecs_[index[i]*nVar+j];
	}
    }
  void DiscreteFrustum::addExample(double ground_truth, double measurement)
  {
    boost::unique_lock<boost::shared_mutex> ul(shared_mutex_);
    
    double mult = ground_truth / measurement;
    if(mult > MAX_MULT || mult < MIN_MULT)
      return;
  
    int idx = min(num_bins_ - 1, (int)floor(measurement / bin_depth_));
    assert(idx >= 0);

    total_numerators_(idx) += ground_truth * ground_truth;
    total_denominators_(idx) += ground_truth * measurement;
    ++counts_(idx);
    multipliers_(idx) = total_numerators_(idx) / total_denominators_(idx);
  }