Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TestCOSAC.cpp
1 #include <MathAlgo/COSAC.hh>
2 #include "MeanDoubleRANSACEvaluator.hh"
3 #include "TestMeanDoubleHelper.hh"
4 
5 using namespace BIAS;
6 using namespace std;
7 
8 Random MyRandom;
9 bool verbose = false;
10 const double max_outlier_fraction = 0.5;
11 
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> &gt_inliers, const double gt_mean,
16  const double &est_mean, const unsigned est_num_inliers,
17  const double &score, const double &max_score);
18 
19 int main(int argc, char *argv[])
20 {
22  COSAC<double> cosac(&mdch);
23  const unsigned min_sample_size =
25 
26  const unsigned num_tries = 1000;
27  for (unsigned t=0; t<num_tries; t++){
28  unsigned num_data =
29  (unsigned)rint(MyRandom.GetUniformDistributed(1., 30.));
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;
35  }
36  const unsigned num_outliers =
37  MyRandom.GetUniformDistributedInt(min_num_outliers, max_num_outliers);
38  const double sigma3 =
39  MyRandom.GetUniformDistributed(0., 1.0);
40  vector<double> data;
41  vector<bool> gt_inliers, est_inliers;
42  double gt_mean, est_mean;
43  if (verbose) {
44  cout << "------------ "<<t<<" -------------\n";
45  }
46  GenerateRandomData(MyRandom,num_data, num_outliers, sigma3, min_sample_size, data,
47  gt_inliers, gt_mean);
48  if (verbose) {
49  cout << " "<<num_data<<" samples ("<<num_outliers<<" outliers)\n"
50  << " mean: "<<gt_mean<<" \tsigma3: "<<sigma3<<endl;
51  }
52  double inlying_data_fraction =
53  1.0 - ((double)num_outliers / (double)num_data) - 0.01;
54  const double max_score = 100.0;
55  double score;
56  unsigned num_inliers;
57  try{
58  mdch.Init(data, sigma3);
59  } catch (BaseException &ex) {
60  cout<<"Error:"<<ex.What()<<endl;
61  if (data.size()>=mdch.GetMinNumSamplesForSolutionComputation() ){
62  BIASABORT;
63  }
64  }
65  //cosac.AddDebugLevel("D_COSAC_Evaluate");
66 
67  if (t==577){
68  cosac.AddDebugLevel("D_COSAC_GetSolution");
69  }
70  int res = cosac.SolveMaster(inlying_data_fraction, max_score, est_mean,
71  est_inliers, num_inliers, score);
72  if (res!=0){
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";
78  BIASABORT;
79  }
80  continue;
81  }
82  DebugOut(t, num_data, num_outliers, sigma3, res, data, gt_inliers,
83  gt_mean, est_mean, num_inliers, score, max_score);
84 
85  if (res<0){
86  BIASABORT;
87  }
88  }
89  if (verbose){
90  cout << " found solution: "<<est_mean<<" (gt is "<<gt_mean<<", diff "
91  <<fabs(est_mean-gt_mean)/sigma3<<"*sigma3)\n";
92  }
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";
97  BIASABORT;
98  }
99  if (!verbose) {
100  cout << "#" << flush;
101  }
102  }
103 
104  if (!verbose) {
105  cout << "\n";
106  }
107 
108  return 0;
109 }
110 
111 
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> &gt_inliers, const double gt_mean,
116  const double &est_mean, const unsigned est_num_inliers,
117  const double &score, const double &max_score)
118 {
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";
131  }
132  for (unsigned k=0; k<data.size(); k++){
133  cout << data[k]<<"("<<((gt_inliers[k])?("+"):("-"))<< ") ";
134  }
135  cout << endl;
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;
140 }
helper class for implementation of PreemptievRANSAC and COSAC for robust computation of the mean of a...
Complete Sampling Consesus.
Definition: COSAC.hh:79
double GetUniformDistributed(const double min, const double max)
on succesive calls return uniform distributed random variable between min and max ...
Definition: Random.hh:84
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
Definition: Random.cpp:139
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 > &gt_inliers, const double &gt_mean, const double &gt_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
Definition: Random.hh:51
generic exception
Definition: Exception.hh:77
virtual const std::string & What() const
Definition: Exception.hh:95