/* -*- mode: c++ -*-
*/
/*
GIFT, a flexible content based image retrieval system.
Copyright (C) 1998, 1999, 2000 CUI, University of Geneva
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _CDISTANCECALCULATOR
#define _CDISTANCECALCULATOR
#include <functional>
#include "CPersistentTranslatedIndexMatrix.h"
#include <math.h>
#include "CProbabilisticSet.h"
#include "CSquasher.h"
template<class TTIterator,
class TTInserter,
class TTFunction>
void do_for_equal_first(const TTIterator& inBegin1,
const TTIterator& inEnd1,
const TTIterator& inBegin2,
const TTIterator& inEnd2,
TTInserter& inInserter,
const TTFunction& f){
TTIterator i=inBegin1;
TTIterator j=inBegin2;
//this algorithm assumes, that both the lists are sorted for their ID
//otherwhise NOTHING is assumed
while(i!=inEnd1 &&
j!=inEnd2 ){
if(i->first<j->first){
i++;
}else{
// i->first >= j->first
if(j->first<i->first){
j++;
}else{
// i.e. i->first == j->first holds
// output is squashing the difference of the distances,
// of elements with identical ID
inInserter=(make_pair(i->first,
f(i->second,
j->second)));
i++;
j++;
}
}
}
}
// for testing: nice and radical
//#define TTSquash CDiscreteSquasher
//more adapted to the real user...
//#define TTSquash CStandardSquasher
//template<class TTID,class TTContent,class TTSquasher>
class CDistanceCalculator{
///
CSquasher* mSquasher;
///replaced TTID and TTSquasher by int and float
typedef CPersistentTranslatedIndexMatrix<int,float> CContent;
///
typedef CContent::CIDContentPairList CIDtoDistanceList;
///
typedef CContent::CIndexList CIDList;
///
typedef int CID;
///
typedef CProbabilisticSet<CID> CSet;
///
CContent mContent;
public:
///
void setSquasher(CSquasher* inSquasher);
///
CSquasher* getSquasher();
///
CDistanceCalculator(const char* inFileName);
///
bool calculateDistances(const CID& inID,
CIDtoDistanceList& outDistances)const;
///
bool calculateRelativeAndSquash(const CID& inPlus,
const CID& inMinus,
CIDtoDistanceList& outDistances)const;
///
bool calculateRelativeAndSquash(const CSquasher& inSquasher,
const CID& inPlus,
const CID& inMinus,
CIDtoDistanceList& outDistances)const;
///
bool calculateRelativeAndSquash(const CID& inPositiveFeedback,
const CID& inNegativeFeedback,
CSet& outProbabilities)const;
///
bool calculateRelativeAndSquash(const CSquasher& inSquasher,
const CID& inPositiveFeedback,
const CID& inNegativeFeedback,
CSet& outProbabilities)const;
bool digestFeedback(CIDList const& inPositiveList,
CIDList const& inNegativeList,
CSet& );
///
operator bool()const;
};
#endif
Documentation generated by muellerw@pc7170 on Son Okt 8 16:04:40 CEST 2000