PROBI  1.0
 All Classes Functions
KMedian.hpp
1 #ifndef KMEDIAN_H
2 #define KMEDIAN_H
3 
4 #include <functional>
5 
6 #include "Metric.hpp"
7 #include "Point.hpp"
8 #include "WeightedPoint.hpp"
9 
13 class KMedian
14 {
15 public:
16  KMedian(std::function<Metric<Point>*()> createMetric);
17  ~KMedian();
18 
22  template<typename ForwardIterator>
23  double cost(ForwardIterator first, ForwardIterator last, Point Center);
24 
28  template<typename ForwardIteratorPoint, typename ForwardIteratorCenter>
29  double cost(ForwardIteratorPoint beginP, ForwardIteratorPoint endP, ForwardIteratorCenter beginC, ForwardIteratorCenter endC);
30 
34  template<typename ForwardIterator>
35  double weightedCost(ForwardIterator first, ForwardIterator last, Point Center);
36 
40  template<typename ForwardIteratorPoint, typename ForwardIteratorCenter>
41  double weightedCost(ForwardIteratorPoint beginP, ForwardIteratorPoint endP, ForwardIteratorCenter beginC, ForwardIteratorCenter endC);
42 
43 private:
44  Metric<Point>* dist;
45 };
46 
47 template<typename ForwardIterator>
48 double KMedian::cost(ForwardIterator first, ForwardIterator last, Point center)
49 {
50  double sum = 0;
51  while(first != last)
52  {
53  sum += dist->distance(toPointer(*first), center);
54  ++first;
55  }
56  return sum;
57 }
58 
59 template<typename ForwardIteratorPoint, typename ForwardIteratorCenter>
60 double KMedian::cost(ForwardIteratorPoint beginP, ForwardIteratorPoint endP, ForwardIteratorCenter beginC, ForwardIteratorCenter endC)
61 {
62  double sum = 0;
63  for(auto itP = beginP; itP != endP; ++itP)
64  {
65  double minCost = 0;
66  for(auto itC = beginC; itC != endC; ++itC)
67  {
68  double tmpCost = dist->distance(toPointer(*itP), toPointer(*itC));
69  if(tmpCost < minCost || itC == beginC)
70  minCost = tmpCost;
71  }
72  sum += minCost;
73  }
74  return sum;
75 }
76 
77 template<typename ForwardIterator>
78 double KMedian::weightedCost(ForwardIterator first, ForwardIterator last, Point center)
79 {
80  double sum = 0;
81  while(first != last)
82  {
83  sum += first->getWeight() * dist->distance(toPointer(*first), center);
84  ++first;
85  }
86  return sum;
87 }
88 
89 template<typename ForwardIteratorPoint, typename ForwardIteratorCenter>
90 double KMedian::weightedCost(ForwardIteratorPoint beginP, ForwardIteratorPoint endP, ForwardIteratorCenter beginC, ForwardIteratorCenter endC)
91 {
92  double sum = 0;
93  for(auto itP = beginP; itP != endP; ++itP)
94  {
95  double minCost = 0;
96  for(auto itC = beginC; itC != endC; ++itC)
97  {
98  double tmpCost = toPointer(*itP)->getWeight() * dist->distance(toPointer(*itP), toPointer(*itC));
99  if(tmpCost < minCost || itC == beginC)
100  minCost = tmpCost;
101  }
102  sum += minCost;
103  }
104  return sum;
105 }
106 
107 #endif