ed_sensor_integration
association_matrix.cpp
Go to the documentation of this file.
2 #include <algorithm>
3 
4 #include <iostream>
5 
6 namespace ed_sensor_integration
7 {
8 
10 {
11  return e1.probability > e2.probability;
12 }
13 
14 //int AssociationMatrix::NO_ASSIGNMENT = -1;
15 
16 // ----------------------------------------------------------------------------------------------------
17 
18 AssociationMatrix::AssociationMatrix(unsigned int num_measurements) : i_max_entity_(0), matrix_(num_measurements)
19 {
20 }
21 
22 // ----------------------------------------------------------------------------------------------------
23 
25 {
26 }
27 
28 // ----------------------------------------------------------------------------------------------------
29 
30 void AssociationMatrix::setEntry(int i_measurement, int i_entity, double prob)
31 {
32  if (prob <= 0)
33  return;
34 
35  std::vector<Entry>& msr_row = matrix_[i_measurement];
36  msr_row.push_back(Entry(i_measurement, i_entity, prob));
37 
39 }
40 
41 // ----------------------------------------------------------------------------------------------------
42 
43 
45 {
46  // Sort all rows (highest prob first)
47  for(unsigned int i = 0; i < matrix_.size(); ++i)
48  {
49  std::vector<Entry>& msr_row = matrix_[i];
50  std::sort(msr_row.begin(), msr_row.end(), compareEntries);
51 
52  // Add dummy entry
53  msr_row.push_back(Entry(i, -1, 1e-9));
54  }
55 
56  // Initialize
57  std::vector<int> assig_indexes(matrix_.size(), 0);
58 
59  while(true)
60  {
61  // Check if the assignment is valid
62  bool valid = true;
63  std::vector<int> entity_used(i_max_entity_ + 1, 0);
64  for(unsigned int i = 0; i < assig_indexes.size(); ++i)
65  {
66  const Entry& entry = matrix_[i][assig_indexes[i]];
67  if (entry.i_entity >= 0)
68  {
69  ++entity_used[entry.i_entity];
70 
71  // Check if entity has been assigned double. If so, this assignment is not valid
72  if (entity_used[entry.i_entity] > 1)
73  valid = false;
74  }
75 
76  if (!valid)
77  break;
78  }
79 
80  // If we found a valid assignment, we can stop
81  if (valid)
82  break;
83 
84  double smallest_prob_diff = 1e9;
85  int i_smallest_prob_diff = -1;
86  for(unsigned int i = 0; i < assig_indexes.size(); ++i)
87  {
88  std::vector<Entry>& msr_row = matrix_[i];
89  unsigned int j = assig_indexes[i];
90 
91  if (j + 1 < msr_row.size())
92  {
93  double prob_diff = msr_row[j].probability / msr_row[j + 1].probability;
94  if (prob_diff < smallest_prob_diff)
95  {
96  i_smallest_prob_diff = i;
97  smallest_prob_diff = prob_diff;
98  }
99  }
100  }
101 
102  if (i_smallest_prob_diff < 0)
103  {
104  // Found no next step to take, so we're done and didn't find a valid assignment
105  return false;
106  }
107 
108  // Otherwise, step the assignment with the smallest probability diff
109  ++assig_indexes[i_smallest_prob_diff];
110  }
111 
112  assig.resize(matrix_.size());
113  for(unsigned int i = 0; i < assig_indexes.size(); ++i)
114  {
115  assig[i] = matrix_[i][assig_indexes[i]].i_entity;
116  }
117 
118  return true;
119 }
120 
121 }
122 
ed_sensor_integration::AssociationMatrix::~AssociationMatrix
~AssociationMatrix()
Definition: association_matrix.cpp:24
std::vector::resize
T resize(T... args)
ed_sensor_integration::AssociationMatrix::setEntry
void setEntry(int i_measurement, int i_entity, double prob)
Definition: association_matrix.cpp:30
ed_sensor_integration::AssociationMatrix::Entry::probability
double probability
Definition: association_matrix.h:24
ed_sensor_integration::compareEntries
bool compareEntries(const AssociationMatrix::Entry &e1, const AssociationMatrix::Entry &e2)
Definition: association_matrix.cpp:9
ed_sensor_integration::AssociationMatrix::Entry::i_entity
int i_entity
Definition: association_matrix.h:23
std::vector
std::vector::size
T size(T... args)
iostream
ed_sensor_integration
Definition: association_matrix.h:6
std::sort
T sort(T... args)
algorithm
std::vector::push_back
T push_back(T... args)
ed_sensor_integration::AssociationMatrix::AssociationMatrix
AssociationMatrix(unsigned int num_measurements)
Definition: association_matrix.cpp:18
ed_sensor_integration::AssociationMatrix::matrix_
std::vector< std::vector< Entry > > matrix_
Definition: association_matrix.h:41
ed_sensor_integration::AssociationMatrix::Entry
Definition: association_matrix.h:17
std::vector::begin
T begin(T... args)
std::vector::end
T end(T... args)
std::max
T max(T... args)
ed_sensor_integration::AssociationMatrix::i_max_entity_
int i_max_entity_
Definition: association_matrix.h:39
association_matrix.h
ed_sensor_integration::AssociationMatrix::calculateBestAssignment
bool calculateBestAssignment(Assignment &assig)
Definition: association_matrix.cpp:44