00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "Util.h"
00010 #include "ScoreStats.h"
00011 #include <fstream>
00012 #include <iostream>
00013
00014 using namespace std;
00015
00016 namespace
00017 {
00018 const int kAvailableSize = 8;
00019 }
00020
00021 namespace MosesTuning
00022 {
00023
00024
00025 ScoreStats::ScoreStats()
00026 : m_available_size(kAvailableSize), m_entries(0),
00027 m_array(new ScoreStatsType[m_available_size]) {}
00028
00029 ScoreStats::ScoreStats(const size_t size)
00030 : m_available_size(size), m_entries(size),
00031 m_array(new ScoreStatsType[m_available_size])
00032 {
00033 memset(m_array, 0, GetArraySizeWithBytes());
00034 }
00035
00036 ScoreStats::~ScoreStats()
00037 {
00038 delete [] m_array;
00039 m_array = NULL;
00040 }
00041
00042 void ScoreStats::Copy(const ScoreStats &stats)
00043 {
00044 m_available_size = stats.available();
00045 m_entries = stats.size();
00046 m_array = new ScoreStatsType[m_available_size];
00047 memcpy(m_array, stats.getArray(), GetArraySizeWithBytes());
00048 }
00049
00050 ScoreStats::ScoreStats(const ScoreStats &stats)
00051 {
00052 Copy(stats);
00053 }
00054
00055 ScoreStats& ScoreStats::operator=(const ScoreStats &stats)
00056 {
00057 delete [] m_array;
00058 Copy(stats);
00059 return *this;
00060 }
00061
00062 void ScoreStats::expand()
00063 {
00064 m_available_size *= 2;
00065 scorestats_t buf = new ScoreStatsType[m_available_size];
00066 memcpy(buf, m_array, GetArraySizeWithBytes());
00067 delete [] m_array;
00068 m_array = buf;
00069 }
00070
00071 void ScoreStats::add(ScoreStatsType v)
00072 {
00073 if (isfull()) expand();
00074 m_array[m_entries++]=v;
00075 }
00076
00077 void ScoreStats::set(const string& str)
00078 {
00079 reset();
00080 vector<string> out;
00081 Tokenize(str.c_str(), ' ', &out);
00082 for (vector<string>::const_iterator it = out.begin();
00083 it != out.end(); ++it) {
00084 add(ConvertStringToScoreStatsType(*it));
00085 }
00086 }
00087
00088 void ScoreStats::loadbin(istream* is)
00089 {
00090 is->read(reinterpret_cast<char*>(m_array),
00091 static_cast<streamsize>(GetArraySizeWithBytes()));
00092 }
00093
00094 void ScoreStats::loadtxt(istream* is)
00095 {
00096 string line;
00097 getline(*is, line);
00098 set(line);
00099 }
00100
00101 void ScoreStats::loadtxt(const string &file)
00102 {
00103 ifstream ifs(file.c_str(), ios::in);
00104 if (!ifs) {
00105 cerr << "Failed to open " << file << endl;
00106 exit(1);
00107 }
00108 istream* is = &ifs;
00109 loadtxt(is);
00110 }
00111
00112
00113 void ScoreStats::savetxt(const string &file)
00114 {
00115 ofstream ofs(file.c_str(), ios::out);
00116 ostream* os = &ofs;
00117 savetxt(os);
00118 }
00119
00120 void ScoreStats::savetxt(ostream* os)
00121 {
00122 *os << *this;
00123 }
00124
00125 void ScoreStats::savetxt()
00126 {
00127 savetxt(&cout);
00128 }
00129
00130 void ScoreStats::savebin(ostream* os)
00131 {
00132 os->write(reinterpret_cast<char*>(m_array),
00133 static_cast<streamsize>(GetArraySizeWithBytes()));
00134 }
00135
00136 ostream& operator<<(ostream& o, const ScoreStats& e)
00137 {
00138 for (size_t i=0; i< e.size(); i++)
00139 o << e.get(i) << " ";
00140 return o;
00141 }
00142
00143 bool operator==(const ScoreStats& s1, const ScoreStats& s2)
00144 {
00145 size_t size = s1.size();
00146
00147 if (size != s2.size())
00148 return false;
00149
00150 for (size_t k=0; k < size; k++) {
00151 if (s1.get(k) != s2.get(k))
00152 return false;
00153 }
00154
00155 return true;
00156 }
00157
00158 }