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