00001
00005 #include <assert.h>
00006 #include "cascade.h"
00007
00008 namespace lemga {
00009
00010 bool Cascade::serialize (std::ostream& os, ver_list& vl) const {
00011 SERIALIZE_PARENT(Aggregating, os, vl, 1);
00012 assert(lm.size() == upper_margin.size() &&
00013 lm.size() == lower_margin.size());
00014 for (UINT i = 0; i < lm.size(); ++i)
00015 if (!(os << '(' << lower_margin[i] << ','
00016 << upper_margin[i] << ')' << ' ')) return false;
00017 return true;
00018 }
00019
00020 bool Cascade::unserialize (std::istream& is, ver_list& vl, const id_t& d) {
00021 if (d != id() && d != empty_id) return false;
00022 UNSERIALIZE_PARENT(Aggregating, is, vl, 1, v);
00023
00024 const UINT n = lm.size();
00025 upper_margin.resize(n);
00026 lower_margin.resize(n);
00027
00028 for (std::vector<REAL>::iterator
00029 pu = upper_margin.begin(), pl = lower_margin.begin();
00030 pu != upper_margin.end(); ++pu, ++pl)
00031 {
00032 char c;
00033 if (!(is >> c >> *pl >> c >> *pu >> c)) return false;
00034 if (*pl > *pu) return false;
00035 }
00036
00037 return true;
00038 }
00039
00040 Output Cascade::operator() (const Input& x) const {
00041 assert(n_in_agg > 0 && n_in_agg <= lm.size());
00042 assert(lm.size() == upper_margin.size() &&
00043 lm.size() == lower_margin.size());
00044
00045 for (UINT i = 0; i < n_in_agg-1; ++i) {
00046 assert(lm[i] != NULL);
00047 Output out = (*lm[i])(x);
00048 REAL b = belief(*lm[i], x, out);
00049
00050 if (b > upper_margin[i] || b < lower_margin[i])
00051 return out;
00052 }
00053
00054 return (*lm[n_in_agg-1])(x);
00055 }
00056
00058 REAL Cascade::belief (const LearnModel& l, const Input& x,
00059 const Output& y) const {
00060 assert(l(x) == y);
00061 assert(l.n_output() == 1);
00062 return y[0];
00063 }
00064
00065 }