ObjectDataMap.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // Created by wrede on 22.04.16.
  3. //
  4. #include "ObjectDataMap.h"
  5. namespace core
  6. {
  7. void ObjectDataMap::Print(std::ostream& os) const
  8. {
  9. os << "ObjectDataMap{" << GetFrameIndex();
  10. for (auto it = value_weight_map_.begin(); it != value_weight_map_.end(); ++it)
  11. {
  12. os << "," << it->first
  13. << ":" << it->second.first
  14. << "*" << it->second.second;
  15. }
  16. os << "}";
  17. }
  18. ObjectDataMap::ObjectDataMap(size_t frame_index)
  19. : ObjectData(frame_index)
  20. {
  21. value_weight_map_ = std::unordered_map<std::string, std::pair<double, double>>();
  22. }
  23. ObjectDataMap::ObjectDataMap(size_t frame_index,
  24. std::vector<std::string> keys,
  25. std::vector<double> value_list)
  26. : ObjectDataMap(frame_index)
  27. {
  28. double weight = 1.0 / value_list.size();
  29. for (size_t i = 0; i < value_list.size() && i < keys.size(); ++i)
  30. {
  31. value_weight_map_[keys[i]] = std::make_pair(value_list[i], weight);
  32. }
  33. }
  34. ObjectDataMap::ObjectDataMap(size_t frame_index,
  35. std::vector<std::string> keys,
  36. std::vector<double> value_list,
  37. std::vector<double> weight_list)
  38. : ObjectDataMap(frame_index)
  39. {
  40. for (size_t i = 0;
  41. i < value_list.size() && i < keys.size() && i < weight_list.size();
  42. ++i)
  43. {
  44. value_weight_map_[keys[i]] = std::make_pair(value_list[i], weight_list[i]);
  45. }
  46. }
  47. ObjectDataMap::ObjectDataMap(size_t frame_index,
  48. std::vector<std::string> keys,
  49. std::vector<std::pair<double, double>> value_weight_list)
  50. : ObjectDataMap(frame_index)
  51. {
  52. for (size_t i = 0; i < value_weight_list.size() && i < keys.size(); ++i)
  53. {
  54. value_weight_map_[keys[i]] = value_weight_list[i];
  55. }
  56. }
  57. double ObjectDataMap::GetValue(std::string key)
  58. {
  59. return value_weight_map_[key].first;
  60. }
  61. double ObjectDataMap::GetWeight(std::string key)
  62. {
  63. return value_weight_map_[key].second;
  64. }
  65. void ObjectDataMap::PutValueWeight(std::string key, double value,
  66. double weight)
  67. {
  68. value_weight_map_[key] = std::make_pair(value, weight);
  69. }
  70. void ObjectDataMap::PutValueWeight(std::string key,
  71. std::pair<double, double> value_weight)
  72. {
  73. value_weight_map_[key] = value_weight;
  74. }
  75. double ObjectDataMap::CompareTo(ObjectData *obj)
  76. {
  77. ObjectDataMap* obj_dm = dynamic_cast<ObjectDataMap*>(obj);
  78. if (obj_dm)
  79. {
  80. return CompareTo(obj_dm);
  81. }
  82. else
  83. {
  84. return 0.0;
  85. }
  86. }
  87. double ObjectDataMap::CompareTo(ObjectDataMap *obj)
  88. {
  89. double diff = 0.0;
  90. for (auto it = value_weight_map_.begin(); it != value_weight_map_.end(); ++it)
  91. {
  92. // |other_value - this_value| * this_weight;
  93. diff += fabs(obj->value_weight_map_[it->first].first - it->second.first)
  94. * it->second.second;
  95. }
  96. return diff;
  97. }
  98. }