wuxing0105's picture
Upload folder using huggingface_hub
8efb4bd verified
Raw
History Blame Contribute Delete
9.04 kB
#include <iostream>
#include <sstream>
#include <vector>
#include "Parameters.h"
#include <boost/algorithm/string.hpp>
typedef Parameters::ParamType ParamType;
class Parameter
{
public:
Parameter();
Parameter(const std::string& name, const int val);
Parameter(const std::string& name, const float val);
Parameter(const std::string& name, const std::string& val);
Parameter(const Parameter& param);
void dump(FILE* outputFile) const;
~Parameter() {}
const std::string& paramLabel() const;
ParamType paramType() const;
int intValue() const;
float floatValue() const;
const std::string& stringValue() const;
Parameter& operator=(const Parameter& param);
friend bool operator<(const Parameter& p, const Parameter& q);
friend std::ostream& operator<<(std::ostream& out, const Parameter& p);
private:
std::string paramName;
ParamType type;
union {
int i;
float f;
};
std::string s;
};
typedef std::vector<Parameter> ParamList;
static ParamList paramList;
Parameter::Parameter() : paramName(), type(Parameters::Undef)
{}
Parameter::Parameter(const std::string& name, const int val)
{
paramName = name;
i = val;
type = Parameters::Int;
}
Parameter::Parameter(const std::string& name, const float val)
{
paramName = name;
f = val;
type = Parameters::Float;
}
Parameter::Parameter(const std::string& name, const std::string& val)
{
paramName = name;
s = val;
type = Parameters::Str;
}
Parameter::Parameter(const Parameter& param)
{
paramName = param.paramName;
type = param.type;
if (type == Parameters::Int)
i = param.i;
else
f = param.f;
s = param.s;
}
const std::string& Parameter::paramLabel() const
{
return paramName;
}
ParamType Parameter::paramType() const
{
return type;
}
int Parameter::intValue() const
{
return i;
}
float Parameter::floatValue() const
{
return f;
}
const std::string& Parameter::stringValue() const
{
return s;
}
Parameter& Parameter::operator=(const Parameter& param)
{
paramName = param.paramName;
type = param.type;
if (type == Parameters::Int)
i = param.i;
else
f = param.f;
s = param.s;
return *this;
}
bool operator<(const Parameter& p, const Parameter& q)
{
return (p.paramName < q.paramName);
}
std::ostream& operator<<(std::ostream& out, const Parameter& p) {
switch(p.type) {
case Parameters::Int:
return out << p.paramName << '\t' << "(Int)" << '\t' << p.i;
case Parameters::Float:
return out << p.paramName << '\t' << "(Float)" << '\t' << p.f;
case Parameters::Str:
return out << p.paramName << '\t' << "(Str)" << '\t' << p.s;
case Parameters::Undef:
break;
}
return out << '\n';
}
void Parameter::dump(FILE* outputFile) const {
switch(type) {
case Parameters::Int:
fprintf(outputFile, "%s = %d", paramName.c_str(), i);
case Parameters::Float:
fprintf(outputFile, "%s = %f", paramName.c_str(), f);
case Parameters::Str:
fprintf(outputFile, "%s = %s", paramName.c_str(), s.c_str());
case Parameters::Undef:
break;
}
}
ParamList::iterator findInsertionPoint(ParamList& paramList,
const std::string& paramName)
{
unsigned short start = 0;
unsigned short stop = (unsigned short)paramList.size();
while (stop != start) {
unsigned short pos = start + (stop-start)/2;
int comp = paramName.compare(paramList[pos].paramLabel());
if (comp == 0)
stop = start = pos;
else if (comp > 0)
start = pos + 1;
else
stop = pos;
}
ParamList::iterator it=paramList.begin();
it+=stop;
return it;
}
Parameters::Parameters()
{}
void Parameters::readParameters(std::istream& paramStream)
{
while (!paramStream.eof()) {
std::string param;
getline(paramStream, param);
boost::trim(param);
std::string paramName = nextToken(param);
if (paramName.length() == 0) continue;
if (*(paramName.data()) == '#') continue;
updateParameter(paramName, param.c_str());
}
}
bool Parameters::empty() {
return paramList.empty();
}
void Parameters::addParameter(const std::string& paramName, const int value)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
(*pos) = Parameter(paramName, value);
else
paramList.insert(pos, Parameter(paramName, value));
}
void Parameters::addParameter(const std::string& paramName, const double value)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
(*pos) = Parameter(paramName, (float)value);
else
paramList.insert(pos, Parameter(paramName, (float)value));
}
void Parameters::addParameter(const std::string& paramName, const std::string& value)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
(*pos) = Parameter(paramName, value);
else
paramList.insert(pos, Parameter(paramName, value));
}
void Parameters::updateParameter(const std::string& paramName,
const char* const value)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
switch ((*pos).paramType()) {
case Int:
(*pos) = Parameter(paramName, atoi(value));
break;
case Float:
(*pos) = Parameter(paramName, (float)atof(value));
break;
case Str:
(*pos) = Parameter(paramName, std::string(value));
case Undef:
(*pos) = Parameter(paramName, std::string(value));
}
else
paramList.insert(pos, Parameter(paramName, std::string(value)));
}
ParamType Parameters::paramType(const std::string& paramName)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
return (*pos).paramType();
else
return Undef;
}
int Parameters::getInt(const std::string& paramName, const int& defaultValue)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
switch ((*pos).paramType()) {
case Int:
return (*pos).intValue();
case Float:
return (int)(*pos).floatValue();
case Str:
return atoi((*pos).stringValue().data());
case Undef:
break;
}
return defaultValue;
}
float Parameters::getFloat(const std::string& paramName, const float& defaultValue)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
switch ((*pos).paramType()) {
case Float:
return (*pos).floatValue();
case Int:
return (float)(*pos).intValue();
case Str:
return (float)atof((*pos).stringValue().data());
case Undef:
break;
}
return defaultValue;
}
std::string Parameters::getString(const std::string& paramName, const std::string& defaultValue)
{
ParamList::iterator pos = findInsertionPoint(paramList, paramName);
if (pos != paramList.end() && (*pos).paramLabel() == paramName)
switch ((*pos).paramType()) {
case Str:
return (*pos).stringValue();
case Float: {
return std::to_string((*pos).floatValue());
}
case Int: {
return std::to_string((*pos).intValue());
}
case Undef:
break;
}
return defaultValue;
}
void Parameters::dump(std::ostream& out)
{
for (ParamList::iterator i=paramList.begin(); i != paramList.end(); ++i)
out << *i << '\n';
}
void Parameters::dump(DebugStream& out, const unsigned int msgLevel)
{
for (ParamList::iterator i=paramList.begin(); i != paramList.end(); ++i)
out(msgLevel) << *i;
}
void Parameters::dump(FILE* outputFile) {
for (ParamList::iterator i = paramList.begin() ; i != paramList.end() ; i++) {
i->dump(outputFile);
fprintf(outputFile, "\n");
}
fprintf(outputFile, "\n");
}
std::string Parameters::nextToken(std::string& str)
{
unsigned int start = 0;
while (start < str.length() &&
(str[start] == ' ' || str[start] == '\t' || str[start] == '\n'))
++start;
if (start >= str.length()) {
str = "";
return "";
}
unsigned int stop = start+1;
while (stop < str.length() &&
str[stop] != ' ' && str[stop] != '\t' && str[stop] != '\n')
++stop;
unsigned int next = stop;
while (next < str.length() &&
(str[next] == ' ' || str[next] == '\t' || str[next] == '\n'))
++next;
std::string result = str.substr((int)start, stop-start);
str = str.substr((int)next);
return result;
}