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); }
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); }