EqualityFilter.cpp
Go to the documentation of this file.
1 #include "EqualityFilter.h"
2 
3 #include <list>
4 
5 #include <IceUtil/Time.h>
6 
9 
11 {
12  bool
14  {
15  auto start = std::chrono::high_resolution_clock::now();
16 
17  int num_instances = 0;
18  std::vector<armarx::aron::data::NDArrayPtr> images_snapshot;
19  std::vector<armarx::aron::data::FloatPtr> floats_snapshot;
20  std::vector<float> distances;
21 
23  [&num_instances, &images_snapshot, &floats_snapshot](armem::wm::EntityInstance& i)
24  {
26  for (auto key : data->getAllKeys())
27  {
28  aron::data::Descriptor img_desc;
29  try
30  {
31  auto d = data->at(key);
32  ;
33  img_desc = data->at(key)->getDescriptor();
34  }
35  catch (...)
36  {
37  ARMARX_INFO << "Problem with accessing image description";
39  }
40  if (img_desc == aron::data::Descriptor::NDARRAY)
41  {
42  auto img_nd = aron::data::NDArray::DynamicCastAndCheck(data->at(key));
43  images_snapshot.insert(images_snapshot.end(), img_nd);
44  num_instances++;
45  }
46  else if (img_desc == aron::data::Descriptor::FLOAT)
47  {
48  auto fl = aron::data::Float::DynamicCastAndCheck(data->at(key));
49  floats_snapshot.push_back(fl);
50  num_instances++;
51  }
52  else
53  {
54  ARMARX_INFO << "data-type not yet supported. \n"
55  << "Only ndarray and float data types are supported for "
56  "equality filters yet.";
57  }
58  }
59  });
60 
61  if (images.size() < 2)
62  {
63  ARMARX_INFO << "Adding first images, because nothing to compare";
64  images.push_back(images_snapshot);
65  this->stats.accepted += 1;
66  auto end = std::chrono::high_resolution_clock::now();
67  stats.end_time = end;
68  stats.additional_time += (end - start);
69  return true;
70  }
71  else if (images.size() < max_images)
72  {
73  ARMARX_INFO << "Not enough elements yet to do full comparison of last " << max_images
74  << " elements";
75  images.push_back(images_snapshot);
76  this->stats.accepted += 1;
77  auto end = std::chrono::high_resolution_clock::now();
78  stats.end_time = end;
79  stats.additional_time += (end - start);
80  return true;
81  }
82 
83 
84  std::vector<armarx::aron::data::NDArrayPtr> lastCommittedImages;
85  int sizeOfCommited = 0;
86  for (int i = 0; i < max_images; i++)
87  {
88  std::vector<armarx::aron::data::NDArrayPtr> lastCommitImages =
89  images.at(images.size() - i - 1);
90  sizeOfCommited = lastCommitImages.size();
91  for (int j = 0; j < lastCommitImages.size(); j++)
92  {
93  lastCommittedImages.push_back(lastCommitImages.at(j));
94  }
95  // we just concatenate all images (instances)
96  }
97 
98  ARMARX_CHECK(sizeOfCommited == images_snapshot.size()); //make sure we have enough instances
99 
100  for (int i = 0; i < images_snapshot.size(); i++)
101  {
102  armarx::aron::data::NDArrayPtr new_image = images_snapshot.at(i);
103  std::vector<armarx::aron::data::NDArrayPtr> commited_images;
104  for (int j = 0; j < max_images; j++)
105  {
106  int index = i + 2 * j;
107  auto image = lastCommittedImages.at(index);
108  commited_images.emplace_back(image);
109  }
110 
112  commited_images, new_image, this->similarity_type);
113 
114  distances.insert(distances.end(), distance);
115  }
116 
117  //check for criterion:
118  float sum_distances = 0;
119  float max_distance = 0;
120  for (auto d : distances)
121  {
122  sum_distances += d;
123  if (d > max_distance)
124  {
125  max_distance = d;
126  }
127  }
128 
129  bool max =
130  true; //set true if only maximum distance value is important and false if sum of distances is important
131  bool accept = false;
132 
133  if (max)
134  {
135  accept = (max_distance > this->threshold);
136  }
137  else
138  {
139  accept = (sum_distances > this->threshold);
140  }
141 
142  if (accept)
143  {
144  images.pop_front(); //delete first element
145  images.push_back(images_snapshot);
146  this->stats.accepted += 1;
147  auto end = std::chrono::high_resolution_clock::now();
148  stats.additional_time += (end - start);
149  stats.end_time = end;
150  return true;
151  }
152  else
153  {
154  this->stats.rejected += 1;
155  auto end = std::chrono::high_resolution_clock::now();
156  stats.additional_time += (end - start);
157  stats.end_time = end;
158  return false;
159  }
160  }
161 
162  void
163  SnapshotSimilarityFilter::configure(const nlohmann::json& json)
164  {
165  if (json.find(PARAM_THRESHOLD) != json.end())
166  {
167  threshold = json.at(PARAM_THRESHOLD);
168  ARMARX_INFO << VAROUT(threshold);
169  stats.additional_info += "Threshold-Parameter: ";
170  stats.additional_info += std::to_string(threshold);
171  }
172  if (json.find(PARAM_SIM_MEASURE) != json.end())
173  {
174  std::string type_string = json.at(PARAM_SIM_MEASURE);
175  if (type_string == "MSE")
176  {
177  this->similarity_type = aron::similarity::NDArraySimilarity::Type::MSE;
178  this->float_similarity_type = aron::similarity::FloatSimilarity::Type::MSE;
180  }
181  else if (type_string == "MAE")
182  {
183  this->similarity_type = aron::similarity::NDArraySimilarity::Type::MAE;
184  this->float_similarity_type = aron::similarity::FloatSimilarity::Type::MAE;
186  }
187  else if (type_string == "Chernoff")
188  {
190  this->float_similarity_type = aron::similarity::FloatSimilarity::Type::NONE;
192  }
193  else if (type_string == "Cosine")
194  {
196  this->float_similarity_type = aron::similarity::FloatSimilarity::Type::NONE;
198  }
199  else
200  {
201  ARMARX_WARNING << "Undefined similarity measure detected in JSON file";
203  this->float_similarity_type = aron::similarity::FloatSimilarity::Type::NONE;
204  }
205  ARMARX_INFO << VAROUT(this->similarity_type);
206  }
207  if (json.find(PARAM_MAX_OBJECTS) != json.end())
208  {
209  max_images = json.at(PARAM_MAX_OBJECTS);
210  ARMARX_INFO << VAROUT(max_images);
211  stats.number_of_compared_objects = max_images;
212  }
213 
214  stats.start_time = std::chrono::high_resolution_clock::now();
215  }
216 
219  {
220  return stats;
221  }
222 
223  std::string
225  {
226  return this->NAME;
227  }
228 
229 } // namespace armarx::armem::server::ltm::processor::filter
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::NAME
static const constexpr char * NAME
Definition: EqualityFilter.h:21
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::getFilterStatistics
FilterStatistics getFilterStatistics() override
Definition: EqualityFilter.cpp:218
armarx::aron::data::Descriptor::NDARRAY
@ NDARRAY
armarx::aron::similarity::NDArraySimilarity::CHERNOFF
@ CHERNOFF
Definition: NDArraySimilarity.h:14
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::end_time
std::chrono::high_resolution_clock::time_point end_time
Definition: Filter.h:43
EqualityFilter.h
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::PARAM_THRESHOLD
static const constexpr char * PARAM_THRESHOLD
Definition: EqualityFilter.h:22
armarx::armem::wm::EntityInstance
Client-side working entity instance.
Definition: memory_definitions.h:32
armarx::armem::base::EntitySnapshotBase::forEachInstance
bool forEachInstance(InstanceFunctionT &&func)
Definition: EntitySnapshotBase.h:178
armarx::max
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
Definition: VectorHelpers.h:297
armarx::aron::data::NDArrayPtr
std::shared_ptr< NDArray > NDArrayPtr
Definition: NDArray.h:46
armarx::aron::data::Descriptor
Descriptor
Definition: Descriptor.h:179
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::rejected
double rejected
Definition: Filter.h:38
armarx::aron::data::Descriptor::FLOAT
@ FLOAT
armarx::aron::data::detail::SpecializedVariantBase< data::dto::Dict, Dict >::DynamicCastAndCheck
static PointerType DynamicCastAndCheck(const VariantPtr &n)
Definition: SpecializedVariant.h:134
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
armarx::aron::similarity::FloatSimilarity::MAE
@ MAE
Definition: FloatSimilarity.h:13
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::number_of_compared_objects
int number_of_compared_objects
Definition: Filter.h:44
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::start_time
std::chrono::high_resolution_clock::time_point start_time
Definition: Filter.h:42
Float.h
armarx::armem::wm::EntitySnapshot
Client-side working memory entity snapshot.
Definition: memory_definitions.h:80
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::getName
std::string getName() override
Definition: EqualityFilter.cpp:224
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:41
armarx::aron::similarity::NDArraySimilarity::COSINE
@ COSINE
Definition: NDArraySimilarity.h:15
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::configure
void configure(const nlohmann::json &json) override
Definition: EqualityFilter.cpp:163
armarx::aron::similarity::FloatSimilarity::MSE
@ MSE
Definition: FloatSimilarity.h:12
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::aron::similarity::FloatSimilarity::NONE
@ NONE
Definition: FloatSimilarity.h:14
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::additional_info
std::string additional_info
Definition: Filter.h:40
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::similarity_type
aron::similarity::NDArraySimilarity::Type similarity_type
Definition: Filter.h:41
armarx::aron::similarity::NDArraySimilarity::calculate_similarity_multi
double calculate_similarity_multi(std::vector< armarx::aron::data::NDArrayPtr > images, armarx::aron::data::NDArrayPtr p, Type type)
calculate_similarity_multi compares the image p with all images from the images vector,...
Definition: NDArraySimilarity.cpp:56
distance
double distance(const Point &a, const Point &b)
Definition: point.hpp:95
armarx::armem::server::ltm::processor::filter
Definition: EqualityFilter.cpp:10
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::accept
virtual bool accept(const armem::wm::EntitySnapshot &e, bool simulatedVersion) override
Definition: EqualityFilter.cpp:13
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics
Definition: Filter.h:35
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::base::EntityInstanceBase::data
const DataT & data() const
Definition: EntityInstanceBase.h:129
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::PARAM_SIM_MEASURE
static const constexpr char * PARAM_SIM_MEASURE
Definition: EqualityFilter.h:23
armarx::armem::server::ltm::processor::filter::SnapshotSimilarityFilter::PARAM_MAX_OBJECTS
static const constexpr char * PARAM_MAX_OBJECTS
Definition: EqualityFilter.h:24
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::accepted
double accepted
Definition: Filter.h:37
NDArray.h
armarx::armem::server::ltm::processor::SnapshotFilter::FilterStatistics::additional_time
std::chrono::duration< double > additional_time
Definition: Filter.h:39