summaryrefslogtreecommitdiff
path: root/bordeaux/learning/stochastic_linear_ranker/native/sparse_weight_vector.h
diff options
context:
space:
mode:
Diffstat (limited to 'bordeaux/learning/stochastic_linear_ranker/native/sparse_weight_vector.h')
-rw-r--r--bordeaux/learning/stochastic_linear_ranker/native/sparse_weight_vector.h204
1 files changed, 0 insertions, 204 deletions
diff --git a/bordeaux/learning/stochastic_linear_ranker/native/sparse_weight_vector.h b/bordeaux/learning/stochastic_linear_ranker/native/sparse_weight_vector.h
deleted file mode 100644
index b5f1ff5af..000000000
--- a/bordeaux/learning/stochastic_linear_ranker/native/sparse_weight_vector.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Purpose: A container for sparse weight vectors
-// Maintains the sparse vector as a list of (name, value) pairs alongwith
-// a normalizer_. All operations assume that (name, value/normalizer_) is the
-// true value in question.
-
-#ifndef LEARNING_STOCHASTIC_LINEAR_SPARSE_WEIGHT_VECTOR_H_
-#define LEARNING_STOCHASTIC_LINEAR_SPARSE_WEIGHT_VECTOR_H_
-
-#include <math.h>
-
-#include <iosfwd>
-#include <sstream>
-#include <string>
-#include <unordered_map>
-
-#include "common_defs.h"
-
-namespace learning_stochastic_linear {
-
-template<class Key = std::string, class Hash = std::unordered_map<Key, double> >
-class SparseWeightVector {
- public:
- typedef Hash Wmap;
- typedef typename Wmap::iterator Witer;
- typedef typename Wmap::const_iterator Witer_const;
- SparseWeightVector() {
- normalizer_ = 1.0;
- }
- ~SparseWeightVector() {}
- explicit SparseWeightVector(const SparseWeightVector<Key, Hash> &other) {
- CopyFrom(other);
- }
- void operator=(const SparseWeightVector<Key, Hash> &other) {
- CopyFrom(other);
- }
- void CopyFrom(const SparseWeightVector<Key, Hash> &other) {
- w_ = other.w_;
- wmin_ = other.wmin_;
- wmax_ = other.wmax_;
- normalizer_ = other.normalizer_;
- }
-
- // This function implements checks to prevent unbounded vectors. It returns
- // true if the checks succeed and false otherwise. A vector is deemed invalid
- // if any of these conditions are met:
- // 1. it has no values.
- // 2. its normalizer is nan or inf or close to zero.
- // 3. any of its values are nan or inf.
- // 4. its L0 norm is close to zero.
- bool IsValid() const;
-
- // Normalizer getters and setters.
- double GetNormalizer() const {
- return normalizer_;
- }
- void SetNormalizer(const double norm) {
- normalizer_ = norm;
- }
- void NormalizerMultUpdate(const double mul) {
- normalizer_ = normalizer_ * mul;
- }
- void NormalizerAddUpdate(const double add) {
- normalizer_ += add;
- }
-
- // Divides all the values by the normalizer, then it resets it to 1.0
- void ResetNormalizer();
-
- // Bound getters and setters.
- // True if there is a bound with val containing the bound. false otherwise.
- bool GetElementMinBound(const Key &fname, double *val) const {
- return GetValue(wmin_, fname, val);
- }
- bool GetElementMaxBound(const Key &fname, double *val) const {
- return GetValue(wmax_, fname, val);
- }
- void SetElementMinBound(const Key &fname, const double bound) {
- wmin_[fname] = bound;
- }
- void SetElementMaxBound(const Key &fname, const double bound) {
- wmax_[fname] = bound;
- }
- // Element getters and setters.
- double GetElement(const Key &fname) const {
- double val = 0;
- GetValue(w_, fname, &val);
- return val;
- }
- void SetElement(const Key &fname, const double val) {
- //DCHECK(!isnan(val));
- w_[fname] = val;
- }
- void AddUpdateElement(const Key &fname, const double val) {
- w_[fname] += val;
- }
- void MultUpdateElement(const Key &fname, const double val) {
- w_[fname] *= val;
- }
- // Load another weight vectors. Will overwrite the current vector.
- void LoadWeightVector(const SparseWeightVector<Key, Hash> &vec) {
- w_.clear();
- w_.insert(vec.w_.begin(), vec.w_.end());
- wmax_.insert(vec.wmax_.begin(), vec.wmax_.end());
- wmin_.insert(vec.wmin_.begin(), vec.wmin_.end());
- normalizer_ = vec.normalizer_;
- }
- void Clear() {
- w_.clear();
- wmax_.clear();
- wmin_.clear();
- }
- const Wmap& GetMap() const {
- return w_;
- }
- // Vector Operations.
- void AdditiveWeightUpdate(const double multiplier,
- const SparseWeightVector<Key, Hash> &w1,
- const double additive_const);
- void AdditiveSquaredWeightUpdate(const double multiplier,
- const SparseWeightVector<Key, Hash> &w1,
- const double additive_const);
- void AdditiveInvSqrtWeightUpdate(const double multiplier,
- const SparseWeightVector<Key, Hash> &w1,
- const double additive_const);
- void MultWeightUpdate(const SparseWeightVector<Key, Hash> &w1);
- double DotProduct(const SparseWeightVector<Key, Hash> &s) const;
- // L-x norm. eg. L1, L2.
- double LxNorm(const double x) const;
- double L2Norm() const;
- double L1Norm() const;
- double L0Norm(const double epsilon) const;
- // Bound preserving updates.
- void AdditiveWeightUpdateBounded(const double multiplier,
- const SparseWeightVector<Key, Hash> &w1,
- const double additive_const);
- void MultWeightUpdateBounded(const SparseWeightVector<Key, Hash> &w1);
- void ReprojectToBounds();
- void ReprojectL0(const double l0_norm);
- void ReprojectL1(const double l1_norm);
- void ReprojectL2(const double l2_norm);
- // Reproject using the given norm.
- // Will also rescale regularizer_ if it gets too small/large.
- int32 Reproject(const double norm, const RegularizationType r);
- // Convert this vector to a string, simply for debugging.
- std::string DebugString() const {
- std::stringstream stream;
- stream << *this;
- return stream.str();
- }
- private:
- // The weight map.
- Wmap w_;
- // Constraint bounds.
- Wmap wmin_;
- Wmap wmax_;
- // Normalizing constant in magnitude measurement.
- double normalizer_;
- // This function is necessary since by default unordered_map inserts an
- // element if it does not find the key through [] operator. It implements a
- // lookup without the space overhead of an add.
- bool GetValue(const Wmap &w1, const Key &fname, double *val) const {
- Witer_const iter = w1.find(fname);
- if (iter != w1.end()) {
- (*val) = iter->second;
- return true;
- } else {
- (*val) = 0;
- return false;
- }
- }
-};
-
-// Outputs a SparseWeightVector, for debugging.
-template <class Key, class Hash>
-std::ostream& operator<<(std::ostream &stream,
- const SparseWeightVector<Key, Hash> &vector) {
- typename SparseWeightVector<Key, Hash>::Wmap w_map = vector.GetMap();
- stream << "[[ ";
- for (typename SparseWeightVector<Key, Hash>::Witer_const iter = w_map.begin();
- iter != w_map.end();
- ++iter) {
- stream << "<" << iter->first << ", " << iter->second << "> ";
- }
- return stream << " ]]";
-};
-
-} // namespace learning_stochastic_linear
-#endif // LEARNING_STOCHASTIC_LINEAR_SPARSE_WEIGHT_VECTOR_H_