/*
 * 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
