00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <shogun/structure/DualLibQPBMSOSVM.h>
00012 #include <shogun/structure/libppbm.h>
00013 #include <shogun/structure/libp3bm.h>
00014
00015 using namespace shogun;
00016
00017 CDualLibQPBMSOSVM::CDualLibQPBMSOSVM()
00018 :CLinearStructuredOutputMachine()
00019 {
00020 }
00021
00022 CDualLibQPBMSOSVM::CDualLibQPBMSOSVM(
00023 CStructuredModel* model,
00024 CLossFunction* loss,
00025 CStructuredLabels* labs,
00026 float64_t _lambda,
00027 SGVector< float64_t > W)
00028 : CLinearStructuredOutputMachine(model, loss, labs)
00029 {
00030 set_TolRel(0.001);
00031 set_TolAbs(0.0);
00032 set_BufSize(1000);
00033 set_lambda(_lambda);
00034 set_cleanICP(true);
00035 set_cleanAfter(10);
00036 set_K(0.4);
00037 set_Tmax(100);
00038 set_cp_models(1);
00039 set_verbose(true);
00040 set_solver(BMRM);
00041
00042
00043 uint32_t nDim=this->m_model->get_dim();
00044
00045
00046 if (W.vlen==0)
00047 {
00048 m_w=SGVector< float64_t >(nDim);
00049
00050 m_w.zero();
00051 }
00052 else
00053 {
00054 set_w(W);
00055 }
00056
00057 init();
00058 }
00059
00060 CDualLibQPBMSOSVM::~CDualLibQPBMSOSVM()
00061 {
00062 }
00063
00064 void CDualLibQPBMSOSVM::init()
00065 {
00066 SG_ADD(&m_TolRel, "m_TolRel", "Relative tolerance", MS_NOT_AVAILABLE);
00067 SG_ADD(&m_TolAbs, "m_TolAbs", "Absolute tolerance", MS_NOT_AVAILABLE);
00068 SG_ADD(&m_BufSize, "m_BuffSize", "Size of CP Buffer", MS_AVAILABLE);
00069 SG_ADD(&m_lambda, "m_lambda", "Regularization constant lambda",
00070 MS_AVAILABLE);
00071 SG_ADD(&m_cleanICP, "m_cleanICP", "Inactive cutting plane removal flag",
00072 MS_AVAILABLE);
00073 SG_ADD(&m_cleanAfter,
00074 "m_cleanAfter",
00075 "Number of inactive iterations after which ICP will be removed",
00076 MS_NOT_AVAILABLE);
00077 SG_ADD(&m_K, "m_K", "Parameter K", MS_NOT_AVAILABLE);
00078 SG_ADD(&m_Tmax, "m_Tmax", "Parameter Tmax", MS_AVAILABLE);
00079 SG_ADD(&m_cp_models, "m_cp_models", "Number of cutting plane models",
00080 MS_AVAILABLE);
00081 SG_ADD(&m_verbose, "m_verbose", "Verbosity flag", MS_AVAILABLE);
00082 }
00083
00084 bool CDualLibQPBMSOSVM::train_machine(CFeatures* data)
00085 {
00086 if (data)
00087 set_features(data);
00088
00089
00090 switch(m_solver)
00091 {
00092 case BMRM:
00093 m_result=svm_bmrm_solver(m_model, m_w.vector, m_TolRel, m_TolAbs,
00094 m_lambda, m_BufSize, m_cleanICP, m_cleanAfter, m_K, m_Tmax,
00095 m_verbose);
00096 break;
00097 case PPBMRM:
00098 m_result=svm_ppbm_solver(m_model, m_w.vector, m_TolRel, m_TolAbs,
00099 m_lambda, m_BufSize, m_cleanICP, m_cleanAfter, m_K, m_Tmax,
00100 m_verbose);
00101 break;
00102 case P3BMRM:
00103 m_result=svm_p3bm_solver(m_model, m_w.vector, m_TolRel, m_TolAbs,
00104 m_lambda, m_BufSize, m_cleanICP, m_cleanAfter, m_K, m_Tmax,
00105 m_cp_models, m_verbose);
00106 break;
00107 }
00108
00109 if (m_result.exitflag==1)
00110 {
00111 return true;
00112 }
00113 else
00114 {
00115 return false;
00116 }
00117 }