6 #ifndef DISMEC_SRC_OBJECTIVE_DENSE_AND_SPARSE_H 
    7 #define DISMEC_SRC_OBJECTIVE_DENSE_AND_SPARSE_H 
   51         template<
class Derived>
 
   95                                                Eigen::Ref<DenseRealVector> target) 
override;
 
  100                                                     Eigen::Ref<DenseRealVector> pre) 
override;
 
  163     template<
class MarginFunction, 
class SparseRegFunction, 
class DenseRegFunction>
 
  167                              MarginFunction phi, DenseRegFunction dr, 
real_t drs, SparseRegFunction sr, 
real_t srs) :
 
  177             assert(scores.size() == 
labels.size());
 
  178             for(
int i = 0; i < scores.size(); ++i) {
 
  180                 out.coeffRef(i) = 
Phi.value(margin);
 
  187             assert(scores.size() == 
labels.size());
 
  188             for(
int i = 0; i < scores.size(); ++i) {
 
  190                 real_t margin = scores.coeff(i) * label;
 
  191                 out.coeffRef(i) = 
Phi.grad(margin) * label;
 
  198             assert(scores.size() == 
labels.size());
 
  199             for(
int i = 0; i < scores.size(); ++i) {
 
  201                 out.coeffRef(i) = 
Phi.quad(margin);
 
  210             for(
int i = 0; i < sparse_start; ++i) {
 
  211                 dense_value += 
DenseReg.value(weights.coeff(i));
 
  213             for(
int i = sparse_start; i < sparse_end; ++i) {
 
  214                 sparse_value += 
SparseReg.value(weights.coeff(i));
 
  224             for (
long i = 0; i < sparse_start; ++i) {
 
  227             for (
long i = sparse_start; i < sparse_end; ++i) {
 
  239             for (
long i = 0; i < sparse_start; ++i) {
 
  242             for (
long i = sparse_start; i < sparse_end; ++i) {
 
  252             for (
long i = 0; i < sparse_start; ++i) {
 
  255             for (
long i = sparse_start; i < sparse_end; ++i) {
 
  265             for (
long i = 0; i < sparse_start; ++i) {
 
  268             for (
long i = sparse_start; i < sparse_end; ++i) {
 
  281         std::shared_ptr<const GenericFeatureMatrix> dense_features,
 
  282         real_t dense_reg_strength,
 
  283         std::shared_ptr<const GenericFeatureMatrix> sparse_features,
 
  284         real_t sparse_reg_strength
 
An Eigen vector with versioning information, to implement simple caching of results.
VectorHash hash() const
Gets the unique id of this vector.
A unique identifier for a HashVector.
Base class for implementationa of an objective that combines dense features and sparse features.
void gradient_and_pre_conditioner_unchecked(const HashVector &location, Eigen::Ref< DenseRealVector > gradient, Eigen::Ref< DenseRealVector > pre) override
void project_to_line_unchecked(const HashVector &location, const DenseRealVector &direction) override
virtual void calculate_2nd_derivative(const DenseRealVector &scores, const BinaryLabelVector &labels, DenseRealVector &out) const =0
void update_features(const DenseFeatures &dense, const SparseFeatures &sparse)
BinaryLabelVector m_Y
Label vector – use a vector of ints here. We encode label present == 1, absent == -1.
virtual void calculate_derivative(const DenseRealVector &scores, const BinaryLabelVector &labels, DenseRealVector &out) const =0
const DenseRealVector & costs() const
std::shared_ptr< const GenericFeatureMatrix > m_DenseFeatures
Pointer to the dense part of the feature matrix.
void diag_preconditioner_unchecked(const HashVector &location, Eigen::Ref< DenseRealVector > target) override
BinaryLabelVector & get_label_ref()
void hessian_times_direction_unchecked(const HashVector &location, const DenseRealVector &direction, Eigen::Ref< DenseRealVector > target) override
real_t value_from_xTw(const DenseRealVector &xTw)
const DenseRealVector & cached_derivative(const HashVector &location)
void gradient_at_zero_unchecked(Eigen::Ref< DenseRealVector > target) override
const SparseFeatures & sparse_features() const
virtual void regularization_gradient(const DenseRealVector &weights, Eigen::Ref< DenseRealVector > gradient) const =0
virtual void regularization_preconditioner(const DenseRealVector &weights, Eigen::Ref< DenseRealVector > pre_cond) const =0
real_t value_unchecked(const HashVector &location) override
const DenseRealVector & cached_2nd_derivative(const HashVector &location)
DenseRealVector m_GenericInBuffer
void update_costs(real_t positive, real_t negative)
DenseRealVector m_LsCache_xTw
cache for line search implementation: feature times weights
virtual void regularization_gradient_at_zero(Eigen::Ref< DenseRealVector > gradient) const =0
CacheHelper m_DerivativeBuffer
const BinaryLabelVector & labels() const
void declare_vector_on_last_line(const HashVector &location, real_t t) override
State that the given vector corresponds to a certain position on the line of the last line search.
virtual void calculate_loss(const DenseRealVector &scores, const BinaryLabelVector &labels, DenseRealVector &out) const =0
DenseRealVector m_LsCache_xTd
cache for line search implementation: feature times direction
long num_instances() const noexcept
std::shared_ptr< const GenericFeatureMatrix > m_SparseFeatures
pointer to the sparse part of the feature matrix
DenseRealVector m_Costs
Label-Dependent costs.
VectorHash m_Last_W
cache for the last argument to x_times_w().
virtual void regularization_hessian(const DenseRealVector &weights, const DenseRealVector &direction, Eigen::Ref< DenseRealVector > pre_cond) const =0
void project_linear_to_line(const HashVector &location, const DenseRealVector &direction)
Prepares the cache variables for line projection.
auto line_interpolation(real_t t) const
const DenseFeatures & dense_features() const
virtual real_t regularization_value(const DenseRealVector &weights) const =0
DenseRealVector m_LineStart
DenseRealVector m_LineDirection
const DenseRealVector & x_times_w(const HashVector &w)
Calculates the vector of feature matrix times weights w
long get_num_variables() const noexcept
actual implementation of num_variables(). We need this non-virtual function to be called during the c...
DenseRealVector m_LineCache
DenseAndSparseLinearBase(std::shared_ptr< const GenericFeatureMatrix > dense_features, std::shared_ptr< const GenericFeatureMatrix > sparse_features)
void gradient_unchecked(const HashVector &location, Eigen::Ref< DenseRealVector > target) override
DenseRealVector m_X_times_w
cache for the last result of x_times_w() corresponding to m_Last_W.
DenseRealVector m_GenericOutBuffer
long num_variables() const noexcept override
real_t lookup_on_line(real_t position) override
Looks up the value of the objective on the line defined by the last call to project_to_line().
CacheHelper m_SecondDerivativeBuffer
void update_xtw_cache(const HashVector &new_weight, const Eigen::MatrixBase< Derived > &new_result)
Updates the cached value for x_times_w.
Class that models an optimization objective.
void gradient(const HashVector &location, Eigen::Ref< DenseRealVector > target)
Evaluate the gradient at location.
std::unique_ptr< DenseAndSparseLinearBase > make_sp_dense_squared_hinge(std::shared_ptr< const GenericFeatureMatrix > dense_features, real_t dense_reg_strength, std::shared_ptr< const GenericFeatureMatrix > sparse_features, real_t sparse_reg_strength)
types::DenseRowMajor< real_t > DenseFeatures
Dense Feature Matrix in Row Major format.
types::DenseVector< std::int8_t > BinaryLabelVector
Dense vector for storing binary labels.
types::DenseVector< real_t > DenseRealVector
Any dense, real values vector.
types::SparseRowMajor< real_t > SparseFeatures
Sparse Feature Matrix in Row Major format.
float real_t
The default type for floating point values.
void regularization_preconditioner(const DenseRealVector &weights, Eigen::Ref< DenseRealVector > pre_cond) const override
DenseRegFunction DenseReg
void regularization_hessian(const DenseRealVector &weights, const DenseRealVector &direction, Eigen::Ref< DenseRealVector > target) const override
DenseAndSparseMargin(std::shared_ptr< const GenericFeatureMatrix > dense_features, std::shared_ptr< const GenericFeatureMatrix > sparse_features, MarginFunction phi, DenseRegFunction dr, real_t drs, SparseRegFunction sr, real_t srs)
void calculate_loss(const DenseRealVector &scores, const BinaryLabelVector &labels, DenseRealVector &out) const override
real_t regularization_value(const DenseRealVector &weights) const override
void calculate_2nd_derivative(const DenseRealVector &scores, const BinaryLabelVector &labels, DenseRealVector &out) const override
void calculate_derivative(const DenseRealVector &scores, const BinaryLabelVector &labels, DenseRealVector &out) const override
SparseRegFunction SparseReg
void regularization_gradient(const DenseRealVector &weights, Eigen::Ref< DenseRealVector > gradient) const override
void regularization_gradient_at_zero(Eigen::Ref< DenseRealVector > gradient) const override