PROBI  1.0
 All Classes Functions
PKMedian.hpp
1 #ifndef PKMEDIAN_H
2 #define PKMEDIAN_H
3 
4 #include <functional>
5 
6 #include "Helper.hpp"
7 #include "Metric.hpp"
8 #include "Point.hpp"
9 #include "WeightedPoint.hpp"
10 #include "ProbabilisticPoint.hpp"
11 
15 class PKMedian
16 {
17 public:
18  PKMedian(std::function<Metric<Point>*() > createMetric);
19  ~PKMedian();
20 
24  template<typename ForwardIteratorCenter>
25  double weightedCost(ProbabilisticPoint const & pp, ForwardIteratorCenter beginC, ForwardIteratorCenter endC);
26 
30  template<typename ForwardIteratorPoint, typename ForwardIteratorCenter>
31  double weightedCost(ForwardIteratorPoint beginP, ForwardIteratorPoint endP, ForwardIteratorCenter beginC, ForwardIteratorCenter endC);
32 
33 private:
34  Metric<Point>* dist;
35 };
36 
37 template<typename ForwardIteratorCenter>
38 double PKMedian::weightedCost(ProbabilisticPoint const & pp, ForwardIteratorCenter beginC, ForwardIteratorCenter endC)
39 {
40  double minCost = 0;
41  for (auto itC = beginC; itC != endC; ++itC)
42  {
43  double tmpCost = 0;
44  for (auto it = pp.cbegin(); it != pp.cend(); ++it)
45  tmpCost += toPointer(*it)->getWeight() * dist->distance(toPointer(*it), toPointer(*itC));
46  tmpCost *= pp.getWeight();
47  if (tmpCost < minCost || itC == beginC)
48  minCost = tmpCost;
49  }
50  return minCost;
51 }
52 
53 template<typename ForwardIteratorPoint, typename ForwardIteratorCenter>
54 double PKMedian::weightedCost(ForwardIteratorPoint beginP, ForwardIteratorPoint endP, ForwardIteratorCenter beginC, ForwardIteratorCenter endC)
55 {
56  double sum = 0;
57  for (auto itP = beginP; itP != endP; ++itP)
58  {
59  double minCost = 0;
60  for (auto itC = beginC; itC != endC; ++itC)
61  {
62  double tmpCost = 0;
63  for (auto it = itP->cbegin(); it != itP->cend(); ++it)
64  tmpCost += toPointer(*it)->getWeight() * dist->distance(toPointer(*it), toPointer(*itC));
65  tmpCost *= toPointer(*itP)->getWeight();
66  if (tmpCost < minCost || itC == beginC)
67  minCost = tmpCost;
68  }
69  sum += minCost;
70  }
71  return sum;
72 }
73 
74 
75 #endif