00001
00002
00003 #ifndef _PROBTABLE_TCC
00004 #define _PROBTABLE_TCC
00005
00006 #include "osl/category/probTable.h"
00007 #include "osl/category/categoryTraits.h"
00008
00009 #include <string>
00010 #include <algorithm>
00011 #include <iostream>
00012 #include <stdexcept>
00013 #include <cstdio>
00014 #include <cstring>
00015
00016 template <int IndexMax>
00017 osl::category::ProbTable<IndexMax>::
00018 ProbTable(const char *oslHome, const char *name)
00019 {
00020 filename[0] = '\0';
00021 std::string path(oslHome);
00022 path += "/data/category/";
00023 path += name;
00024 path += ".txt";
00025 init(path.c_str());
00026 }
00027
00028 template <int IndexMax>
00029 osl::category::ProbTable<IndexMax>::
00030 ProbTable()
00031 {
00032 filename[0] = '\0';
00033 std::fill(prob.begin(), prob.end(), CategoryTraits::maxProb());
00034 }
00035
00036 template <int IndexMax>
00037 osl::category::ProbTable<IndexMax>::
00038 ~ProbTable()
00039 {
00040 for (size_t i=0; i<indexMax(); ++i)
00041 {
00042 if (prob[i] == 0)
00043 std::cerr << i << " th elem was 0 in " << &filename[0] << "\n";
00044 }
00045 }
00046
00047 template <int IndexMax>
00048 void osl::category::ProbTable<IndexMax>::
00049 interpolate()
00050 {
00051 for (size_t i=0; i<indexMax(); ++i)
00052 {
00053 if (prob[i] == 0)
00054 {
00055
00056 prob[i] = CategoryTraits::maxProb();
00057 }
00058 }
00059 }
00060
00061 template <int IndexMax>
00062 void osl::category::ProbTable<IndexMax>::
00063 init(const char *filename)
00064 {
00065 strncpy(&this->filename[0], filename, 128);
00066 this->filename[127] = '\0';
00067
00068 min = CategoryTraits::maxProb();
00069 size_t i=0;
00070 FILE *fp = fopen(filename, "r");
00071 if (! fp)
00072 goto error;
00073 for (; i+4<indexMax(); i+=4)
00074 {
00075 int v0,v1,v2,v3;
00076 if (fscanf(fp, "%d %d %d %d", &v0,&v1,&v2,&v3) < 4)
00077 goto error;
00078 v0 = roundUp(v0);
00079 v1 = roundUp(v1);
00080 v2 = roundUp(v2);
00081 v3 = roundUp(v3);
00082 if (v0)
00083 min = std::min(min, v0);
00084 if (v1)
00085 min = std::min(min, v1);
00086 if (v2)
00087 min = std::min(min, v2);
00088 if (v3)
00089 min = std::min(min, v3);
00090 prob[i ] = v0;
00091 prob[i+1] = v1;
00092 prob[i+2] = v2;
00093 prob[i+3] = v3;
00094 }
00095 for (; i<indexMax(); ++i)
00096 {
00097 int val;
00098 if (fscanf(fp, "%d", &val) < 1)
00099 goto error;
00100 val = roundUp(val);
00101 if (val)
00102 min = std::min(min, val);
00103 prob[i] = val;
00104 }
00105 goto close;
00106 error:
00107 {
00108 std::cerr << "read failure in PieceValueTable::init"
00109 << "\n" << filename << "\n";
00110 throw std::runtime_error(std::string(filename)
00111 + " read failure in PieceValueTable::init");
00112 }
00113 close:
00114 if (fp)
00115 fclose(fp);
00116 }
00117
00118 #endif
00119
00120
00121
00122