added flag_bump_up_near_zero_probs_.

release/4.3a0
Vadim Indelman 2013-08-23 15:22:50 +00:00
parent ca3956adc1
commit f6402916d6
1 changed files with 36 additions and 13 deletions

View File

@ -52,6 +52,8 @@ namespace gtsam {
double prior_inlier_; double prior_inlier_;
double prior_outlier_; double prior_outlier_;
bool flag_bump_up_near_zero_probs_;
/** concept check by type */ /** concept check by type */
GTSAM_CONCEPT_LIE_TYPE(T) GTSAM_CONCEPT_LIE_TYPE(T)
GTSAM_CONCEPT_TESTABLE_TYPE(T) GTSAM_CONCEPT_TESTABLE_TYPE(T)
@ -70,7 +72,7 @@ namespace gtsam {
const double prior_inlier, const double prior_outlier) : const double prior_inlier, const double prior_outlier) :
Base(cref_list_of<2>(key1)(key2)), key1_(key1), key2_(key2), measured_(measured), Base(cref_list_of<2>(key1)(key2)), key1_(key1), key2_(key2), measured_(measured),
model_inlier_(model_inlier), model_outlier_(model_outlier), model_inlier_(model_inlier), model_outlier_(model_outlier),
prior_inlier_(prior_inlier), prior_outlier_(prior_outlier){ prior_inlier_(prior_inlier), prior_outlier_(prior_outlier), flag_bump_up_near_zero_probs_(false){
} }
virtual ~BetweenFactorEM() {} virtual ~BetweenFactorEM() {}
@ -223,6 +225,8 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
gtsam::Vector calcIndicatorProb(const gtsam::Values& x) const { gtsam::Vector calcIndicatorProb(const gtsam::Values& x) const {
bool debug = false;
Vector err = unwhitenedError(x); Vector err = unwhitenedError(x);
// Calculate indicator probabilities (inlier and outlier) // Calculate indicator probabilities (inlier and outlier)
@ -235,20 +239,31 @@ namespace gtsam {
double p_inlier = prior_inlier_ * std::sqrt(invCov_inlier.norm()) * exp( -0.5 * err_wh_inlier.dot(err_wh_inlier) ); double p_inlier = prior_inlier_ * std::sqrt(invCov_inlier.norm()) * exp( -0.5 * err_wh_inlier.dot(err_wh_inlier) );
double p_outlier = prior_outlier_ * std::sqrt(invCov_outlier.norm()) * exp( -0.5 * err_wh_outlier.dot(err_wh_outlier) ); double p_outlier = prior_outlier_ * std::sqrt(invCov_outlier.norm()) * exp( -0.5 * err_wh_outlier.dot(err_wh_outlier) );
if (debug){
std::cout<<"in calcIndicatorProb. err_unwh: "<<err[0]<<", "<<err[1]<<", "<<err[2]<<std::endl;
std::cout<<"in calcIndicatorProb. err_wh_inlier: "<<err_wh_inlier[0]<<", "<<err_wh_inlier[1]<<", "<<err_wh_inlier[2]<<std::endl;
std::cout<<"in calcIndicatorProb. err_wh_inlier.dot(err_wh_inlier): "<<err_wh_inlier.dot(err_wh_inlier)<<std::endl;
std::cout<<"in calcIndicatorProb. err_wh_outlier.dot(err_wh_outlier): "<<err_wh_outlier.dot(err_wh_outlier)<<std::endl;
std::cout<<"in calcIndicatorProb. p_inlier, p_outlier before normalization: "<<p_inlier<<", "<<p_outlier<<std::endl;
}
double sumP = p_inlier + p_outlier; double sumP = p_inlier + p_outlier;
p_inlier /= sumP; p_inlier /= sumP;
p_outlier /= sumP; p_outlier /= sumP;
// Bump up near-zero probabilities (as in linerFlow.h) if (flag_bump_up_near_zero_probs_){
double minP = 0.05; // == 0.1 / 2 indicator variables // Bump up near-zero probabilities (as in linerFlow.h)
if (p_inlier < minP || p_outlier < minP){ double minP = 0.05; // == 0.1 / 2 indicator variables
if (p_inlier < minP) if (p_inlier < minP || p_outlier < minP){
p_inlier = minP; if (p_inlier < minP)
if (p_outlier < minP) p_inlier = minP;
p_outlier = minP; if (p_outlier < minP)
sumP = p_inlier + p_outlier; p_outlier = minP;
p_inlier /= sumP; sumP = p_inlier + p_outlier;
p_outlier /= sumP; p_inlier /= sumP;
p_outlier /= sumP;
}
} }
return Vector_(2, p_inlier, p_outlier); return Vector_(2, p_inlier, p_outlier);
@ -257,8 +272,6 @@ namespace gtsam {
/* ************************************************************************* */ /* ************************************************************************* */
gtsam::Vector unwhitenedError(const gtsam::Values& x) const { gtsam::Vector unwhitenedError(const gtsam::Values& x) const {
bool debug = true;
const T& p1 = x.at<T>(key1_); const T& p1 = x.at<T>(key1_);
const T& p2 = x.at<T>(key2_); const T& p2 = x.at<T>(key2_);
@ -269,6 +282,16 @@ namespace gtsam {
return measured_.localCoordinates(hx); return measured_.localCoordinates(hx);
} }
/* ************************************************************************* */
void set_flag_bump_up_near_zero_probs(bool flag) {
flag_bump_up_near_zero_probs_ = flag;
}
/* ************************************************************************* */
bool get_flag_bump_up_near_zero_probs() const {
return flag_bump_up_near_zero_probs_;
}
/* ************************************************************************* */ /* ************************************************************************* */
/** return the measured */ /** return the measured */
const VALUE& measured() const { const VALUE& measured() const {