CluE  1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
gonzales.h
Go to the documentation of this file.
1 #ifndef GONZALES_H
2 #define GONZALES_H
3 
4 #include "../base/algorithm.h"
5 #include "../base/inputsetter.h"
6 #include "../base/measuresetter.h"
7 #include "../datastructure/discretedoublesolution.h"
8 #include "../sampling/farthestfirsttraversal.h"
9 
10 #include "../exception/invalidruntimeconfigurationexception.h"
11 
12 namespace CluE
13 {
14 
27 template<typename T> class Gonzales : public Algorithm, public InputSetter<T>, public MeasureSetter<T>
28 {
29 public:
37  Gonzales(DissimilarityMeasure<T> const *measure = 0, std::vector<T*> const* input = 0, unsigned int numberOfClusters = 1, unsigned int firstPoint = 0);
38 
39  Gonzales(const Gonzales<T>&);
41  virtual ~Gonzales();
42 
48  virtual SolutionProvider* compute();
49 
50  virtual void setInput(std::vector<T*> const*);
51 
52  virtual void setMeasure(DissimilarityMeasure<T> const *measure);
53 
57  void setNumberOfClusters(unsigned int number);
58 
62  void setFirstPoint(unsigned int index);
63 
68  static Gonzales<T>* toGonzales(Algorithm* s);
69 
70 private:
72  std::vector<T*> const* input;
73  unsigned int numberOfClusters;
74  unsigned int first_point;
75 };
76 
77 template<typename T> Gonzales<T>::Gonzales(DissimilarityMeasure<T> const *measure, std::vector<T*> const* data, unsigned int nc, unsigned int fp) :
78  measure(measure==0 ? 0 : measure->clone()),
79  input(data),
80  numberOfClusters(nc),
81  first_point(fp)
82 {
83 }
84 
85 template<typename T> Gonzales<T>::Gonzales(const Gonzales<T>& gon) :
86  measure(gon.measure == 0 ? 0 : gon.measure->clone()),
87  input(gon.input),
88  numberOfClusters(gon.numberOfClusters),
89  first_point(gon.first_point)
90 {
91 }
92 
93 template<typename T> Gonzales<T>& Gonzales<T>::operator= (const Gonzales<T>& gon)
94 {
95  if(measure != 0)
96  delete measure;
97 
98  Algorithm::operator= (gon);
99 
100  measure = gon.measure == 0 ? 0 : gon.measure->clone();
101  input = gon.input;
102  numberOfClusters = gon.numberOfClusters;
103  first_point = gon.first_point;
104 
105  return *this;
106 }
107 
108 template<typename T> Gonzales<T>::~Gonzales()
109 {
110  if(measure != 0)
111  delete measure;
112 }
113 
114 template<typename T> SolutionProvider* Gonzales<T>::compute()
115 {
117  unsigned int numOfPoints = this->input->size();
118 
119  if(this->input == 0)
120  throw InvalidRuntimeConfigurationException(0, "Input is NULL.");
121  if(this->measure == 0)
122  throw InvalidRuntimeConfigurationException(1, "Dissimilarity measure is NULL.");
123  if(this->numberOfClusters > numOfPoints)
124  throw InvalidRuntimeConfigurationException(2, "Desired number of clusters is larger than size of input.");
125 
126  time_t start, end;
127  start = time(0);
128 
129  FarthestFirstTraversal<T> fft(this->measure, this->input, numberOfClusters, first_point);
130  DiscreteProxySolution<T> *dps = dynamic_cast<DiscreteProxySolution<T>*>(fft.compute());
131 
132  unsigned int numOfProxies = dps->proxysets[0].size();
133 
134  //ProxySolution
135  solution->proxysets = dps->proxysets;
136 
137  //Prepare PartitionSolution
138  solution->partitions.push_back(std::vector<std::vector<T*> >());
139  for(unsigned int i = 0; i < numOfProxies; i++)
140  solution->partitions[0].push_back(std::vector<T*>());
141 
142  //Assign points to proxies
143  for(unsigned int i = 0; i < numOfPoints; i++)
144  {
145  T* point = (*input)[i];
146 
147  double min = this->measure->dissimilarity(*point, * (dps->proxysets[0][0]));
148  int assignedProxy = 0;
149  for(unsigned int j = 1; j < numOfProxies; j++)
150  {
151  T* proxy = dps->proxysets[0][j];
152  double candidate = this->measure->dissimilarity(*point, *proxy);
153  if(candidate < min)
154  {
155  min = candidate;
156  assignedProxy = j;
157  }
158  }
159 
160  solution->partitions[0][assignedProxy].push_back(point);
161  }
162 
163  delete dps;
164 
165  end = time(0);
166  solution->seconds = end-start;
167 
168  return solution;
169 }
170 
171 template<typename T> void Gonzales<T>::setFirstPoint(unsigned int s)
172 {
173  this->first_point = s;
174 }
175 
176 template<typename T> void Gonzales<T>::setInput(std::vector<T*> const* data)
177 {
178  this->input = data;
179 }
180 
181 template<typename T> void Gonzales<T>::setNumberOfClusters(unsigned int nc)
182 {
183  this->numberOfClusters = nc;
184 }
185 
186 template<typename T> void Gonzales<T>::setMeasure(DissimilarityMeasure<T> const *measure)
187 {
188  if(this->measure != 0)
189  delete this->measure;
190 
191  if(measure == 0)
192  this->measure = 0;
193  else
194  this->measure = measure->clone();
195 }
196 
198 {
199  return dynamic_cast<Gonzales<T>*>(s);
200 }
201 }
202 
203 #endif
DissimilarityMeasure< T > * measure
Definition: gonzales.h:71
unsigned int numberOfClusters
Definition: gonzales.h:73
Data structure for discrete proxies.
std::vector< std::vector< T * > > proxysets
std::vector< std::vector< std::vector< T * > > > partitions
Data structure for partitions and discrete proxies.
std::vector< std::vector< T * > > proxysets
virtual SolutionProvider * compute()
Definition: gonzales.h:114
virtual void setMeasure(DissimilarityMeasure< T > const *measure)
Definition: gonzales.h:186
Gonzales algorithm.
Definition: gonzales.h:27
virtual DissimilarityMeasure< T > * clone() const =0
static Gonzales< T > * toGonzales(Algorithm *s)
does a dynamic cast of the given Algorithm to Gonzales
Definition: gonzales.h:197
void setNumberOfClusters(unsigned int number)
Sets the desired number of clusters.
Definition: gonzales.h:181
Abstract base class for algorithms.
Definition: algorithm.h:17
Interface to propagate the ability to set a DissimilarityMeasure.
Definition: measuresetter.h:13
Gonzales< T > & operator=(const Gonzales< T > &)
Definition: gonzales.h:93
Farthest first traversal algorithm.
std::vector< T * > const * input
Definition: gonzales.h:72
Gonzales(DissimilarityMeasure< T > const *measure=0, std::vector< T * > const *input=0, unsigned int numberOfClusters=1, unsigned int firstPoint=0)
Constructor for general use.
Definition: gonzales.h:77
Abstract base class for dissimilarity measurement.
void setFirstPoint(unsigned int index)
Sets the starting point for farthest first traversal.
Definition: gonzales.h:171
unsigned int first_point
Definition: gonzales.h:74
Indicates that a computation entered an invalid configuration state.
virtual SolutionProvider * compute()
Returns an ordered DiscretesProxySolution. The first point is the starting point. ...
virtual ~Gonzales()
Definition: gonzales.h:108
Abstract base class for algorithm solutions.
virtual void setInput(std::vector< T * > const *)
Definition: gonzales.h:176
Interface to propagate the ability to set input data.
Definition: inputsetter.h:13