diff options
Diffstat (limited to 'vest/line_optimizer.cc')
-rw-r--r-- | vest/line_optimizer.cc | 109 |
1 files changed, 0 insertions, 109 deletions
diff --git a/vest/line_optimizer.cc b/vest/line_optimizer.cc deleted file mode 100644 index 7303df8d..00000000 --- a/vest/line_optimizer.cc +++ /dev/null @@ -1,109 +0,0 @@ -#include "line_optimizer.h" - -#include <limits> -#include <algorithm> - -#include "sparse_vector.h" -#include "scorer.h" - -using namespace std; - -typedef ErrorSurface::const_iterator ErrorIter; - -// sort by increasing x-ints -struct IntervalComp { - bool operator() (const ErrorIter& a, const ErrorIter& b) const { - return a->x < b->x; - } -}; - -double LineOptimizer::LineOptimize( - const vector<ErrorSurface>& surfaces, - const LineOptimizer::ScoreType type, - float* best_score, - const double epsilon) { - // cerr << "MIN=" << MINIMIZE_SCORE << " MAX=" << MAXIMIZE_SCORE << " MINE=" << type << endl; - vector<ErrorIter> all_ints; - for (vector<ErrorSurface>::const_iterator i = surfaces.begin(); - i != surfaces.end(); ++i) { - const ErrorSurface& surface = *i; - for (ErrorIter j = surface.begin(); j != surface.end(); ++j) - all_ints.push_back(j); - } - sort(all_ints.begin(), all_ints.end(), IntervalComp()); - double last_boundary = all_ints.front()->x; - ScoreP accp = all_ints.front()->delta->GetZero(); - Score *acc=accp.get(); - float& cur_best_score = *best_score; - cur_best_score = (type == MAXIMIZE_SCORE ? - -numeric_limits<float>::max() : numeric_limits<float>::max()); - bool left_edge = true; - double pos = numeric_limits<double>::quiet_NaN(); - for (vector<ErrorIter>::iterator i = all_ints.begin(); - i != all_ints.end(); ++i) { - const ErrorSegment& seg = **i; - assert(seg.delta); - if (seg.x - last_boundary > epsilon) { - float sco = acc->ComputeScore(); - if ((type == MAXIMIZE_SCORE && sco > cur_best_score) || - (type == MINIMIZE_SCORE && sco < cur_best_score) ) { - cur_best_score = sco; - if (left_edge) { - pos = seg.x - 0.1; - left_edge = false; - } else { - pos = last_boundary + (seg.x - last_boundary) / 2; - } - // cerr << "NEW BEST: " << pos << " (score=" << cur_best_score << ")\n"; - } - // string xx; acc->ScoreDetails(&xx); cerr << "---- " << xx; - // cerr << "---- s=" << sco << "\n"; - last_boundary = seg.x; - } - // cerr << "x-boundary=" << seg.x << "\n"; - acc->PlusEquals(*seg.delta); - } - float sco = acc->ComputeScore(); - if ((type == MAXIMIZE_SCORE && sco > cur_best_score) || - (type == MINIMIZE_SCORE && sco < cur_best_score) ) { - cur_best_score = sco; - if (left_edge) { - pos = 0; - } else { - pos = last_boundary + 1000.0; - } - } - return pos; -} - -void LineOptimizer::RandomUnitVector(const vector<int>& features_to_optimize, - SparseVector<double>* axis, - RandomNumberGenerator<boost::mt19937>* rng) { - axis->clear(); - for (int i = 0; i < features_to_optimize.size(); ++i) - axis->set_value(features_to_optimize[i], rng->NextNormal(0.0,1.0)); - (*axis) /= axis->l2norm(); -} - -void LineOptimizer::CreateOptimizationDirections( - const vector<int>& features_to_optimize, - int additional_random_directions, - RandomNumberGenerator<boost::mt19937>* rng, - vector<SparseVector<double> >* dirs - , bool include_orthogonal - ) { - dirs->clear(); - typedef SparseVector<double> Dir; - vector<Dir> &out=*dirs; - int i=0; - if (include_orthogonal) - for (;i<features_to_optimize.size();++i) { - Dir d; - d.set_value(features_to_optimize[i],1.); - out.push_back(d); - } - out.resize(i+additional_random_directions); - for (;i<out.size();++i) - RandomUnitVector(features_to_optimize, &out[i], rng); - cerr << "Generated " << out.size() << " total axes to optimize along.\n"; -} |