SHOGUN
v1.1.0
|
00001 /* 00002 * Copyright (c) 2007-2009 The LIBLINEAR Project. 00003 * All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions 00007 * are met: 00008 * 00009 * 1. Redistributions of source code must retain the above copyright 00010 * notice, this list of conditions and the following disclaimer. 00011 * 00012 * 2. Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in the 00014 * documentation and/or other materials provided with the distribution. 00015 * 00016 * 3. Neither name of copyright holders nor the names of its contributors 00017 * may be used to endorse or promote products derived from this software 00018 * without specific prior written permission. 00019 * 00020 * 00021 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00024 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR 00025 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00026 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00027 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00028 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00029 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00030 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00031 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00032 */ 00033 #ifndef DOXYGEN_SHOULD_SKIP_THIS 00034 00035 #ifndef _LIBLINEAR_H 00036 #define _LIBLINEAR_H 00037 00038 #include <shogun/lib/config.h> 00039 00040 #ifdef HAVE_LAPACK 00041 #include <shogun/classifier/svm/Tron.h> 00042 #include <shogun/features/DotFeatures.h> 00043 #include <vector> 00044 00045 namespace shogun 00046 { 00047 00048 #ifdef __cplusplus 00049 extern "C" { 00050 #endif 00051 00053 struct problem 00054 { 00056 int32_t l; 00058 int32_t n; 00060 int32_t *y; 00062 CDotFeatures* x; 00064 bool use_bias; 00065 }; 00066 00068 struct parameter 00069 { 00071 int32_t solver_type; 00072 00073 /* these are for training only */ 00075 float64_t eps; 00077 float64_t C; 00079 int32_t nr_weight; 00081 int32_t *weight_label; 00083 float64_t* weight; 00084 }; 00085 00087 struct model 00088 { 00090 struct parameter param; 00092 int32_t nr_class; 00094 int32_t nr_feature; 00096 float64_t *w; 00098 int32_t *label; 00100 float64_t bias; 00101 }; 00102 00103 void destroy_model(struct model *model_); 00104 void destroy_param(struct parameter *param); 00105 #ifdef __cplusplus 00106 } 00107 #endif 00108 00110 class l2loss_svm_fun : public function 00111 { 00112 public: 00119 l2loss_svm_fun(const problem *prob, float64_t Cp, float64_t Cn); 00120 ~l2loss_svm_fun(); 00121 00127 float64_t fun(float64_t *w); 00128 00134 void grad(float64_t *w, float64_t *g); 00135 00141 void Hv(float64_t *s, float64_t *Hs); 00142 00147 int32_t get_nr_variable(); 00148 00149 private: 00150 void Xv(float64_t *v, float64_t *Xv); 00151 void subXv(float64_t *v, float64_t *Xv); 00152 void subXTv(float64_t *v, float64_t *XTv); 00153 00154 float64_t *C; 00155 float64_t *z; 00156 float64_t *D; 00157 int32_t *I; 00158 int32_t sizeI; 00159 const problem *prob; 00160 }; 00161 00163 class l2r_lr_fun : public function 00164 { 00165 public: 00172 l2r_lr_fun(const problem *prob, float64_t Cp, float64_t Cn); 00173 ~l2r_lr_fun(); 00174 00180 float64_t fun(float64_t *w); 00181 00187 void grad(float64_t *w, float64_t *g); 00188 00194 void Hv(float64_t *s, float64_t *Hs); 00195 00196 int32_t get_nr_variable(); 00197 00198 private: 00199 void Xv(float64_t *v, float64_t *Xv); 00200 void XTv(float64_t *v, float64_t *XTv); 00201 00202 float64_t *C; 00203 float64_t *z; 00204 float64_t *D; 00205 const problem *prob; 00206 }; 00207 00208 class l2r_l2_svc_fun : public function 00209 { 00210 public: 00211 l2r_l2_svc_fun(const problem *prob, double Cp, double Cn); 00212 ~l2r_l2_svc_fun(); 00213 00214 double fun(double *w); 00215 void grad(double *w, double *g); 00216 void Hv(double *s, double *Hs); 00217 00218 int get_nr_variable(); 00219 00220 private: 00221 void Xv(double *v, double *Xv); 00222 void subXv(double *v, double *Xv); 00223 void subXTv(double *v, double *XTv); 00224 00225 double *C; 00226 double *z; 00227 double *D; 00228 int *I; 00229 int sizeI; 00230 const problem *prob; 00231 }; 00232 00233 class Solver_MCSVM_CS 00234 { 00235 public: 00236 Solver_MCSVM_CS(const problem *prob, int nr_class, double *C, double eps=0.1, int max_iter=100000); 00237 ~Solver_MCSVM_CS(); 00238 void Solve(double *w); 00239 private: 00240 void solve_sub_problem(double A_i, int yi, double C_yi, int active_i, double *alpha_new); 00241 bool be_shrunk(int i, int m, int yi, double alpha_i, double minG); 00242 double *B, *C, *G; 00243 int w_size, l; 00244 int nr_class; 00245 int max_iter; 00246 double eps; 00247 const problem *prob; 00248 }; 00249 00250 00251 } 00252 #endif //HAVE_LAPACK 00253 #endif //_LIBLINEAR_H 00254 00255 #endif // DOXYGEN_SHOULD_SKIP_THIS