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(INT num_lab)
00026 : CSGObject(), num_labels(num_lab)
00027 {
00028 labels=new DREAL[num_lab];
00029 for (INT i=0; i<num_lab; i++)
00030 labels[i]=0;
00031 }
00032
00033 CLabels::CLabels(DREAL* p_labels, INT 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(DREAL* p_labels, INT len)
00059 {
00060 ASSERT(len>0);
00061 num_labels=len;
00062
00063 delete[] labels;
00064 labels=new DREAL[len];
00065
00066 for (INT 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 (INT 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 INT CLabels::get_num_classes()
00086 {
00087 INT n=-1;
00088 INT* lab=get_int_labels(n);
00089
00090 INT num_classes=0;
00091 for (INT 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 DREAL* CLabels::get_labels(INT &len)
00100 {
00101 len=num_labels;
00102
00103 if (num_labels>0)
00104 {
00105 DREAL* _labels=new DREAL[num_labels] ;
00106 for (INT 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(DREAL** p_labels, INT* 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=(DREAL*) malloc(sizeof(DREAL)*num_labels);
00123
00124 for (INT i=0; i<num_labels; i++)
00125 (*p_labels)[i]=get_label(i);
00126 }
00127 }
00128
00129 INT* CLabels::get_int_labels(INT &len)
00130 {
00131 len=num_labels;
00132
00133 if (num_labels>0)
00134 {
00135 INT* _labels=new INT[num_labels] ;
00136 for (INT i=0; i<len; i++)
00137 _labels[i]= (INT) get_label(i) ;
00138 return _labels ;
00139 }
00140 else
00141 return NULL;
00142 }
00143
00144 void CLabels::set_int_labels(INT * mylabels, INT len)
00145 {
00146 num_labels = len ;
00147 delete[] labels ;
00148
00149 labels = new DREAL[num_labels] ;
00150 for (INT 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 LONG 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 }