1 #ifndef __TestMeanDoubleHelper_hh__
2 #define __TestMeanDoubleHelper_hh__
4 #include <Base/Math/Random.hh>
5 #include <Base/Math/Distribution.hh>
10 const unsigned num_data,
const unsigned num_outliers,
11 const double sigma3,
const unsigned min_sample_size,
12 std::vector<double> &data,
13 std::vector<bool> &inliers,
double &mean);
15 bool CheckResult(
const std::vector<bool> &est_inliers,
const double &est_mean,
16 const std::vector<bool> >_inliers,
const double >_mean,
17 const double >_sigma3);
25 const unsigned num_data,
const unsigned num_outliers,
26 const double sigma3,
const unsigned min_sample_size,
27 std::vector<double> &data,
28 std::vector<bool> &inliers,
double &mean)
30 BIASASSERT(num_outliers<num_data);
31 if (num_data>=min_sample_size){
33 BIASASSERT(num_outliers+min_sample_size<=num_data);
35 data.resize(num_data);
36 inliers.resize(num_data);
37 const double range = 20.;
40 unsigned generated_inliers(0), generated_outliers(0);
41 unsigned num_outliers_left = num_outliers;
42 unsigned num_inliers_left = num_data - num_outliers;
44 for (
unsigned i=0; i<num_data; i++){
45 BIASASSERT((num_data-i) == (num_outliers_left + num_inliers_left));
47 unsigned inlier_outlier =
50 num_inliers_left - 1u);
52 bool is_inlier = (inlier_outlier<num_inliers_left);
57 int count = 0, max_tries = 100;
60 }
while (fabs(val-mean)>=sigma3 && count<max_tries);
61 if (count==max_tries){
62 val = mean + sigma3*0.5;
64 BIASASSERT(num_inliers_left>0);
68 int count = 0, max_tries = 100;
72 }
while (fabs(val-mean)<sigma3 && count<max_tries);
73 if (count==max_tries){
74 val = mean * 4.0*sigma3;
76 BIASASSERT(num_outliers_left>0);
80 inliers[i] = is_inlier;
82 if (fabs(data[i]-mean)<sigma3){
84 BIASASSERT(inliers[i]);
87 BIASASSERT(!inliers[i]);
91 BIASASSERT(num_inliers_left==0);
92 BIASASSERT(num_outliers_left==0);
93 BIASASSERT(generated_inliers+generated_outliers == num_data);
94 BIASASSERT(generated_outliers == num_outliers);
98 std::vector<double> inl, outl;
99 for (
unsigned i=0; i<data.size(); i++){
101 inl.push_back(data[i]);
103 outl.push_back(data[i]);
106 if (!inl.empty() && !outl.empty()){
110 static int num_tries = 0;
111 const int max_num_tries = 10;
114 if (num_tries<max_num_tries){
117 min_sample_size, data, inliers, mean);
119 std::cerr<<
"error generating random data. This should never happen\n";
128 bool CheckResult(
const std::vector<bool> &est_inliers,
const double &est_mean,
129 const std::vector<bool> >_inliers,
const double >_mean,
130 const double >_sigma3)
132 if (fabs(est_mean - gt_mean)>gt_sigma3){
133 std::cerr <<
"mean differs: \n gt_mean: "<<gt_mean<<
"\n est_mean: "
134 <<est_mean<<std::endl;
137 if (est_inliers.size()!=gt_inliers.size()){
138 std::cerr <<
"size of inliers mismatch: "<<std::endl;
141 unsigned num_inlier_mismatches = 0;
142 for (
unsigned i=0; i<gt_inliers.size(); i++){
143 if (gt_inliers[i]!=est_inliers[i]){
144 num_inlier_mismatches++;
147 double mismatch_ratio =
148 (double)num_inlier_mismatches / (
double)gt_inliers.size();
149 double max_inlier_mismatch_ratio = 0.1;
150 if ((1./(
double)gt_inliers.size())>max_inlier_mismatch_ratio){
151 max_inlier_mismatch_ratio = 1./(double)gt_inliers.size();
153 if (mismatch_ratio>max_inlier_mismatch_ratio){
154 std::cerr <<
"inlier mismtach ratio too big: "<<num_inlier_mismatches
155 <<
" / "<< gt_inliers.size()<<
" = "<<mismatch_ratio <<std::endl;
156 if (num_inlier_mismatches>5){
167 #endif // __TestMeanDoubleHelper_hh__
class for calculating mean, variance and possibly other parameters
double GetUniformDistributed(const double min, const double max)
on succesive calls return uniform distributed random variable between min and max ...
int GetUniformDistributedInt(const int min, const int max)
get uniform distributed random variable including min/max
void AddData(const std::vector< double > &data)
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)
double GetNormalDistributed(const double mean, const double sigma)
on succesive calls return normal distributed random variable with mean and standard deviation sigma ...
class for producing random numbers from different distributions