concordia-server/mgiza-aligner/mgiza/mgizapp/src/Parameter.h
2017-01-21 17:07:36 +01:00

260 lines
8.6 KiB
C++

/*
Copyright (C) 1997,1998,1999,2000,2001 Franz Josef Och (RWTH Aachen - Lehrstuhl fuer Informatik VI)
This file is part of GIZA++ ( extension of GIZA ).
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 PARAMETER_H_DEFINED
#define PARAMETER_H_DEFINED
#include "mystl.h"
#include <set>
#include "Pointer.h"
#include <string>
#include "Globals.h"
#include <fstream>
#include <cstring>
#ifdef WIN32
#define strcasecmp _strcmpi
#endif
inline unsigned int mConvert(const string&s,unsigned int &i)
{
if( strcasecmp(s.c_str(),"yes")==0 || strcasecmp(s.c_str(),"y")==0 || strcasecmp(s.c_str(),"true")==0 || strcasecmp(s.c_str(),"t")==0 ) {
cerr << "TRUE\n";
return i=1;
}
if( strcasecmp(s.c_str(),"no")==0 || strcasecmp(s.c_str(),"n")==0 || strcasecmp(s.c_str(),"false")==0 || strcasecmp(s.c_str(),"f")==0 ) {
cerr << "FALSE\n";
return i=0;
}
return i=atoi(s.c_str());
}
inline int mConvert(const string&s,int &i)
{
if( strcasecmp(s.c_str(),"yes")==0 || strcasecmp(s.c_str(),"y")==0 || strcasecmp(s.c_str(),"true")==0 || strcasecmp(s.c_str(),"t")==0 ) {
cerr << "TRUE\n";
return i=1;
}
if( strcasecmp(s.c_str(),"no")==0 || strcasecmp(s.c_str(),"n")==0 || strcasecmp(s.c_str(),"false")==0 || strcasecmp(s.c_str(),"f")==0 ) {
cerr << "FALSE\n";
return i=0;
}
return i=atoi(s.c_str());
}
inline double mConvert(const string&s,double &d)
{
return d=atof(s.c_str());
}
inline double mConvert(const string&s,float &d)
{
return d=atof(s.c_str());
}
inline string mConvert(const string&s,string&n)
{
return n=s;
}
inline bool mConvert(const string&s,bool&n)
{
if( strcasecmp(s.c_str(),"yes")==0 || strcasecmp(s.c_str(),"y")==0 || strcasecmp(s.c_str(),"true")==0 || strcasecmp(s.c_str(),"t")==0 ) {
cerr << "TRUE\n";
return n=1;
}
if( strcasecmp(s.c_str(),"no")==0 || strcasecmp(s.c_str(),"n")==0 || strcasecmp(s.c_str(),"false")==0 || strcasecmp(s.c_str(),"f")==0 ) {
cerr << "FALSE\n";
return n=0;
}
return n=atoi(s.c_str());
}
inline short mConvert(const string&s,short&n)
{
if( strcasecmp(s.c_str(),"yes")==0 || strcasecmp(s.c_str(),"y")==0 || strcasecmp(s.c_str(),"true")==0 || strcasecmp(s.c_str(),"t")==0 ) {
cerr << "TRUE\n";
return n=1;
}
if( strcasecmp(s.c_str(),"no")==0 || strcasecmp(s.c_str(),"n")==0 || strcasecmp(s.c_str(),"false")==0 || strcasecmp(s.c_str(),"f")==0 ) {
cerr << "FALSE\n";
return n=0;
}
return n=atoi(s.c_str());
}
inline unsigned short mConvert(const string&s,unsigned short&n)
{
if( strcasecmp(s.c_str(),"yes")==0 || strcasecmp(s.c_str(),"y")==0 || strcasecmp(s.c_str(),"true")==0 || strcasecmp(s.c_str(),"t")==0 ) {
cerr << "TRUE\n";
return n=1;
}
if( strcasecmp(s.c_str(),"no")==0 || strcasecmp(s.c_str(),"n")==0 || strcasecmp(s.c_str(),"false")==0 || strcasecmp(s.c_str(),"f")==0 ) {
cerr << "FALSE\n";
return n=0;
}
return n=atoi(s.c_str());
}
string simpleString(const string s);
inline int Hashstring(const string& s)
{
int sum=0;
string::const_iterator i=s.begin(),end=s.end();
for(; i!=end; i++)sum=5*sum+(*i);
return sum;
}
class _Parameter
{
protected:
string name;
bool *ifChanged;
string description;
int level;
bool filename;
public:
int onlyCopy;
_Parameter(string n,bool&b,string desc,int _level,bool _onlyCopy)
: name(simpleString(n)),ifChanged(&b),description(desc),level(_level),filename(0),onlyCopy(_onlyCopy) {}
virtual ~_Parameter() {};
bool operator==(const string&s)const {
return name== simpleString(s);
}
void setChanged() {
*ifChanged=true;
}
virtual bool setParameter(string s2,int)=0;
virtual ostream&printAt(ostream&out)=0;
virtual ostream&printValue(ostream&out)=0;
const string&getString() const {
return name;
}
int getLevel() const {
return level;
}
bool isFilename() {
return filename;
}
void setFilename(bool x=1) {
filename=x;
}
friend bool operator==(const _Parameter&a,const _Parameter&b) {
return a.name==b.name;
}
friend bool operator<(const _Parameter&a,const _Parameter&b) {
return a.name<b.name;
}
friend int Hash(const _Parameter&aaa) {
return Hashstring(aaa.name);
}
friend ostream&operator<<(ostream&out,const _Parameter&p) {
return out<<"Parameter: "<<p.name <<endl;
}
};
template<class T>
class Parameter : public _Parameter
{
private:
T*t;
public:
Parameter(string n,bool&b,string desc,T&_t,int level=0,bool onlyCopy=0)
: _Parameter(n,b,desc,level,onlyCopy),t(&_t) {}
virtual ~Parameter() {}
virtual bool setParameter(string s2,int verb) {
T x;
if( !(*t==mConvert(s2,x))) {
bool printedFirst=0;
if( verb>1 ) {
cout << "Parameter '"<<name <<"' changed from '"<<*t<<"' to '";
printedFirst=1;
}
mConvert(s2,*t);
if( printedFirst )
cout << *t <<"'\n";
setChanged();
return 1;
}
return 0;
}
virtual ostream&printAt(ostream&out) {
return out << name << " = " << *t << " (" << description << ")";
}
virtual ostream&printValue(ostream&out) {
return out << *t;
}
};
typedef MP<_Parameter> ParPtr;
class ParSet : public set<ParPtr>
{
public:
void insert(const ParPtr&x) {
if( count(x)!=0 )
cerr << "ERROR: element " << x->getString() << " already inserted.\n";
set<ParPtr>::insert(x);
}
};
bool makeSetCommand(string s1,string s2,const ParSet&pars,int verb=1,int level= -1);
ostream&printPars(ostream&out,const ParSet&pars,int level=-1);
bool writeParameters(ofstream&of,const ParSet&parset,int level=0);
bool readParameters(ifstream&f,const ParSet&parset,int verb=2,int level=0);
ParSet&getGlobalParSet();
extern bool ParameterChangedFlag;
template<class T>const T&addGlobalParameter(const char *name,const char *description,int level,T*adr,const T&init)
{
*adr=init;
getGlobalParSet().insert(new Parameter<T>(name,ParameterChangedFlag,description,*adr,level));
return init;
}
template<class T>const T&addGlobalParameter(const char *name,const char *name2,const char *description,int level,T*adr,const T&init)
{
*adr=init;
getGlobalParSet().insert(new Parameter<T>(name,ParameterChangedFlag,description,*adr,level));
getGlobalParSet().insert(new Parameter<T>(name2,ParameterChangedFlag,description,*adr,-1));
return init;
}
template<class T>const T&addGlobalParameter(const char *name,const char *name2,const char *name3,const char *description,int level,T*adr,const T&init)
{
*adr=init;
getGlobalParSet().insert(new Parameter<T>(name,ParameterChangedFlag,description,*adr,level));
getGlobalParSet().insert(new Parameter<T>(name2,ParameterChangedFlag,description,*adr,-1));
getGlobalParSet().insert(new Parameter<T>(name3,ParameterChangedFlag,description,*adr,-1));
return init;
}
template<class T>const T&addGlobalParameter(const char *name,const char *name2,const char *name3,const char *name4,const char *description,int level,T*adr,const T&init)
{
*adr=init;
getGlobalParSet().insert(new Parameter<T>(name,ParameterChangedFlag,description,*adr,level));
getGlobalParSet().insert(new Parameter<T>(name2,ParameterChangedFlag,description,*adr,-1));
getGlobalParSet().insert(new Parameter<T>(name3,ParameterChangedFlag,description,*adr,-1));
getGlobalParSet().insert(new Parameter<T>(name4,ParameterChangedFlag,description,*adr,-1));
return init;
}
void MakeParameterOptimizing(istream&file,string resultingParameters);
#define GLOBAL_PARAMETER(TYP,VARNAME,NAME,DESCRIPTION,LEVEL,INIT) TYP VARNAME=addGlobalParameter< TYP >(NAME,DESCRIPTION,LEVEL,&VARNAME,INIT);
#define GLOBAL_PARAMETER2(TYP,VARNAME,NAME,NAME2,DESCRIPTION,LEVEL,INIT) TYP VARNAME=addGlobalParameter< TYP >(NAME,NAME2,DESCRIPTION,LEVEL,&VARNAME,INIT);
#define GLOBAL_PARAMETER3(TYP,VARNAME,NAME,NAME2,NAME3,DESCRIPTION,LEVEL,INIT) TYP VARNAME=addGlobalParameter< TYP >(NAME,NAME2,NAME3,DESCRIPTION,LEVEL,&VARNAME,INIT);
#define GLOBAL_PARAMETER4(TYP,VARNAME,NAME,NAME2,NAME3,NAME4,DESCRIPTION,LEVEL,INIT) TYP VARNAME=addGlobalParameter< TYP >(NAME,NAME2,NAME3,NAME4,DESCRIPTION,LEVEL,&VARNAME,INIT);
void setParameterLevelName(unsigned int i,string x);
#endif