/* * RenderItemMatcher.hpp * * Created on: Feb 16, 2009 * Author: struktured */ #ifndef RenderItemMatcher_HPP #define RenderItemMatcher_HPP #include "RenderItemDistanceMetric.hpp" #include #include #include #include "HungarianMethod.hpp" typedef std::vector > RenderItemMatchList; class MatchResults; class RenderItemMatcher : public std::binary_function { public: struct MatchResults { RenderItemMatchList matches; std::vector unmatchedLeft; std::vector 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 _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