00001
00002
00003 #ifndef _STAT_SPARSEREGRESSIONMULTIPLIER_H
00004 #define _STAT_SPARSEREGRESSIONMULTIPLIER_H
00005
00006 #include "osl/stat/matrixMultiplier.h"
00007
00008 namespace osl
00009 {
00010 namespace stat
00011 {
00016 class SparseRegressionMultiplier : public MatrixMultiplier
00017 {
00019 unsigned int m_dimA;
00021 double m_lambda;
00022 unsigned int m_lambda_start;
00023 int split;
00024 public:
00025
00026 explicit SparseRegressionMultiplier(unsigned int dimA=0, double lambda=0.0, unsigned int lambda_start=0);
00027 ~SparseRegressionMultiplier();
00028
00029 void setSplit(int num_cpus=0) { split = num_cpus; }
00030 protected:
00031 void init(unsigned int new_dimA) { m_dimA = new_dimA; }
00032 public:
00033
00035 void prod(const double *p, double *out) const;
00037 void prodDiag(const double *d, const double *p, double *out) const;
00039 void prodRaw(const double *q, double *out) const;
00040 unsigned int dim() const;
00045 virtual bool getVectorXWithID(unsigned int& instance_id,
00046 unsigned int& num_elements,
00047 unsigned int *non_zero_indices,
00048 double *non_zero_values) const =0;
00049 virtual void newIteration() const;
00050 protected:
00052 void addProduct(unsigned int non_zeros,
00053 const unsigned int *non_zero_indices,
00054 const double *non_zero_values,
00055 const double *p, double *out) const;
00056 void addProductDiag(unsigned int non_zeros,
00057 const unsigned int *non_zero_indices,
00058 const double *non_zero_values,
00059 const double d, const double *p, double *out) const;
00060 public:
00066 virtual unsigned int computeXtY(const double *y, double *xty, double *diag_inv) const;
00067 virtual unsigned int computeXtYDiag(const double *weight, const double *y, double *xty, double *diag_inv) const;
00068
00069 struct ProdDiag;
00070 struct ProdDiagShared;
00071 };
00072
00073 struct DoubleReader
00074 {
00075 virtual ~DoubleReader() {}
00076 virtual double read() = 0;
00077 };
00078 struct DoubleConstReader : public DoubleReader
00079 {
00080 const double value;
00081 explicit DoubleConstReader(double v) : value(v)
00082 {
00083 }
00084 double read()
00085 {
00086 return value;
00087 }
00088 };
00089 struct DoubleReferenceReader : public DoubleReader
00090 {
00091 const double& value;
00092 explicit DoubleReferenceReader(double& v) : value(v)
00093 {
00094 }
00095 double read()
00096 {
00097 return value;
00098 }
00099 };
00100 struct DoubleArrayReader : public DoubleReader
00101 {
00102 const double *array;
00103 unsigned int cur;
00104 explicit DoubleArrayReader(const double *a) : array(a), cur(0)
00105 {
00106 }
00107 double read()
00108 {
00109 return array[cur++];
00110 }
00111 };
00112 template <class Iter>
00113 struct DoubleIteratorReader : public DoubleReader
00114 {
00115 Iter it;
00116 explicit DoubleIteratorReader(Iter i) : it(i)
00117 {
00118 }
00119 double read()
00120 {
00121 return *it++;
00122 }
00123 };
00124
00126 class SparseRegressionMultiplierSeq : public SparseRegressionMultiplier
00127 {
00128 mutable unsigned int current_id;
00129 public:
00130
00131 explicit SparseRegressionMultiplierSeq(unsigned int dimA=0, double lambda=0.0, unsigned int lambda_start=0);
00132 ~SparseRegressionMultiplierSeq();
00133
00134 public:
00135 bool getVectorXWithID(unsigned int& instance_id,
00136 unsigned int& num_elements,
00137 unsigned int *non_zero_indices,
00138 double *non_zero_values) const;
00139 virtual bool getVectorX(unsigned int& num_elements,
00140 unsigned int *non_zero_indices,
00141 double *non_zero_values) const =0;
00142 public:
00143 #if 0
00144
00149 virtual unsigned int computeXtY(DoubleReader& y, double *xty, double *diag_inv) const;
00150 virtual unsigned int computeXtYDiag(const double *weight, DoubleReader& y, double *xty, double *diag_inv) const;
00151 #endif
00152 };
00153
00157 class BinarySparseRegressionMultiplier : public MatrixMultiplier
00158 {
00159 unsigned int m_dimA;
00160 double m_lambda;
00161 public:
00162
00163 explicit BinarySparseRegressionMultiplier(unsigned int dimA,
00164 double lambda=0.0);
00165 ~BinarySparseRegressionMultiplier();
00166
00167
00168 void prod(const double *p, double *out) const;
00169 unsigned int dim() const;
00174 virtual bool getVectorX(unsigned int& num_elements,
00175 unsigned int *non_zero_indices) const =0;
00176 virtual void newIteration() const;
00178 void addProduct(unsigned int non_zeros,
00179 const unsigned int *non_zero_indices,
00180 const double *p, double *out) const;
00181 };
00182
00183 }
00184 }
00185
00186
00187 #endif
00188
00189
00190
00191