Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "features/Features.h"
00013 #include "preproc/PreProc.h"
00014 #include "lib/io.h"
00015
00016 #include <string.h>
00017
00018
00019 #ifdef HAVE_BOOST_SERIALIZATION
00020 #include "kernel/Kernel.h"
00021 #include <boost/serialization/export.hpp>
00022 BOOST_CLASS_EXPORT(shogun::CFeatures);
00023 #endif //HAVE_BOOST_SERIALIZATION
00024
00025
00026 using namespace shogun;
00027
00028 CFeatures::CFeatures(int32_t size)
00029 : CSGObject(), properties(FP_NONE), cache_size(size), preproc(NULL), num_preproc(0),
00030 preprocessed(NULL)
00031 {
00032 SG_INFO("Feature object created (%p)\n",this);
00033 }
00034
00035 CFeatures::CFeatures(const CFeatures& orig)
00036 : CSGObject(orig), preproc(orig.preproc),
00037 num_preproc(orig.num_preproc), preprocessed(orig.preprocessed)
00038 {
00039 preprocessed=new bool[orig.num_preproc];
00040 memcpy(preprocessed, orig.preprocessed, sizeof(bool)*orig.num_preproc);
00041 }
00042
00043 CFeatures::CFeatures(CFile* loader)
00044 : CSGObject(), cache_size(0), preproc(NULL), num_preproc(0),
00045 preprocessed(false)
00046 {
00047 load(loader);
00048 SG_INFO("Feature object loaded (%p)\n",this) ;
00049 }
00050
00051 CFeatures::~CFeatures()
00052 {
00053 SG_INFO("Feature object destroyed (%p)\n", this);
00054 clean_preprocs();
00055 }
00056
00058 int32_t CFeatures::add_preproc(CPreProc* p)
00059 {
00060 SG_INFO( "%d preprocs currently, new preproc list is\n", num_preproc);
00061 ASSERT(p);
00062
00063 bool* preprocd=new bool[num_preproc+1];
00064 CPreProc** pps=new CPreProc*[num_preproc+1];
00065 for (int32_t i=0; i<num_preproc; i++)
00066 {
00067 pps[i]=preproc[i];
00068 preprocd[i]=preprocessed[i];
00069 }
00070 delete[] preproc;
00071 delete[] preprocessed;
00072 preproc=pps;
00073 preprocessed=preprocd;
00074 preproc[num_preproc]=p;
00075 preprocessed[num_preproc]=false;
00076
00077 num_preproc++;
00078
00079 for (int32_t i=0; i<num_preproc; i++)
00080 SG_INFO( "preproc[%d]=%s %ld\n",i, preproc[i]->get_name(), preproc[i]) ;
00081
00082 SG_REF(p);
00083
00084 return num_preproc;
00085 }
00086
00088 CPreProc* CFeatures::get_preproc(int32_t num)
00089 {
00090 if (num<num_preproc)
00091 {
00092 SG_REF(preproc[num]);
00093 return preproc[num];
00094 }
00095 else
00096 return NULL;
00097 }
00098
00100 int32_t CFeatures::get_num_preprocessed()
00101 {
00102 int32_t num=0;
00103
00104 for (int32_t i=0; i<num_preproc; i++)
00105 {
00106 if (preprocessed[i])
00107 num++;
00108 }
00109
00110 return num;
00111 }
00112
00114 void CFeatures::clean_preprocs()
00115 {
00116 while (del_preproc(0));
00117 }
00118
00120 CPreProc* CFeatures::del_preproc(int32_t num)
00121 {
00122 CPreProc** pps=NULL;
00123 bool* preprocd=NULL;
00124 CPreProc* removed_preproc=NULL;
00125
00126 if (num_preproc>0 && num<num_preproc)
00127 {
00128 removed_preproc=preproc[num];
00129
00130 if (num_preproc>1)
00131 {
00132 pps= new CPreProc*[num_preproc-1];
00133 preprocd= new bool[num_preproc-1];
00134
00135 if (pps && preprocd)
00136 {
00137 int32_t j=0;
00138 for (int32_t i=0; i<num_preproc; i++)
00139 {
00140 if (i!=num)
00141 {
00142 pps[j]=preproc[i];
00143 preprocd[j]=preprocessed[i];
00144 j++;
00145 }
00146 }
00147 }
00148 }
00149
00150 delete[] preproc;
00151 preproc=pps;
00152 delete[] preprocessed;
00153 preprocessed=preprocd;
00154
00155 num_preproc--;
00156
00157 for (int32_t i=0; i<num_preproc; i++)
00158 SG_INFO( "preproc[%d]=%s\n",i, preproc[i]->get_name()) ;
00159 }
00160
00161 SG_UNREF(removed_preproc);
00162 return removed_preproc;
00163 }
00164
00165 void CFeatures::list_feature_obj()
00166 {
00167 SG_INFO( "%p - ", this);
00168 switch (get_feature_class())
00169 {
00170 case C_UNKNOWN:
00171 SG_INFO( "C_UNKNOWN ");
00172 break;
00173 case C_SIMPLE:
00174 SG_INFO( "C_SIMPLE ");
00175 break;
00176 case C_SPARSE:
00177 SG_INFO( "C_SPARSE ");
00178 break;
00179 case C_STRING:
00180 SG_INFO( "C_STRING ");
00181 break;
00182 case C_COMBINED:
00183 SG_INFO( "C_COMBINED ");
00184 break;
00185 case C_COMBINED_DOT:
00186 SG_INFO( "C_COMBINED_DOT ");
00187 break;
00188 case C_WD:
00189 SG_INFO( "C_WD ");
00190 break;
00191 case C_SPEC:
00192 SG_INFO( "C_SPEC ");
00193 break;
00194 case C_WEIGHTEDSPEC:
00195 SG_INFO( "C_WEIGHTEDSPEC ");
00196 break;
00197 case C_ANY:
00198 SG_INFO( "C_ANY ");
00199 break;
00200 default:
00201 SG_ERROR( "ERROR UNKNOWN FEATURE CLASS");
00202 }
00203
00204 switch (get_feature_type())
00205 {
00206 case F_UNKNOWN:
00207 SG_INFO( "F_UNKNOWN \n");
00208 break;
00209 case F_CHAR:
00210 SG_INFO( "F_CHAR \n");
00211 break;
00212 case F_BYTE:
00213 SG_INFO( "F_BYTE \n");
00214 break;
00215 case F_SHORT:
00216 SG_INFO( "F_SHORT \n");
00217 break;
00218 case F_WORD:
00219 SG_INFO( "F_WORD \n");
00220 break;
00221 case F_INT:
00222 SG_INFO( "F_INT \n");
00223 break;
00224 case F_UINT:
00225 SG_INFO( "F_UINT \n");
00226 break;
00227 case F_LONG:
00228 SG_INFO( "F_LONG \n");
00229 break;
00230 case F_ULONG:
00231 SG_INFO( "F_ULONG \n");
00232 break;
00233 case F_SHORTREAL:
00234 SG_INFO( "F_SHORTEAL \n");
00235 break;
00236 case F_DREAL:
00237 SG_INFO( "F_DREAL \n");
00238 break;
00239 case F_LONGREAL:
00240 SG_INFO( "F_LONGREAL \n");
00241 break;
00242 case F_ANY:
00243 SG_INFO( "F_ANY \n");
00244 break;
00245 default:
00246 SG_ERROR( "ERROR UNKNOWN FEATURE TYPE\n");
00247 }
00248 }
00249
00250 bool CFeatures::check_feature_compatibility(CFeatures* f)
00251 {
00252 bool result=false;
00253
00254 if (f)
00255 result= ( (this->get_feature_class() == f->get_feature_class()) &&
00256 (this->get_feature_type() == f->get_feature_type()));
00257 return result;
00258 }