src/imslib/src/ims/calib/matchmatrix.h
21130c8c
 #ifndef IMS_MATCHMATRIX_H
 #define IMS_MATCHMATRIX_H
 
 #include <memory>
 #include <map>
 #include <ims/base/exception/exception.h>
 
 namespace ims {
 /**
  *
  * @author Tobias Marschall <Tobias.Marschall@CeBiTec.Uni-Bielefeld.DE>
  *
  */
 // TODO: where to put this one? Maybe there already is a IndexOutOfBounds Exception somewhere?!?
 ////////////////////////////////////////////////////////////////////////////////////////
 // Anton: temporary workaround is done, in order to compile the code with CC. Redesign is needed!
 class IndexOutOfBounds : public Exception {
 	public:
 		explicit IndexOutOfBounds() : Exception() { }
 		explicit IndexOutOfBounds(const std::string& msg) : Exception(msg) { }
 };
 
 class InvalidMatchMatrix : public Exception {
 	public:
 		explicit InvalidMatchMatrix() : Exception() { }
 		explicit InvalidMatchMatrix(const std::string& msg) : Exception(msg) { }
 };
 ////////////////////////////////////////////////////////////////////////////////////////
 // TODO: add excact reference to mentioned paper
 /** Represents a matrix which contains entries either 0 or 1 and has a staircase property.
  *  See Velis/Sebastians paper on recalibration for exact definition.
  */
 class MatchMatrix {
 private:
 	// The matrix is a staircase matrix, so we only store the start and the end
 	// of a run of 1s for each row. If a row is zero, start and end are set to -1
 	typedef struct {
 		// start of run of 1s
 		int start;
 		// end of run of 1s
 		int end;
 	} row_t;
 	row_t *matrix;
 	std::size_t rows;
 public:
 	/** Construct MatchMatrix with specified number of rows.
 	 *  The number of columns need not be known because of the staircase property.
 	 */
 	explicit MatchMatrix(std::size_t rows);
 	~MatchMatrix();
 
 	/** Set specified entry to 1. */
302c09cf
 	void set(std::size_t row, std::size_t column) /*throw (IndexOutOfBounds, InvalidMatchMatrix)*/;
21130c8c
 	/** Set specified entry to 0. */
302c09cf
 	void unset(std::size_t row, std::size_t column) /*throw (IndexOutOfBounds, InvalidMatchMatrix)*/;
21130c8c
 
 	/** Returns number of rows. */
 	std::size_t getRows();
 
 	/** Greedily compute one-to-one matches. */
 	std::auto_ptr<std::map<int,int> > countMatches();
 	/** Similar to countMatches() with the restriction, to allow only real one2one matches
 	 * (i.e. matches that are non-ambiguous).
 	 */
 	std::auto_ptr<std::map<int,int> > countMatchesRestrictive();
 };
 
 }
 
 #endif