Labels.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "features/Labels.h"
00013 #include "lib/common.h"
00014 #include "lib/File.h"
00015 #include "lib/io.h"
00016 #include "lib/Mathematics.h"
00017
00018 CLabels::CLabels()
00019 : CSGObject()
00020 {
00021 labels = NULL;
00022 num_labels = 0;
00023 }
00024
00025 CLabels::CLabels(int32_t num_lab)
00026 : CSGObject(), num_labels(num_lab)
00027 {
00028 labels=new float64_t[num_lab];
00029 for (int32_t i=0; i<num_lab; i++)
00030 labels[i]=0;
00031 }
00032
00033 CLabels::CLabels(float64_t* p_labels, int32_t len)
00034 : CSGObject()
00035 {
00036 labels = NULL;
00037 num_labels = 0;
00038
00039 set_labels(p_labels, len);
00040 }
00041
00042 CLabels::CLabels(char* fname)
00043 : CSGObject()
00044 {
00045 num_labels=0;
00046 labels=NULL;
00047
00048 load(fname);
00049 }
00050
00051 CLabels::~CLabels()
00052 {
00053 delete[] labels;
00054 num_labels=0;
00055 labels=NULL;
00056 }
00057
00058 void CLabels::set_labels(float64_t* p_labels, int32_t len)
00059 {
00060 ASSERT(len>0);
00061 num_labels=len;
00062
00063 delete[] labels;
00064 labels=new float64_t[len];
00065
00066 for (int32_t i=0; i<len; i++)
00067 labels[i]=p_labels[i];
00068 }
00069
00070 bool CLabels::is_two_class_labeling()
00071 {
00072 ASSERT(labels);
00073
00074 for (int32_t i=0; i<num_labels; i++)
00075 {
00076 if ( !( labels[i]==+1.0 || labels[i]==-1.0) )
00077 {
00078 SG_ERROR("Not a two class labeling label[%d]=%f (only +1/-1 allowed)\n", i, labels[i]);
00079 return false;
00080 }
00081 }
00082 return true;
00083 }
00084
00085 int32_t CLabels::get_num_classes()
00086 {
00087 int32_t n=-1;
00088 int32_t* lab=get_int_labels(n);
00089
00090 int32_t num_classes=0;
00091 for (int32_t i=0; i<n; i++)
00092 num_classes=CMath::max(num_classes,lab[i]);
00093
00094 delete[] lab;
00095
00096 return num_classes+1;
00097 }
00098
00099 float64_t* CLabels::get_labels(int32_t &len)
00100 {
00101 len=num_labels;
00102
00103 if (num_labels>0)
00104 {
00105 float64_t* _labels=new float64_t[num_labels] ;
00106 for (int32_t i=0; i<len; i++)
00107 _labels[i]=get_label(i) ;
00108 return _labels ;
00109 }
00110 else
00111 return NULL;
00112 }
00113
00114 void CLabels::get_labels(float64_t** p_labels, int32_t* len)
00115 {
00116 ASSERT(p_labels && len);
00117 *p_labels=NULL;
00118 *len=num_labels;
00119
00120 if (num_labels>0)
00121 {
00122 *p_labels=(float64_t*) malloc(sizeof(float64_t)*num_labels);
00123
00124 for (int32_t i=0; i<num_labels; i++)
00125 (*p_labels)[i]=get_label(i);
00126 }
00127 }
00128
00129 int32_t* CLabels::get_int_labels(int32_t &len)
00130 {
00131 len=num_labels;
00132
00133 if (num_labels>0)
00134 {
00135 int32_t* _labels=new int32_t[num_labels] ;
00136 for (int32_t i=0; i<len; i++)
00137 _labels[i]= (int32_t) get_label(i) ;
00138 return _labels ;
00139 }
00140 else
00141 return NULL;
00142 }
00143
00144 void CLabels::set_int_labels(int32_t * mylabels, int32_t len)
00145 {
00146 num_labels = len ;
00147 delete[] labels ;
00148
00149 labels = new float64_t[num_labels] ;
00150 for (int32_t i=0; i<num_labels; i++)
00151 set_int_label(i, mylabels[i]) ;
00152 }
00153
00154 bool CLabels::load(char* fname)
00155 {
00156 bool status=false;
00157
00158 delete[] labels;
00159 num_labels=0;
00160
00161 CFile f(fname, 'r', F_DREAL);
00162 int64_t num_lab=0;
00163 labels=f.load_real_data(NULL, num_lab);
00164 num_labels=num_lab;
00165
00166 if (!f.is_ok()) {
00167 SG_ERROR( "loading file \"%s\" failed", fname);
00168 }
00169 else
00170 {
00171 SG_INFO( "%ld labels successfully read\n", num_labels);
00172 status=true;
00173 }
00174
00175 return status;
00176 }
00177
00178 bool CLabels::save(char* fname)
00179 {
00180 return false;
00181 }