/* 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 #include "Pointer.h" #include #include "Globals.h" #include 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 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 '"< ParPtr; class ParSet : public set { public: void insert(const ParPtr&x) { if( count(x)!=0 ) cerr << "ERROR: element " << x->getString() << " already inserted.\n"; set::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; templateconst T&addGlobalParameter(const char *name,const char *description,int level,T*adr,const T&init) { *adr=init; getGlobalParSet().insert(new Parameter(name,ParameterChangedFlag,description,*adr,level)); return init; } templateconst T&addGlobalParameter(const char *name,const char *name2,const char *description,int level,T*adr,const T&init) { *adr=init; getGlobalParSet().insert(new Parameter(name,ParameterChangedFlag,description,*adr,level)); getGlobalParSet().insert(new Parameter(name2,ParameterChangedFlag,description,*adr,-1)); return init; } templateconst 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(name,ParameterChangedFlag,description,*adr,level)); getGlobalParSet().insert(new Parameter(name2,ParameterChangedFlag,description,*adr,-1)); getGlobalParSet().insert(new Parameter(name3,ParameterChangedFlag,description,*adr,-1)); return init; } templateconst 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(name,ParameterChangedFlag,description,*adr,level)); getGlobalParSet().insert(new Parameter(name2,ParameterChangedFlag,description,*adr,-1)); getGlobalParSet().insert(new Parameter(name3,ParameterChangedFlag,description,*adr,-1)); getGlobalParSet().insert(new Parameter(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