blob: a54797d04223c82ade0e8941077de8b311a0ea6b [file] [log] [blame]
/* ----------------------------------------------------------------------- *//**
*
* @file l2.hpp
*
*//* ----------------------------------------------------------------------- */
#ifndef MADLIB_MODULES_CONVEX_TASK_L2_HPP_
#define MADLIB_MODULES_CONVEX_TASK_L2_HPP_
#include <dbconnector/dbconnector.hpp>
namespace madlib {
namespace modules {
namespace convex {
// Use Eigen
using namespace madlib::dbal::eigen_integration;
template <class Model, class Hessian = Matrix>
class L2 {
public:
typedef Model model_type;
typedef Hessian hessian_type;
static void gradient(
const model_type &model,
const double &lambda,
model_type &gradient);
static void hessian(
const model_type &model,
const double &lambda,
hessian_type &hessian);
static double loss(
const model_type &model,
const double &lambda);
};
template <class Model, class Hessian>
void
L2<Model, Hessian>::gradient(
const model_type &model,
const double &lambda,
model_type &gradient)
{
Index i;
for (i = 0; i < model.rows()-1; i++)
gradient(i) += lambda * model(i);
}
template <class Model, class Hessian>
void
L2<Model, Hessian>::hessian(
const model_type &model,
const double &lambda,
hessian_type &hessian)
{
int n = model.rows();
hessian += lambda * hessian.Identity(n, n);
hessian(n-1, n-1) -= lambda;
}
template <class Model, class Hessian>
double
L2<Model, Hessian>::loss(
const model_type &model,
const double &lambda)
{
Index i;
double s = 0.;
for (i = 0; i < model.rows()-1; i++)
s += model(i) * model(i);
return lambda * s / 2.;
}
} // namespace convex
} // namespace modules
} // namespace madlib
#endif