GenSVM
gensvm_base.c
Go to the documentation of this file.
1 
33 #include "gensvm_base.h"
34 
46 {
47  struct GenData *data = Malloc(struct GenData, 1);
48  data->Sigma = NULL;
49  data->y = NULL;
50  data->Z = NULL;
51  data->spZ = NULL;
52  data->RAW = NULL;
53 
54  // set default values
55  data->kerneltype = K_LINEAR;
56  data->gamma = -1;
57  data->coef = -1;
58  data->degree = -1;
59 
60  return data;
61 }
62 
73 void gensvm_free_data(struct GenData *data)
74 {
75  if (data == NULL)
76  return;
77 
78  if (data->spZ != NULL)
79  gensvm_free_sparse(data->spZ);
80 
81  if (data->Z == data->RAW) {
82  free(data->Z);
83  } else {
84  free(data->Z);
85  free(data->RAW);
86  }
87  free(data->y);
88  free(data->Sigma);
89  free(data);
90  data = NULL;
91 }
92 
103 {
104  struct GenModel *model = Malloc(struct GenModel, 1);
105 
106  // set default values
107  model->p = 1.0;
108  model->lambda = pow(2, -8.0);
109  model->epsilon = 1e-6;
110  model->kappa = 0.0;
111  model->weight_idx = 1;
112  model->gamma = 1.0;
113  model->coef = 0.0;
114  model->degree = 2.0;
115  model->kerneltype = K_LINEAR;
116  model->kernel_eigen_cutoff = 1e-8;
117  model->max_iter = 1000000000;
118  model->training_error = -1;
119  model->elapsed_iter = -1;
120  model->status = -1;
121 
122  model->V = NULL;
123  model->Vbar = NULL;
124  model->U = NULL;
125  model->UU = NULL;
126  model->Q = NULL;
127  model->H = NULL;
128  model->rho = NULL;
129  model->data_file = NULL;
130 
131  return model;
132 }
133 
144 void gensvm_allocate_model(struct GenModel *model)
145 {
146  long n = model->n;
147  long m = model->m;
148  long K = model->K;
149 
150  model->V = Calloc(double, (m+1)*(K-1));
151  model->Vbar = Calloc(double, (m+1)*(K-1));
152  model->U = Calloc(double, K*(K-1));
153  model->UU = Calloc(double, K*K*(K-1));
154  model->Q = Calloc(double, n*K);
155  model->H = Calloc(double, n*K);
156  model->rho = Calloc(double, n);
157 }
158 
172 void gensvm_reallocate_model(struct GenModel *model, long n, long m)
173 {
174  long K = model->K;
175 
176  if (model->n == n && model->m == m)
177  return;
178  if (model->n != n) {
179  model->Q = Realloc(model->Q, double, n*K);
180  Memset(model->Q, double, n*K);
181 
182  model->H = Realloc(model->H, double, n*K);
183  Memset(model->H, double, n*K);
184 
185  model->rho = Realloc(model->rho, double, n);
186  Memset(model->rho, double, n);
187 
188  model->n = n;
189  }
190  if (model->m != m) {
191  model->V = Realloc(model->V, double, (m+1)*(K-1));
192  Memset(model->V, double, (m+1)*(K-1));
193 
194  model->Vbar = Realloc(model->Vbar, double, (m+1)*(K-1));
195  Memset(model->Vbar, double, (m+1)*(K-1));
196 
197  model->m = m;
198  }
199 }
200 
211 void gensvm_free_model(struct GenModel *model)
212 {
213  if (model == NULL)
214  return;
215 
216  free(model->V);
217  free(model->Vbar);
218  free(model->U);
219  free(model->UU);
220  free(model->Q);
221  free(model->H);
222  free(model->rho);
223  free(model->data_file);
224 
225  free(model);
226  model = NULL;
227 }
228 
245 struct GenWork *gensvm_init_work(struct GenModel *model)
246 {
247  long n = model->n;
248  long m = model->m;
249  long K = model->K;
250 
251  struct GenWork *work = Malloc(struct GenWork, 1);
252  work->n = n;
253  work->m = m;
254  work->K = K;
255 
256  work->LZ = Calloc(double, n*(m+1));
257  work->ZB = Calloc(double, (m+1)*(K-1)),
258  work->ZBc = Calloc(double, (m+1)*(K-1)),
259  work->ZAZ = Calloc(double, (m+1)*(m+1)),
260  work->tmpZAZ = Calloc(double, (m+1)*(m+1)),
261  work->ZV = Calloc(double, n*(K-1));
262  work->beta = Calloc(double, K-1);
263 
264  return work;
265 }
266 
277 void gensvm_free_work(struct GenWork *work)
278 {
279  free(work->LZ);
280  free(work->ZB);
281  free(work->ZBc);
282  free(work->ZAZ);
283  free(work->tmpZAZ);
284  free(work->ZV);
285  free(work->beta);
286  free(work);
287  work = NULL;
288 }
289 
302 void gensvm_reset_work(struct GenWork *work)
303 {
304  long n = work->n;
305  long m = work->m;
306  long K = work->K;
307 
308  Memset(work->LZ, double, n*(m+1));
309  Memset(work->ZB, double, (m+1)*(K-1)),
310  Memset(work->ZBc, double, (m+1)*(K-1)),
311  Memset(work->ZAZ, double, (m+1)*(m+1)),
312  Memset(work->tmpZAZ, double, (m+1)*(m+1)),
313  Memset(work->ZV, double, n*(K-1));
314  Memset(work->beta, double, K-1);
315 }
#define Calloc(type, size)
Definition: gensvm_memory.h:40
long K
number of classes for the workspace
Definition: gensvm_base.h:156
double * H
Huber weighted error matrix.
Definition: gensvm_base.h:126
double * LZ
n x (m+1) working matrix for the Z'*A*Z calculation
Definition: gensvm_base.h:159
double gamma
kernel parameter for RBF, poly, and sigmoid
Definition: gensvm_base.h:80
void gensvm_free_model(struct GenModel *model)
Free allocated GenModel struct.
Definition: gensvm_base.c:211
double epsilon
stopping criterion for the IM algorithm.
Definition: gensvm_base.h:101
void gensvm_reallocate_model(struct GenModel *model, long n, long m)
Reallocate memory for GenModel.
Definition: gensvm_base.c:172
double training_error
loss function value after training has finished
Definition: gensvm_base.h:130
long m
number of features for the workspace
Definition: gensvm_base.h:154
struct GenData * gensvm_init_data(void)
Initialize a GenData structure.
Definition: gensvm_base.c:45
double p
parameter for the L-p norm in the loss function
Definition: gensvm_base.h:103
double * UU
simplex difference matrix
Definition: gensvm_base.h:122
struct GenModel * gensvm_init_model(void)
Initialize a GenModel structure.
Definition: gensvm_base.c:102
#define Memset(var, type, size)
Definition: gensvm_memory.h:61
double * ZV
n x (K-1) working matrix for the Z * V calculation
Definition: gensvm_base.h:169
void gensvm_free_sparse(struct GenSparse *sp)
Free an allocated GenSparse structure.
Definition: gensvm_sparse.c:62
double degree
kernel parameter for poly
Definition: gensvm_base.h:84
double * Z
Definition: gensvm_base.h:68
A structure to hold the GenSVM workspace.
Definition: gensvm_base.h:151
struct GenWork * gensvm_init_work(struct GenModel *model)
Initialize the workspace structure.
Definition: gensvm_base.c:245
int status
status of the model after training
Definition: gensvm_base.h:143
double * ZBc
(K-1) x (m+1) working matrix for the Z'*B calculation
Definition: gensvm_base.h:163
int weight_idx
which weights to use (1 = unit, 2 = group)
Definition: gensvm_base.h:93
#define Malloc(type, size)
Definition: gensvm_memory.h:48
double * V
augmented weight matrix
Definition: gensvm_base.h:115
double * Q
error matrix
Definition: gensvm_base.h:124
double * ZAZ
(m+1) x (m+1) working matrix for the Z'*A*Z calculation
Definition: gensvm_base.h:165
long * y
array of class labels, 1..K
Definition: gensvm_base.h:66
void gensvm_reset_work(struct GenWork *work)
Reset all matrices of a GenWork instance.
Definition: gensvm_base.c:302
A structure to represent the data.
Definition: gensvm_base.h:57
A structure to represent a single GenSVM model.
Definition: gensvm_base.h:92
double * ZB
(m+1) x (K-1) working matrix for the Z'*B calculation
Definition: gensvm_base.h:161
void gensvm_free_work(struct GenWork *work)
Free an allocated GenWork instance.
Definition: gensvm_base.c:277
KernelType kerneltype
Definition: gensvm_base.h:77
void gensvm_free_data(struct GenData *data)
Free allocated GenData struct.
Definition: gensvm_base.c:73
#define Realloc(var, type, size)
Definition: gensvm_memory.h:55
double * Vbar
Definition: gensvm_base.h:117
double * tmpZAZ
(m+1) x (m+1) temporary working matrix for the Z'*A*Z calculation
Definition: gensvm_base.h:167
double * Sigma
eigenvalues from the reduced eigendecomposition
Definition: gensvm_base.h:75
char * data_file
filename of the data
Definition: gensvm_base.h:134
void gensvm_allocate_model(struct GenModel *model)
Allocate memory for a GenModel.
Definition: gensvm_base.c:144
long n
number of instances in the dataset
Definition: gensvm_base.h:97
long max_iter
maximum number of iterations of the algorithm
Definition: gensvm_base.h:141
double * rho
vector of instance weights
Definition: gensvm_base.h:128
long elapsed_iter
number of elapsed iterations in training
Definition: gensvm_base.h:132
double * U
simplex matrix
Definition: gensvm_base.h:120
double kappa
parameter for the Huber hinge function
Definition: gensvm_base.h:105
long K
number of classes in the dataset
Definition: gensvm_base.h:95
double degree
kernel parameter for poly
Definition: gensvm_base.h:113
double coef
kernel parameter for poly and sigmoid
Definition: gensvm_base.h:111
KernelType kerneltype
type of kernel used in the model
Definition: gensvm_base.h:136
double gamma
kernel parameter for RBF, poly, and sigmoid
Definition: gensvm_base.h:109
double coef
kernel parameter for poly and sigmoid
Definition: gensvm_base.h:82
Header file for gensvm_base.c.
long n
number of instances for the workspace
Definition: gensvm_base.h:152
long m
number of predictor variables in the dataset
Definition: gensvm_base.h:99
double * RAW
augmented raw data matrix
Definition: gensvm_base.h:73
double kernel_eigen_cutoff
cutoff value for the ratio of eigenvalues in the reduced
Definition: gensvm_base.h:138
struct GenSparse * spZ
sparse representation of the augmented data matrix
Definition: gensvm_base.h:71
double * beta
K-1 working vector for a row of the B matrix.
Definition: gensvm_base.h:171
double lambda
regularization parameter in the loss function
Definition: gensvm_base.h:107