blob: 6b6eccaa0a3cc7b906feef57a13a8a83c9dad959 [file] [log] [blame]
/*
* RenderItemMatcher.hpp
*
* Created on: Feb 16, 2009
* Author: struktured
*/
#ifndef RenderItemMatcher_HPP
#define RenderItemMatcher_HPP
#include "RenderItemDistanceMetric.hpp"
#include <vector>
#include <map>
#include <iostream>
#include "HungarianMethod.hpp"
typedef std::vector<std::pair<RenderItem*, RenderItem*> > RenderItemMatchList;
class MatchResults;
class RenderItemMatcher : public std::binary_function<RenderItemList, RenderItemList, MatchResults> {
public:
struct MatchResults {
RenderItemMatchList matches;
std::vector<RenderItem*> unmatchedLeft;
std::vector<RenderItem*> unmatchedRight;
double error;
};
static const std::size_t MAXIMUM_SET_SIZE = 1000;
/// Computes an optimal matching between two renderable item sets.
/// @param lhs the "left-hand side" list of render items.
/// @param rhs the "right-hand side" list of render items.
/// @returns a list of match pairs, possibly self referencing, and an error estimate of the matching.
inline virtual void operator()(const RenderItemList & lhs, const RenderItemList & rhs) const
{
// Ensure the first argument is greater than next to aid the helper function's logic.
if (lhs.size() >= rhs.size()) {
_results.error = computeMatching(lhs, rhs);
setMatches(lhs, rhs);
} else {
_results.error = computeMatching(rhs, lhs);
setMatches(rhs, lhs);
}
}
RenderItemMatcher() {}
virtual ~RenderItemMatcher() {}
inline MatchResults & matchResults() { return _results; }
inline double weight(int i, int j) const { return _weights[i][j]; }
MasterRenderItemDistance & distanceFunction() { return _distanceFunction; }
private:
mutable HungarianMethod<MAXIMUM_SET_SIZE> _hungarianMethod;
mutable double _weights[MAXIMUM_SET_SIZE][MAXIMUM_SET_SIZE];
mutable MatchResults _results;
/// @idea interface this entirely allow overriding of its type.
mutable MasterRenderItemDistance _distanceFunction;
double computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const;
void setMatches(const RenderItemList & lhs_src, const RenderItemList & rhs_src) const;
};
#endif