|
|
|
|
|
#ifndef DLIB_SAMPLE_PaIR_Hh_ |
|
#define DLIB_SAMPLE_PaIR_Hh_ |
|
|
|
#include "sample_pair_abstract.h" |
|
#include <limits> |
|
#include "../serialize.h" |
|
|
|
namespace dlib |
|
{ |
|
|
|
|
|
|
|
class sample_pair |
|
{ |
|
public: |
|
sample_pair( |
|
) : |
|
_index1(0), |
|
_index2(0) |
|
{ |
|
_distance = 1; |
|
} |
|
|
|
sample_pair ( |
|
const unsigned long idx1, |
|
const unsigned long idx2 |
|
) |
|
{ |
|
_distance = 1; |
|
if (idx1 < idx2) |
|
{ |
|
_index1 = idx1; |
|
_index2 = idx2; |
|
} |
|
else |
|
{ |
|
_index1 = idx2; |
|
_index2 = idx1; |
|
} |
|
} |
|
|
|
sample_pair ( |
|
const unsigned long idx1, |
|
const unsigned long idx2, |
|
const double dist |
|
) |
|
{ |
|
_distance = dist; |
|
if (idx1 < idx2) |
|
{ |
|
_index1 = idx1; |
|
_index2 = idx2; |
|
} |
|
else |
|
{ |
|
_index1 = idx2; |
|
_index2 = idx1; |
|
} |
|
} |
|
|
|
const unsigned long& index1 ( |
|
) const { return _index1; } |
|
|
|
const unsigned long& index2 ( |
|
) const { return _index2; } |
|
|
|
const double& distance ( |
|
) const { return _distance; } |
|
|
|
private: |
|
unsigned long _index1; |
|
unsigned long _index2; |
|
double _distance; |
|
}; |
|
|
|
|
|
|
|
template <typename T> |
|
inline bool order_by_index ( |
|
const T& a, |
|
const T& b |
|
) |
|
{ |
|
return a.index1() < b.index1() || (a.index1() == b.index1() && a.index2() < b.index2()); |
|
} |
|
|
|
template <typename T> |
|
inline bool order_by_distance ( |
|
const T& a, |
|
const T& b |
|
) |
|
{ |
|
return a.distance() < b.distance(); |
|
} |
|
|
|
template <typename T> |
|
inline bool order_by_descending_distance ( |
|
const T& a, |
|
const T& b |
|
) |
|
{ |
|
return a.distance() > b.distance(); |
|
} |
|
|
|
template <typename T> |
|
bool order_by_distance_and_index ( |
|
const T& a, |
|
const T& b |
|
) |
|
{ |
|
return a.distance() < b.distance() || (a.distance() == b.distance() && order_by_index(a,b)); |
|
} |
|
|
|
|
|
|
|
inline bool operator == ( |
|
const sample_pair& a, |
|
const sample_pair& b |
|
) |
|
{ |
|
return a.index1() == b.index1() && a.index2() == b.index2(); |
|
} |
|
|
|
inline bool operator != ( |
|
const sample_pair& a, |
|
const sample_pair& b |
|
) |
|
{ |
|
return !(a == b); |
|
} |
|
|
|
|
|
|
|
inline void serialize ( |
|
const sample_pair& item, |
|
std::ostream& out |
|
) |
|
{ |
|
try |
|
{ |
|
serialize(item.index1(),out); |
|
serialize(item.index2(),out); |
|
serialize(item.distance(),out); |
|
} |
|
catch (serialization_error& e) |
|
{ |
|
throw serialization_error(e.info + "\n while serializing object of type sample_pair"); |
|
} |
|
} |
|
|
|
inline void deserialize ( |
|
sample_pair& item, |
|
std::istream& in |
|
) |
|
{ |
|
try |
|
{ |
|
unsigned long idx1, idx2; |
|
double dist; |
|
|
|
deserialize(idx1,in); |
|
deserialize(idx2,in); |
|
deserialize(dist,in); |
|
item = sample_pair(idx1, idx2, dist); |
|
} |
|
catch (serialization_error& e) |
|
{ |
|
throw serialization_error(e.info + "\n while deserializing object of type sample_pair"); |
|
} |
|
} |
|
|
|
|
|
|
|
} |
|
|
|
#endif |
|
|
|
|