1 #include <MathAlgo/COSAC.hh>
2 #include "MeanDoubleRANSACEvaluator.hh"
3 #include "TestMeanDoubleHelper.hh"
10 const double max_outlier_fraction = 0.5;
12 void DebugOut(
const unsigned t,
const unsigned num_data,
13 const unsigned num_outliers,
const double sigma3,
14 const int ret_val_solve_master,
const vector<double> &data,
15 const vector<bool> >_inliers,
const double gt_mean,
16 const double &est_mean,
const unsigned est_num_inliers,
17 const double &score,
const double &max_score);
19 int main(
int argc,
char *argv[])
23 const unsigned min_sample_size =
26 const unsigned num_tries = 1000;
27 for (
unsigned t=0; t<num_tries; t++){
30 const unsigned min_num_outliers = (unsigned)floor(0.1*(
double)num_data);
31 unsigned max_num_outliers =
32 (unsigned)floor(max_outlier_fraction*(
double)num_data);
33 if (num_data>=min_sample_size && max_num_outliers+min_sample_size>num_data){
34 max_num_outliers = num_data-min_sample_size;
36 const unsigned num_outliers =
41 vector<bool> gt_inliers, est_inliers;
42 double gt_mean, est_mean;
44 cout <<
"------------ "<<t<<
" -------------\n";
49 cout <<
" "<<num_data<<
" samples ("<<num_outliers<<
" outliers)\n"
50 <<
" mean: "<<gt_mean<<
" \tsigma3: "<<sigma3<<endl;
52 double inlying_data_fraction =
53 1.0 - ((double)num_outliers / (
double)num_data) - 0.01;
54 const double max_score = 100.0;
58 mdch.
Init(data, sigma3);
60 cout<<
"Error:"<<ex.
What()<<endl;
68 cosac.AddDebugLevel(
"D_COSAC_GetSolution");
70 int res = cosac.SolveMaster(inlying_data_fraction, max_score, est_mean,
71 est_inliers, num_inliers, score);
73 if (num_data < min_sample_size){
74 if (res != COSAC_NOT_ENOUGH_MEASUREMENTS){
75 cerr <<
"\n----\ntry "<<t<<
": ";
76 cerr <<
"invalid return value ("<< res
77 <<
") when not enough measurements are present\n";
82 DebugOut(t, num_data, num_outliers, sigma3, res, data, gt_inliers,
83 gt_mean, est_mean, num_inliers, score, max_score);
90 cout <<
" found solution: "<<est_mean<<
" (gt is "<<gt_mean<<
", diff "
91 <<fabs(est_mean-gt_mean)/sigma3<<
"*sigma3)\n";
93 if (!
CheckResult(est_inliers, est_mean, gt_inliers, gt_mean, sigma3)){
94 DebugOut(t, num_data, num_outliers, sigma3, res, data, gt_inliers,
95 gt_mean, est_mean, num_inliers, score, max_score);
96 cerr <<
"wrong result\n";
100 cout <<
"#" << flush;
112 void DebugOut(
const unsigned t,
const unsigned num_data,
113 const unsigned num_outliers,
const double sigma3,
114 const int ret_val_solve_master,
const vector<double> &data,
115 const vector<bool> >_inliers,
const double gt_mean,
116 const double &est_mean,
const unsigned est_num_inliers,
117 const double &score,
const double &max_score)
119 cerr <<
"\n---- try "<<t<<
" -------\n"
120 <<
"(num samples: "<<num_data
121 <<
", num_outliers: "<<num_outliers<<
", sigma3: "<<sigma3<<
"): res="
122 <<ret_val_solve_master<<endl;
123 if (ret_val_solve_master<0){
124 cerr <<
"Error computing solution\n";
125 }
else if (ret_val_solve_master>0){
126 cerr <<
"Solution violates min quality criteria\n";
127 cout <<
"estimated num inliers: "<<est_num_inliers
128 <<
" (expected min "<<num_data-num_outliers<<
")\n";
129 cout <<
"estimated score: "<<score
130 <<
" (expected max "<<max_score<<
")\n";
132 for (
unsigned k=0; k<data.size(); k++){
133 cout << data[k]<<
"("<<((gt_inliers[k])?(
"+"):(
"-"))<<
") ";
136 cout <<
"gt_mean : "<<gt_mean<<endl;
137 cout <<
"est_mean: "<<est_mean<<endl;
138 cout <<
"est num inliers: "<<est_num_inliers<<endl;
139 cout <<
"est score: "<<score<<endl;
helper class for implementation of PreemptievRANSAC and COSAC for robust computation of the mean of a...
Complete Sampling Consesus.
double GetUniformDistributed(const double min, const double max)
on succesive calls return uniform distributed random variable between min and max ...
unsigned GetMinNumSamplesForSolutionComputation() const
Returns the minimum required samples for computation of a solution.
int GetUniformDistributedInt(const int min, const int max)
get uniform distributed random variable including min/max
int Init(const std::vector< double > &data, const double &sigma3)
bool CheckResult(const std::vector< bool > &est_inliers, const double &est_mean, const std::vector< bool > >_inliers, const double >_mean, const double >_sigma3)
bool GenerateRandomData(Random &MyRandom, const unsigned num_data, const unsigned num_outliers, const double sigma3, const unsigned min_sample_size, std::vector< double > &data, std::vector< bool > &inliers, double &mean)
class for producing random numbers from different distributions
virtual const std::string & What() const