Welcome to mirror list, hosted at ThFree Co, Russian Federation.

params.cpp « DynSAInclude « src « moses - github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4be3a167637b67661d23550c8e527e30191fc25c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#include "params.h"

namespace Moses {
// parameter constants
const std::string Parameters::kNotSetValue = "__NOT_SET__";

const int Parameters::kBoolValue = 0; 
const int Parameters::kIntValue = 1;
const int Parameters::kFloatValue = 2;
const int Parameters::kStringValue = 3;
const int Parameters::kUndefinedValue = -1;

const std::string Parameters::kTrueValue = "1";
const std::string Parameters::kFalseValue = "0";

Parameters::Parameters(const ParamDefs * paramdefs, const count_t paramNum) {
  initialize(paramdefs, paramNum);
}

Parameters::Parameters(int argc, char ** argv, const ParamDefs * paramdefs, 
    const count_t paramNum) {
  initialize(paramdefs, paramNum);
  loadParams(argc, argv);
}

void Parameters::initialize(const ParamDefs * paramdefs, const count_t paramNum) {
  for( count_t i = 0; i < paramNum; i++ ) {
    params_[paramdefs[i].name] = paramdefs[i]; // assign name
  }
  cerr << "Default parameter values:\n";
  iterate(params_, itr) 
    cerr << "\t" << itr->first << " --> " << itr->second.value << endl;
}

bool Parameters::loadParams(int argc, char ** argv) {
  // load params from commandline args
  //if( argc < 3 ) {
  //  fprintf(stderr, "ERROR: No parameters. Use \"-config\" or \"-f\" to specify configuration file.\n");
  //  return false;
  //}
  bool load_from_file = false;
  std::set<std::string> setParams;
  int jumpBy = 0;
  for( int i = 1; i < argc; i += jumpBy ) {
    std::string param = argv[i];
    if(param[0] != '-') {
      std::cerr << "Unknown parameter: " << param << std::endl;
      return false;
    }
    Utils::ltrim(param, "- ");
    // normalise parameter to long name
    param = normaliseParamName(param);
    // check if valid param name
    if(!isValidParamName(param)) {
      std::cerr << "Unknown param option \"" << param << "\"\n";
      exit(EXIT_FAILURE);
    }
    setParams.insert(param);  // needed to not overwrite param value if file is specified
    //if the parameter is of type booL no corresponding value
    if( getValueType(param) == kBoolValue ) {
      jumpBy = 1;
      CHECK(setParamValue(param, kTrueValue));
    } else { //not of type bool so must have corresponding value
      CHECK(i+1 < argc);
      jumpBy = 2;
      std::string val = argv[i+1];
      Utils::trim(val);
      if( param == "config" )
        load_from_file = true;      
      if(!setParamValue(param, val)) {
        std::cerr << "Invalid Param name->value " << param << "->" << val << std::endl;
        return false;
      }
    }
  }
  bool success = true;
  // load from file if specified
  if (load_from_file)
    success = loadParams(getParamValue("config"), setParams);
  return success;
}

std::string Parameters::normaliseParamName(const std::string & name) {
  // Map valid abbreviations to long names. Retain other names.
  if( params_.find(name) == params_.end() )
    iterate(params_, i) 
      if( i->second.abbrev == name ) 
        return i->first;
  return name;
}

int Parameters::getValueType(const std::string& name) {
  if(params_.find(name) != params_.end())
    return params_[name].type;
  return Parameters::kUndefinedValue;
}

bool Parameters::isValidParamName(const std::string & name) {
  return params_.find(name) != params_.end(); 
}

bool Parameters::setParamValue(const std::string& name, const std::string& val) {
  // TODO: Add basic type checking w verifyValueType() 
  bool set = isValidParamName(name); 
  if(set) { 
    params_[name].value = val;  
    std::cerr << "PARAM SET: "<< name << "=" << val << std::endl;
  }
  return( set );
}
std::string Parameters::getParamValue(const std::string& name) {
  std::string value = Parameters::kNotSetValue;
  if(isValidParamName(name))
    if(params_.find(name) != params_.end())
      value = params_[name].value;
    else if(getValueType(name) == kBoolValue)
      value = kFalseValue;
  return value;
}
std::string Parameters::getParam(const std::string& name) {
  return getParamValue(name);
/*void* Parameters::getParam(const std::string& name) {
  void* paramVal = 0;
  int type = getValueType(name);
  const char* sval = getParamValue(name).c_str();
  switch(type) {
    case kIntValue: {
      int ival = atoi(sval);
      paramVal = (void*)&ival;
      break;
    }
    case kFloatValue: {
      float fval = atof(sval);
      paramVal = (void*)&fval;
      break;
    }
    case kStringValue: {
      paramVal = (void*)sval;
      break;
    }
    case kBoolValue: {
      bool bval = sval == Parameters::kTrueValue ? true : false;
      paramVal = (void*)&bval;
      break;
    }
    default: // --> Parameters::kUndefinedValue 
      paramVal = (void*)sval; // will set to Parameters::kNotSetValue
  }
  return paramVal;*/
}
bool Parameters::verifyValueType(const std::string& name, const std::string& val) {
  // Implement basic type checking
  return true;
}

int Parameters::getParamCount() const {
  return params_.size();
}

/*
 * HAVE TO CHANGE loadParams() from file to not overwrite command lines but
 * override default if different*/
bool Parameters::loadParams(const std::string & file_path,
    std::set<std::string>& setParams) {
  // parameters loaded from file don't override cmd line paramters
  /*std::set<std::string>::iterator end = setParams.end();
  FileHandler file(file_path.c_str(), std::ios::in);
  std::string line, param;
  while ( getline(file, line) ) {
    Utils::trim(line);
    //ignore comments (lines beginning with '#') and empty lines
    if( line[0] == '#' || line.empty() ) continue;
    if( line[0] == '[' ) {
      Utils::trim(line, "-[]"); //remove brackets
      // normalise parameter names
      param = normaliseParamName(line);
      //handle boolean type parameters
      if(getValueType(param) == kBoolValue && setParams.find(param) == end)
        setParamValue(param, kTrueValue);
    } else {
      // TODO: verify that this works as intended
      if(setParams.find(param) == end) { // if param hasn't already been set in cmd line
        if(!setParamValue(param, line)) {
          std::cerr << "Invalid Param name->value " << param << "->" << line << std::endl;
          return false;
        }
      }
    }
  }*/
  return true;
}
/*
int Parameters::getCSVParams(const std::string & name, std::vector<std::string> & values) {
  // get param values(s) may be more than one separated by commas
  values.clear();
  if( isValidParamName(name) )
    if( params_.find(name) != params_.end() )
      return Utils::tokenizeToStr(params_.find(name)->second.c_str(), values, ",");
  return 0;
}

bool Parameters::checkParamIsSet(const std::string & name) {
  // Returns true for non-bool parameter that is set to anything.
  // Returns true for bool parameter only if set to true.
  if (getValueType(name) == kBoolValue)  // boolean value so check whether true
    return getParamValue(name) == kTrueValue;
  return (getParamValue(name) != kNotSetValue);
}

bool Parameters::printHelp(const std::string & name) {
  return true;
}

bool Parameters::printParams() {
  // print out parameters and values
  std::map<std::string, std::string>::iterator it;
  std::cerr << "User defined parameter settings:\n";
  for (it = params_.begin(); it != params_.end(); ++it)
    std::cerr << "\t" << it->first << "\t" << it->second << "\n";
  return true;
}
*/
}