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