DGtal  1.5.beta
CBDRSolver.h
1 
17 #pragma once
18 
28 #if defined(CBDRSOLVER_RECURSES)
29 #error Recursive header files inclusion detected in CBDRSolver.h
30 #else // defined(CBDRSOLVER_RECURSES)
32 #define CBDRSOLVER_RECURSES
33 
34 #if !defined CBDRSOLVER_h
36 #define CBDRSOLVER_h
37 
39 // Inclusions
40 #include <DGtal/images/RigidTransformation2D.h>
41 #include "Policy.h"
42 #include "NBijectiveReflectionGenerator.h"
43 namespace DGtal{
50  template<typename TSpace,typename TDomain>
52  public:
55  typedef std::vector<std::pair<std::vector<GAVector<TSpace>>,GAVector<TSpace>>> bijectiveReflect;
58  typedef std::vector<std::vector<typename TSpace::RealPoint>> VectorField;
59 
60 
61  CBDRSolver_GAvec(const size_t km, const double rotAngle, const typename TDomain::Point center):nBijectiveGenerator(km),my_angle(rotAngle),my_center(center){}
62 
66  std::pair<std::vector<GAVector<TSpace>>,double> outputCompositionReflection(const TDomain& set2d,
67  typename bijectiveReflect::iterator& lowerAngle,
68  typename bijectiveReflect::iterator& upperAngle,
70 
71  // first error
72  auto it = lowerAngle;
73 
74  typename bijectiveReflect::iterator itMinError;
75 
76  std::vector<DigitizedReflection> bijectiveReflections;
77  std::vector<GAVector<TSpace>> firstReflectionsIndex=(*lowerAngle).first;
78 
79  for(size_t i = 0 ;i<firstReflectionsIndex.size();++i){
80  bijectiveReflections.push_back(DigitizedReflection(firstReflectionsIndex[i]));//firstReflectionsIndex.size()-1-
81  }
82 
83  CBDR_naiverotation<TSpace> reflections(bijectiveReflections);
84 
85  // finally get the average error
86  double minError = policy.evaluate(set2d, reflections,my_angle, my_center); //outputError(firsterrors,policy); // should now be policy
87 
88  itMinError = lowerAngle;
89 
90  for(it = lowerAngle+1 ; it != upperAngle ; ++it ){
91  std::vector<DigitizedReflection> currentbijectiveReflections;
92  std::vector<GAVector<TSpace>> currentReflectionsIndex=(*it).first;
93  for(size_t i = 0 ;i<currentReflectionsIndex.size();++i){
94  currentbijectiveReflections.push_back(DigitizedReflection(currentReflectionsIndex[i]));//nBijectiveGenerator.BijectiveVectors[currentReflectionsIndex[i]] // currentReflectionsIndex.size()-1-
95  }
96  CBDR_naiverotation<TSpace> currentreflections(currentbijectiveReflections);
97 
98  // // finally get the error
99  double error = policy.evaluate(set2d, currentreflections,my_angle, my_center);
100  if(fabs(error)<fabs(minError)){
101  itMinError = it;
102  minError = error;
103  }
104  }
105  return {(*itMinError).first,minError};
106  }
108  double my_angle;
110  };
111 
112 
119  template<typename TSpace,typename TDomain>
120  struct CBDRSolver {
123  typedef std::vector<std::pair<std::vector<GAVector<TSpace>>,GAVector<TSpace>>> bijectiveReflect;
126  typedef std::vector<std::vector<typename TSpace::RealPoint>> VectorField;
127  typedef std::vector<std::pair<std::vector<GAVector<TSpace>>,GAVector<TSpace>>> BijectiveSearchTree;
128 
129  CBDRSolver(const double rotAngle, const typename TDomain::Point center,const int km, const int NSamples):my_angle(rotAngle),my_center(center),kmax(km),N(NSamples){}
130 
131  void setPolicy(const Policy<TSpace,TDomain,BijectiveReflections> customPolicy){my_policy(customPolicy);}
132 
133  std::vector<Reflection<TSpace>> solve(const TDomain& points,NBijectiveGenerator<TSpace>& nbijectiveVectors, std::vector<BijectiveSearchTree>& vecBijectiveSearchTree,const Policy<TSpace,TDomain,BijectiveReflections>& policy){
135  std::vector<GAVector<TSpace>> bestParam;
136  double errorMin = points.myUpperBound[0];
137  for(size_t nReflection = 0 ; nReflection < vecBijectiveSearchTree.size();++nReflection){
138  typename std::vector<std::pair<std::vector<GAVector<TSpace>>,GAVector<TSpace>>>::iterator lowerAngle;
139  typename std::vector<std::pair<std::vector<GAVector<TSpace>>,GAVector<TSpace>>>::iterator upperAngle;
140  int numberOfCompositions=N;
141 
142  nbijectiveVectors.getKNearestBijectiveComposition(
143  vecBijectiveSearchTree[nReflection],
144  lowerAngle,
145  upperAngle,
146  numberOfCompositions,
147  my_angle);
148 
149 
151  std::pair<std::vector<GAVector<TSpace>>,double> bestParam_Error =rotationSolver.outputCompositionReflection(points,lowerAngle,upperAngle,policy);
152  if(bestParam_Error.second < errorMin) {
153  bestParam = bestParam_Error.first;
154  errorMin = bestParam_Error.second;
155  }
156  }
157  std::vector<DigitizedReflection> bestGAVectors;
158  for(GAVector<TSpace> indexB:bestParam){
159  bestGAVectors.push_back(DigitizedReflection(indexB));
160  }
161  return bestGAVectors;
162  }
163 
164 
165  protected:
166  int kmax;
167  int N;
168  double my_angle;
170 
171  };
172 }
173 
174 
175 #endif //CBDRSOLVER
176 #undef CBDRSOLVER_RECURSES
177 #endif // else defined(CBDRSOLVER_RECURSES)
178 
CBDR solver, use a policy to choose the composition of digitized reflections that minimises an error.
Definition: CBDRSolver.h:51
std::pair< std::vector< GAVector< TSpace > >, double > outputCompositionReflection(const TDomain &set2d, typename bijectiveReflect::iterator &lowerAngle, typename bijectiveReflect::iterator &upperAngle, const Policy< TSpace, TDomain, BijectiveReflections > &policy)
Definition: CBDRSolver.h:66
TDomain::Point my_center
Definition: CBDRSolver.h:109
Reflection< TSpace > DigitizedReflection
Definition: CBDRSolver.h:57
std::vector< std::vector< typename TSpace::RealPoint > > VectorField
Definition: CBDRSolver.h:58
CBDR_naiverotation< TSpace, typename TSpace::RealPoint > BijectiveReflections
Definition: CBDRSolver.h:53
functors::ForwardRigidTransformation2D< TSpace, typename TSpace::RealPoint, typename TSpace::RealPoint, functors::Identity > RealRotation
Definition: CBDRSolver.h:54
std::vector< std::pair< std::vector< GAVector< TSpace > >, GAVector< TSpace > > > bijectiveReflect
Definition: CBDRSolver.h:55
ErrorVectorField< TSpace, TDomain, typename TSpace::RealPoint > ErrorRealVectors
Definition: CBDRSolver.h:56
NBijectiveGenerator< TSpace, typename TSpace::RealPoint > nBijectiveGenerator
Definition: CBDRSolver.h:107
CBDRSolver_GAvec(const size_t km, const double rotAngle, const typename TDomain::Point center)
Definition: CBDRSolver.h:61
DGtal is the top-level namespace which contains all DGtal functions and types.
Aim: CBDR solver, use a policy to choose the composition of digitized reflections that minimises an e...
Definition: CBDRSolver.h:120
Reflection< TSpace > DigitizedReflection
Definition: CBDRSolver.h:125
CBDRSolver(const double rotAngle, const typename TDomain::Point center, const int km, const int NSamples)
Definition: CBDRSolver.h:129
TDomain::Point my_center
Definition: CBDRSolver.h:169
std::vector< std::pair< std::vector< GAVector< TSpace > >, GAVector< TSpace > > > bijectiveReflect
Definition: CBDRSolver.h:123
void setPolicy(const Policy< TSpace, TDomain, BijectiveReflections > customPolicy)
Definition: CBDRSolver.h:131
functors::ForwardRigidTransformation2D< TSpace, typename TSpace::RealPoint, typename TSpace::RealPoint, functors::Identity > RealRotation
Definition: CBDRSolver.h:122
double my_angle
number of sample rotation angle
Definition: CBDRSolver.h:168
ErrorVectorField< TSpace, TDomain, BijectiveReflections > ErrorRealVectors
Definition: CBDRSolver.h:124
std::vector< Reflection< TSpace > > solve(const TDomain &points, NBijectiveGenerator< TSpace > &nbijectiveVectors, std::vector< BijectiveSearchTree > &vecBijectiveSearchTree, const Policy< TSpace, TDomain, BijectiveReflections > &policy)
Definition: CBDRSolver.h:133
CBDR_naiverotation< TSpace > BijectiveReflections
Definition: CBDRSolver.h:121
std::vector< std::vector< typename TSpace::RealPoint > > VectorField
Definition: CBDRSolver.h:126
std::vector< std::pair< std::vector< GAVector< TSpace > >, GAVector< TSpace > > > BijectiveSearchTree
Definition: CBDRSolver.h:127
void getKNearestBijectiveComposition(std::vector< std::pair< std::vector< GAVector< TSpace >>, GAVector< TSpace >>> &vecBijNormals, typename std::vector< std::pair< std::vector< GAVector< TSpace >>, GAVector< TSpace >>>::iterator &lowerBound, typename std::vector< std::pair< std::vector< GAVector< TSpace >>, GAVector< TSpace >>>::iterator &upperBound, const int K, const double targetAngle)
Policy : ,.
Definition: Policy.h:55
virtual double evaluate(const TDomain &set2d, const BijectiveRotation &reflections, double my_angle, typename TSpace::Point my_center) const =0
MyPointD Point
Definition: testClone2.cpp:383