Chemical Data Processing Library C++ API - Version 1.4.0
BulkSimilarityCalculator.hpp
Go to the documentation of this file.
1 /*
2  * BulkSimilarityCalculator.hpp
3  *
4  * This file is part of the Chemical Data Processing Toolkit
5  *
6  * Copyright (C) 2003 Thomas Seidel <thomas.seidel@univie.ac.at>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this library; see the file COPYING. If not, write to
20  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 
29 #ifndef CDPL_DESCR_BULKSIMILARITYCALCULATOR_HPP
30 #define CDPL_DESCR_BULKSIMILARITYCALCULATOR_HPP
31 
32 #include <vector>
33 #include <cstddef>
34 #include <functional>
35 #include <memory>
36 #include <utility>
37 #include <algorithm>
38 
39 #include <boost/iterator/indirect_iterator.hpp>
40 
42 #include "CDPL/Base/Exceptions.hpp"
43 
44 
45 namespace CDPL
46 {
47 
48  namespace Descr
49  {
50 
64  template <typename DT = Util::BitSet, typename SVT = double>
66  {
67 
68  public:
72  typedef DT Descriptor;
73 
77  typedef std::shared_ptr<DT> DescriptorPointer;
78 
82  typedef SVT SimilarityValue;
83 
87  typedef std::function<SVT(const DT&, const DT&)> SimilarityFunction;
88 
92  typedef std::pair<std::size_t, SVT> Result;
93 
97  typedef std::shared_ptr<BulkSimilarityCalculator> SharedPointer;
98 
99  private:
100  typedef std::vector<DescriptorPointer> DescriptorList;
101  typedef std::vector<Result> ResultList;
102 
103  public:
107  typedef boost::indirect_iterator<typename DescriptorList::const_iterator, DT>
109 
113  typedef boost::indirect_iterator<typename DescriptorList::iterator, DT>
115 
119  typedef typename ResultList::const_iterator ConstResultIterator;
120 
126 
132 
138 
144  template <typename SF>
145  BulkSimilarityCalculator(SF&& sim_func):
146  simFunc(std::forward<SF>(sim_func)) {}
147 
154 
161 
167 
173  template <typename SF>
174  void setSimilarityFunction(SF&& func);
175 
179  void clear();
180 
186 
192 
198 
204 
209  std::size_t getNumDescriptors() const;
210 
215  void addDescriptor(const Descriptor& descr);
216 
221  void addDescriptor(const DescriptorPointer& descr_ptr);
222 
228  bool containsDescriptor(const Descriptor& descr) const;
229 
236  const Descriptor& getDescriptor(std::size_t idx) const;
237 
243  void removeDescriptor(std::size_t idx);
244 
252 
259  void calculate(const Descriptor& descr, bool sort = false, bool sort_desc = true);
260 
266 
272 
277  ConstResultIterator begin() const;
278 
283  ConstResultIterator end() const;
284 
291  const Result& getResult(std::size_t idx) const;
292 
299  const SimilarityValue& getSimilarity(std::size_t idx) const;
300 
307  std::size_t getDescriptorIndex(std::size_t idx) const;
308 
309  private:
311  DescriptorList descriptors;
312  ResultList results;
313  };
314 
315  } // namespace Descr
316 } // namespace CDPL
317 
318 
319 // Implementation
320 
321 template <typename DT, typename SVT>
324 {
325  return simFunc;
326 }
327 
328 template <typename DT, typename SVT>
329 template <typename SF>
331 {
332  simFunc = std::forward<SF>(func);
333 }
334 
335 template <typename DT, typename SVT>
337 {
338  descriptors.clear();
339  results.clear();
340 }
341 
342 template <typename DT, typename SVT>
345 {
346  return descriptors.begin();
347 }
348 
349 template <typename DT, typename SVT>
352 {
353  return descriptors.end();
354 }
355 
356 template <typename DT, typename SVT>
359 {
360  return descriptors.begin();
361 }
362 
363 template <typename DT, typename SVT>
366 {
367  return descriptors.end();
368 }
369 
370 template <typename DT, typename SVT>
372 {
373  return descriptors.size();
374 }
375 
376 template <typename DT, typename SVT>
378 {
379  descriptors.emplace_back(DescriptorPointer(new Descriptor(descr)));
380 }
381 
382 template <typename DT, typename SVT>
384 {
385  descriptors.emplace_back(descr_ptr);
386 }
387 
388 template <typename DT, typename SVT>
390 {
391  for (auto& dp : descriptors)
392  if (*dp == descr)
393  return true;
394 
395  return false;
396 }
397 
398 template <typename DT, typename SVT>
401 {
402  if (idx >= descriptors.size())
403  throw Base::IndexError("BulkSimilarityCalculator: descriptor index out of bounds");
404 
405  return *descriptors[idx];
406 }
407 
408 template <typename DT, typename SVT>
410 {
411  if (idx >= descriptors.size())
412  throw Base::IndexError("BulkSimilarityCalculator: descriptor index out of bounds");
413 
414  descriptors.erase(descriptors.begin() + idx);
415 }
416 
417 template <typename DT, typename SVT>
420 {
421  auto& b_it = it.base();
422 
423  if ((b_it < descriptors.begin()) || (b_it >= descriptors.end()))
424  throw Base::RangeError("BulkSimilarityCalculator: descriptor iterator out of valid range");
425 
426  return descriptors.erase(b_it);
427 }
428 
429 template <typename DT, typename SVT>
430 void CDPL::Descr::BulkSimilarityCalculator<DT, SVT>::calculate(const Descriptor& descr, bool sort, bool sort_desc)
431 {
432  results.clear();
433  results.reserve(descriptors.size());
434 
435  for (std::size_t i = 0, num_descrs = descriptors.size(); i < num_descrs; i++)
436  results.emplace_back(i, simFunc(descr, *descriptors[i]));
437 
438  if (!sort)
439  return;
440 
441  if (sort_desc)
442  std::sort(results.begin(), results.end(),
443  [](const Result& r1, const Result& r2) {
444  return (r1.second > r2.second);
445  });
446  else
447  std::sort(results.begin(), results.end(),
448  [](const Result& r1, const Result& r2) {
449  return (r1.second < r2.second);
450  });
451 }
452 
453 template <typename DT, typename SVT>
456 {
457  return results.begin();
458 }
459 
460 template <typename DT, typename SVT>
463 {
464  return results.end();
465 }
466 
467 template <typename DT, typename SVT>
470 {
471  return results.begin();
472 }
473 
474 template <typename DT, typename SVT>
477 {
478  return results.end();
479 }
480 
481 template <typename DT, typename SVT>
484 {
485  if (idx >= results.size())
486  throw Base::IndexError("BulkSimilarityCalculator: result index out of bounds");
487 
488  return results[idx];
489 }
490 
491 template <typename DT, typename SVT>
494 {
495  if (idx >= results.size())
496  throw Base::IndexError("BulkSimilarityCalculator: result index out of bounds");
497 
498  return results[idx].second;
499 }
500 
501 template <typename DT, typename SVT>
503 {
504  if (idx >= results.size())
505  throw Base::IndexError("BulkSimilarityCalculator: result index out of bounds");
506 
507  return results[idx].first;
508 }
509 
510 #endif // CDPL_DESCR_BULKSIMILARITYCALCULATOR_HPP
Definition of exception classes.
Definition of functor classes for the calculation of various similarity and distance measures.
Thrown to indicate that an index is out of range.
Definition: Base/Exceptions.hpp:152
Thrown to indicate that a value is out of range.
Definition: Base/Exceptions.hpp:114
Calculator that performs a bulk pairwise comparison of a single query descriptor against a stored set...
Definition: BulkSimilarityCalculator.hpp:66
bool containsDescriptor(const Descriptor &descr) const
Tells whether a descriptor that compares equal to descr is stored.
Definition: BulkSimilarityCalculator.hpp:389
std::shared_ptr< BulkSimilarityCalculator > SharedPointer
A reference-counted smart pointer [SHPTR] for dynamically allocated BulkSimilarityCalculator instance...
Definition: BulkSimilarityCalculator.hpp:97
DescriptorIterator getDescriptorsBegin()
Returns a mutable iterator pointing to the first stored descriptor.
Definition: BulkSimilarityCalculator.hpp:344
ConstResultIterator begin() const
Returns a constant iterator pointing to the first result (range-based for support).
Definition: BulkSimilarityCalculator.hpp:469
const SimilarityValue & getSimilarity(std::size_t idx) const
Returns the similarity value of the result at the given index.
Definition: BulkSimilarityCalculator.hpp:493
const SimilarityFunction & getSimilarityFunction() const
Returns the currently configured similarity function.
Definition: BulkSimilarityCalculator.hpp:323
void removeDescriptor(std::size_t idx)
Removes the descriptor at index idx.
Definition: BulkSimilarityCalculator.hpp:409
DT Descriptor
The descriptor type.
Definition: BulkSimilarityCalculator.hpp:72
std::function< SVT(const DT &, const DT &)> SimilarityFunction
Type of the generic functor used to compute the similarity of two descriptors.
Definition: BulkSimilarityCalculator.hpp:87
boost::indirect_iterator< typename DescriptorList::const_iterator, DT > ConstDescriptorIterator
A constant iterator over the stored target descriptors.
Definition: BulkSimilarityCalculator.hpp:108
std::size_t getDescriptorIndex(std::size_t idx) const
Returns the index of the target descriptor referenced by the result at the given result index.
Definition: BulkSimilarityCalculator.hpp:502
const Result & getResult(std::size_t idx) const
Returns the result at the given index.
Definition: BulkSimilarityCalculator.hpp:483
std::pair< std::size_t, SVT > Result
A single calculation result: (target descriptor index, similarity value).
Definition: BulkSimilarityCalculator.hpp:92
void setSimilarityFunction(SF &&func)
Sets the similarity function.
Definition: BulkSimilarityCalculator.hpp:330
std::shared_ptr< DT > DescriptorPointer
A smart pointer to a stored descriptor.
Definition: BulkSimilarityCalculator.hpp:77
const Descriptor & getDescriptor(std::size_t idx) const
Returns the stored descriptor at index idx.
Definition: BulkSimilarityCalculator.hpp:400
ConstResultIterator getResultsBegin() const
Returns a constant iterator pointing to the first result of the last calculate() call.
Definition: BulkSimilarityCalculator.hpp:455
std::size_t getNumDescriptors() const
Returns the number of stored descriptors.
Definition: BulkSimilarityCalculator.hpp:371
BulkSimilarityCalculator & operator=(BulkSimilarityCalculator &&calc)=default
Move assignment operator.
BulkSimilarityCalculator(const BulkSimilarityCalculator &calc)=default
Copy constructor.
DescriptorIterator getDescriptorsEnd()
Returns a mutable iterator pointing one past the last stored descriptor.
Definition: BulkSimilarityCalculator.hpp:351
void addDescriptor(const Descriptor &descr)
Adds a copy of descr to the stored descriptor list.
Definition: BulkSimilarityCalculator.hpp:377
BulkSimilarityCalculator(SF &&sim_func)
Constructs the BulkSimilarityCalculator instance with the given similarity function.
Definition: BulkSimilarityCalculator.hpp:145
ResultList::const_iterator ConstResultIterator
A constant iterator over the calculation results.
Definition: BulkSimilarityCalculator.hpp:119
ConstResultIterator end() const
Returns a constant iterator pointing one past the last result (range-based for support).
Definition: BulkSimilarityCalculator.hpp:476
BulkSimilarityCalculator & operator=(const BulkSimilarityCalculator &calc)=default
Copy assignment operator.
void clear()
Removes all stored descriptors and calculation results.
Definition: BulkSimilarityCalculator.hpp:336
boost::indirect_iterator< typename DescriptorList::iterator, DT > DescriptorIterator
A mutable iterator over the stored target descriptors.
Definition: BulkSimilarityCalculator.hpp:114
ConstResultIterator getResultsEnd() const
Returns a constant iterator pointing one past the last result of the last calculate() call.
Definition: BulkSimilarityCalculator.hpp:462
SVT SimilarityValue
The similarity-value type.
Definition: BulkSimilarityCalculator.hpp:82
void calculate(const Descriptor &descr, bool sort=false, bool sort_desc=true)
Computes the similarity between the query descr and every stored descriptor.
Definition: BulkSimilarityCalculator.hpp:430
BulkSimilarityCalculator()=default
Constructs the BulkSimilarityCalculator instance with the default similarity function (TanimotoSimila...
BulkSimilarityCalculator(BulkSimilarityCalculator &&calc)=default
Move constructor.
Functor class for calculating Tanimoto Similarities [CITB] of bitsets and vectors.
Definition: SimilarityFunctors.hpp:46
The namespace of the Chemical Data Processing Library.