00001 /* 00002 * ScoreStats.h 00003 * mert - Minimum Error Rate Training 00004 * 00005 * Created by Nicola Bertoldi on 13/05/08. 00006 * 00007 */ 00008 00009 #ifndef MERT_SCORE_STATS_H_ 00010 #define MERT_SCORE_STATS_H_ 00011 00012 #include <vector> 00013 #include <iosfwd> 00014 #include <cstdlib> 00015 #include <cstring> 00016 00017 #include "Types.h" 00018 00019 namespace MosesTuning 00020 { 00021 00022 00023 class ScoreStats 00024 { 00025 private: 00026 std::size_t m_available_size; 00027 std::size_t m_entries; 00028 00029 // TODO: Use smart pointer for exceptional-safety. 00030 scorestats_t m_array; 00031 00032 public: 00033 ScoreStats(); 00034 explicit ScoreStats(const std::size_t size); 00035 00036 ~ScoreStats(); 00037 00038 // We intentionally allow copying. 00039 ScoreStats(const ScoreStats &stats); 00040 ScoreStats& operator=(const ScoreStats &stats); 00041 00042 void Copy(const ScoreStats &stats); 00043 00044 bool isfull() const { 00045 return (m_entries < m_available_size) ? 0 : 1; 00046 } 00047 00048 void expand(); 00049 void add(ScoreStatsType v); 00050 00051 void clear() { 00052 std::memset((void*)m_array, 0, GetArraySizeWithBytes()); 00053 } 00054 00055 void reset() { 00056 m_entries = 0; 00057 clear(); 00058 } 00059 00060 ScoreStatsType get(std::size_t i) { 00061 return m_array[i]; 00062 } 00063 ScoreStatsType get(std::size_t i) const { 00064 return m_array[i]; 00065 } 00066 scorestats_t getArray() const { 00067 return m_array; 00068 } 00069 00070 void set(const std::string& str); 00071 00072 // Much more efficient than the above. 00073 void set(const std::vector<ScoreStatsType>& stats) { 00074 reset(); 00075 for (std::size_t i = 0; i < stats.size(); ++i) { 00076 add(stats[i]); 00077 } 00078 } 00079 00080 std::size_t bytes() const { 00081 return GetArraySizeWithBytes(); 00082 } 00083 00084 std::size_t GetArraySizeWithBytes() const { 00085 return m_entries * sizeof(ScoreStatsType); 00086 } 00087 00088 std::size_t size() const { 00089 return m_entries; 00090 } 00091 00092 std::size_t available() const { 00093 return m_available_size; 00094 } 00095 00096 void savetxt(const std::string &file); 00097 void savetxt(std::ostream* os); 00098 void savebin(std::ostream* os); 00099 void savetxt(); 00100 00101 void loadtxt(const std::string &file); 00102 void loadtxt(std::istream* is); 00103 void loadbin(std::istream* is); 00104 00108 friend std::ostream& operator<<(std::ostream& o, const ScoreStats& e); 00109 }; 00110 00111 bool operator==(const ScoreStats& s1, const ScoreStats& s2); 00112 00113 } 00114 00115 #endif // MERT_SCORE_STATS_H_