GenSVM
test_gensvm_optimize.c
Go to the documentation of this file.
1 
27 #include "minunit.h"
28 #include "gensvm_optimize.h"
29 #include "gensvm_init.h"
30 
32 {
33  struct GenModel *model = gensvm_init_model();
34  struct GenModel *seed_model = gensvm_init_model();
35  struct GenData *data = gensvm_init_data();
36 
37  int n = 8,
38  m = 3,
39  K = 4;
40  data->n = n;
41  data->m = m;
42  data->r = m;
43  data->K = K;
44 
45  model->n = n;
46  model->m = m;
47  model->K = K;
48 
49  seed_model->n = n;
50  seed_model->m = m;
51  seed_model->K = K;
52 
53  data->Z = Malloc(double, n*(m+1));
54  data->y = Malloc(long, n);
55 
56  matrix_set(data->Z, data->m+1, 0, 0, 1.0);
57  matrix_set(data->Z, data->m+1, 0, 1, 0.8740239771176158);
58  matrix_set(data->Z, data->m+1, 0, 2, 0.3231542341162253);
59  matrix_set(data->Z, data->m+1, 0, 3, 0.2533980609669184);
60  matrix_set(data->Z, data->m+1, 1, 0, 1.0);
61  matrix_set(data->Z, data->m+1, 1, 1, 0.3433368959379667);
62  matrix_set(data->Z, data->m+1, 1, 2, 0.2945713387329698);
63  matrix_set(data->Z, data->m+1, 1, 3, 0.3042498181639990);
64  matrix_set(data->Z, data->m+1, 2, 0, 1.0);
65  matrix_set(data->Z, data->m+1, 2, 1, 0.6513609117457242);
66  matrix_set(data->Z, data->m+1, 2, 2, 0.7738077314847138);
67  matrix_set(data->Z, data->m+1, 2, 3, 0.4426344045213226);
68  matrix_set(data->Z, data->m+1, 3, 0, 1.0);
69  matrix_set(data->Z, data->m+1, 3, 1, 0.7223733317092962);
70  matrix_set(data->Z, data->m+1, 3, 2, 0.9718611208972370);
71  matrix_set(data->Z, data->m+1, 3, 3, 0.0796059591969125);
72  matrix_set(data->Z, data->m+1, 4, 0, 1.0);
73  matrix_set(data->Z, data->m+1, 4, 1, 0.3014806706103061);
74  matrix_set(data->Z, data->m+1, 4, 2, 0.1728058294642182);
75  matrix_set(data->Z, data->m+1, 4, 3, 0.0851401652628196);
76  matrix_set(data->Z, data->m+1, 5, 0, 1.0);
77  matrix_set(data->Z, data->m+1, 5, 1, 0.5114600128301799);
78  matrix_set(data->Z, data->m+1, 5, 2, 0.3319865781913825);
79  matrix_set(data->Z, data->m+1, 5, 3, 0.3330906711041684);
80  matrix_set(data->Z, data->m+1, 6, 0, 1.0);
81  matrix_set(data->Z, data->m+1, 6, 1, 0.5824718351045201);
82  matrix_set(data->Z, data->m+1, 6, 2, 0.7224023004247955);
83  matrix_set(data->Z, data->m+1, 6, 3, 0.0937250920308128);
84  matrix_set(data->Z, data->m+1, 7, 0, 1.0);
85  matrix_set(data->Z, data->m+1, 7, 1, 0.8228264179835741);
86  matrix_set(data->Z, data->m+1, 7, 2, 0.4580785175957617);
87  matrix_set(data->Z, data->m+1, 7, 3, 0.7585636149680212);
88 
89  data->y[0] = 2;
90  data->y[1] = 1;
91  data->y[2] = 3;
92  data->y[3] = 2;
93  data->y[4] = 3;
94  data->y[5] = 2;
95  data->y[6] = 4;
96  data->y[7] = 1;
97 
98  model->p = 1.2143;
99  model->kappa = 0.90298;
100  model->lambda = 0.00219038;
101  model->epsilon = 1e-15;
102 
103  gensvm_allocate_model(model);
104  gensvm_allocate_model(seed_model);
105  matrix_set(seed_model->V, K-1, 0, 0, 0.3294151808829250);
106  matrix_set(seed_model->V, K-1, 0, 1, 0.8400578887926284);
107  matrix_set(seed_model->V, K-1, 0, 2, 0.9336268164013294);
108  matrix_set(seed_model->V, K-1, 1, 0, 0.6047157463292797);
109  matrix_set(seed_model->V, K-1, 1, 1, 0.1390735925868357);
110  matrix_set(seed_model->V, K-1, 1, 2, 0.6579825380479839);
111  matrix_set(seed_model->V, K-1, 2, 0, 0.7628723943431572);
112  matrix_set(seed_model->V, K-1, 2, 1, 0.3505528063594583);
113  matrix_set(seed_model->V, K-1, 2, 2, 0.1221488022463632);
114  matrix_set(seed_model->V, K-1, 3, 0, 0.4561071643209315);
115  matrix_set(seed_model->V, K-1, 3, 1, 0.0840834388268874);
116  matrix_set(seed_model->V, K-1, 3, 2, 0.5312457860071739);
117 
118  gensvm_init_V(seed_model, model, data);
119  gensvm_initialize_weights(data, model);
120 
121  model->rho[0] = 0.3607870295944514;
122  model->rho[1] = 0.2049421299461539;
123  model->rho[2] = 0.0601488725348535;
124  model->rho[3] = 0.4504181439770731;
125  model->rho[4] = 0.0925063643277065;
126  model->rho[5] = 0.2634120202183680;
127  model->rho[6] = 0.8675978657103286;
128  model->rho[7] = 0.1633697022472280;
129 
130  // start test code //
131  gensvm_optimize(model, data);
132 
133  double eps = 1e-7;
134  mu_assert(fabs(matrix_get(model->V, model->K-1, 0, 0) -
135  -0.3268931274065331) < eps,
136  "Incorrect model->V at 0, 0");
137  mu_assert(fabs(matrix_get(model->V, model->K-1, 0, 1) -
138  0.1117992620472728) < eps,
139  "Incorrect model->V at 0, 1");
140  mu_assert(fabs(matrix_get(model->V, model->K-1, 0, 2) -
141  0.1988823609241294) < eps,
142  "Incorrect model->V at 0, 2");
143  mu_assert(fabs(matrix_get(model->V, model->K-1, 1, 0) -
144  1.2997452108481067) < eps,
145  "Incorrect model->V at 1, 0");
146  mu_assert(fabs(matrix_get(model->V, model->K-1, 1, 1) -
147  -0.7171806413563449) < eps,
148  "Incorrect model->V at 1, 1");
149  mu_assert(fabs(matrix_get(model->V, model->K-1, 1, 2) -
150  -0.4657948105281003) < eps,
151  "Incorrect model->V at 1, 2");
152  mu_assert(fabs(matrix_get(model->V, model->K-1, 2, 0) -
153  0.4408949033586493) < eps,
154  "Incorrect model->V at 2, 0");
155  mu_assert(fabs(matrix_get(model->V, model->K-1, 2, 1) -
156  0.0257888242538633) < eps,
157  "Incorrect model->V at 2, 1");
158  mu_assert(fabs(matrix_get(model->V, model->K-1, 2, 2) -
159  1.1285833836998647) < eps,
160  "Incorrect model->V at 2, 2");
161  mu_assert(fabs(matrix_get(model->V, model->K-1, 3, 0) -
162  -1.1983357619969028) < eps,
163  "Incorrect model->V at 3, 0");
164  mu_assert(fabs(matrix_get(model->V, model->K-1, 3, 1) -
165  -0.4872684816635944) < eps,
166  "Incorrect model->V at 3, 1");
167  mu_assert(fabs(matrix_get(model->V, model->K-1, 3, 2) -
168  -1.3711836483504121) < eps,
169  "Incorrect model->V at 3, 2");
170 
171  // end test code //
172 
173  gensvm_free_data(data);
174  gensvm_free_model(model);
175  gensvm_free_model(seed_model);
176 
177  return NULL;
178 }
179 
181 {
182  struct GenModel *model = gensvm_init_model();
183  struct GenData *data = gensvm_init_data();
184 
185  int n = 8,
186  m = 3,
187  K = 3;
188  model->n = n;
189  model->m = m;
190  model->K = K;
191  struct GenWork *work = gensvm_init_work(model);
192 
193  // initialize the data
194  data->n = n;
195  data->K = K;
196  data->m = m;
197 
198 
199  data->y = Calloc(long, data->n);
200  data->y[0] = 2;
201  data->y[1] = 1;
202  data->y[2] = 3;
203  data->y[3] = 2;
204  data->y[4] = 3;
205  data->y[5] = 3;
206  data->y[6] = 1;
207  data->y[7] = 2;
208 
209  data->Z = Calloc(double, (data->n)*(data->m+1));
210  matrix_set(data->Z, data->m+1, 0, 0, 1.0000000000000000);
211  matrix_set(data->Z, data->m+1, 0, 1, 0.6112542725178001);
212  matrix_set(data->Z, data->m+1, 0, 2, -0.7672096202890778);
213  matrix_set(data->Z, data->m+1, 0, 3, -0.2600867145849611);
214  matrix_set(data->Z, data->m+1, 1, 0, 1.0000000000000000);
215  matrix_set(data->Z, data->m+1, 1, 1, 0.5881180210361963);
216  matrix_set(data->Z, data->m+1, 1, 2, -0.5419496202623567);
217  matrix_set(data->Z, data->m+1, 1, 3, 0.7079932865564023);
218  matrix_set(data->Z, data->m+1, 2, 0, 1.0000000000000000);
219  matrix_set(data->Z, data->m+1, 2, 1, -0.9411484777876639);
220  matrix_set(data->Z, data->m+1, 2, 2, -0.0251648291772256);
221  matrix_set(data->Z, data->m+1, 2, 3, 0.5335722872738475);
222  matrix_set(data->Z, data->m+1, 3, 0, 1.0000000000000000);
223  matrix_set(data->Z, data->m+1, 3, 1, -0.6506872332924795);
224  matrix_set(data->Z, data->m+1, 3, 2, -0.6277901989029552);
225  matrix_set(data->Z, data->m+1, 3, 3, -0.1196037902922388);
226  matrix_set(data->Z, data->m+1, 4, 0, 1.0000000000000000);
227  matrix_set(data->Z, data->m+1, 4, 1, -0.9955402476800429);
228  matrix_set(data->Z, data->m+1, 4, 2, -0.9514564047869466);
229  matrix_set(data->Z, data->m+1, 4, 3, -0.1093968234456487);
230  matrix_set(data->Z, data->m+1, 5, 0, 1.0000000000000000);
231  matrix_set(data->Z, data->m+1, 5, 1, 0.3277661334163890);
232  matrix_set(data->Z, data->m+1, 5, 2, 0.8271472175263959);
233  matrix_set(data->Z, data->m+1, 5, 3, 0.6938788574898458);
234  matrix_set(data->Z, data->m+1, 6, 0, 1.0000000000000000);
235  matrix_set(data->Z, data->m+1, 6, 1, -0.8459013990907077);
236  matrix_set(data->Z, data->m+1, 6, 2, -0.2453035880572786);
237  matrix_set(data->Z, data->m+1, 6, 3, 0.0078257345629504);
238  matrix_set(data->Z, data->m+1, 7, 0, 1.0000000000000000);
239  matrix_set(data->Z, data->m+1, 7, 1, -0.4629532094536982);
240  matrix_set(data->Z, data->m+1, 7, 2, 0.2935215202707828);
241  matrix_set(data->Z, data->m+1, 7, 3, 0.0540516162042732);
242 
243  // initialize the model
244  model->weight_idx = 1;
245  model->kappa = 0.5;
246  model->p = 1.5;
247  model->lambda = 0.123;
248 
249  gensvm_allocate_model(model);
250  gensvm_initialize_weights(data, model);
251  gensvm_simplex(model);
252  gensvm_simplex_diff(model);
253 
254  matrix_set(model->V, model->K-1, 0, 0, 0.6019309459245683);
255  matrix_set(model->V, model->K-1, 0, 1, 0.0063825200426701);
256  matrix_set(model->V, model->K-1, 1, 0, -0.9130102529085783);
257  matrix_set(model->V, model->K-1, 1, 1, -0.8230766493212237);
258  matrix_set(model->V, model->K-1, 2, 0, 0.5727079522160434);
259  matrix_set(model->V, model->K-1, 2, 1, 0.6466468145039965);
260  matrix_set(model->V, model->K-1, 3, 0, -0.8065680884346328);
261  matrix_set(model->V, model->K-1, 3, 1, 0.5912336906588613);
262 
263  // start test code //
264  double loss = gensvm_get_loss(model, data, work);
265 
266  mu_assert(fabs(loss - 0.903071383013108) < 1e-14,
267  "Incorrect value of the loss");
268 
269  // end test code //
270 
271  gensvm_free_model(model);
272  gensvm_free_data(data);
273  gensvm_free_work(work);
274 
275 
276  return NULL;
277 }
278 
280 {
281  struct GenModel *model = gensvm_init_model();
282  struct GenData *data = gensvm_init_data();
283 
284  int n = 8,
285  m = 3,
286  K = 3;
287  model->n = n;
288  model->m = m;
289  model->K = K;
290  struct GenWork *work = gensvm_init_work(model);
291 
292  // initialize the data
293  data->n = n;
294  data->K = K;
295  data->m = m;
296 
297  data->y = Calloc(long, data->n);
298  data->y[0] = 2;
299  data->y[1] = 1;
300  data->y[2] = 3;
301  data->y[3] = 2;
302  data->y[4] = 3;
303  data->y[5] = 3;
304  data->y[6] = 1;
305  data->y[7] = 2;
306 
307  data->Z = Calloc(double, (data->n)*(data->m+1));
308  matrix_set(data->Z, data->m+1, 0, 0, 1.0000000000000000);
309  matrix_set(data->Z, data->m+1, 0, 1, 0.6112542725178001);
310  matrix_set(data->Z, data->m+1, 0, 2, -0.7672096202890778);
311  matrix_set(data->Z, data->m+1, 0, 3, -0.2600867145849611);
312  matrix_set(data->Z, data->m+1, 1, 0, 1.0000000000000000);
313  matrix_set(data->Z, data->m+1, 1, 1, 0.5881180210361963);
314  matrix_set(data->Z, data->m+1, 1, 2, -0.5419496202623567);
315  matrix_set(data->Z, data->m+1, 1, 3, 0.7079932865564023);
316  matrix_set(data->Z, data->m+1, 2, 0, 1.0000000000000000);
317  matrix_set(data->Z, data->m+1, 2, 1, -0.9411484777876639);
318  matrix_set(data->Z, data->m+1, 2, 2, -0.0251648291772256);
319  matrix_set(data->Z, data->m+1, 2, 3, 0.5335722872738475);
320  matrix_set(data->Z, data->m+1, 3, 0, 1.0000000000000000);
321  matrix_set(data->Z, data->m+1, 3, 1, -0.6506872332924795);
322  matrix_set(data->Z, data->m+1, 3, 2, -0.6277901989029552);
323  matrix_set(data->Z, data->m+1, 3, 3, -0.1196037902922388);
324  matrix_set(data->Z, data->m+1, 4, 0, 1.0000000000000000);
325  matrix_set(data->Z, data->m+1, 4, 1, -0.9955402476800429);
326  matrix_set(data->Z, data->m+1, 4, 2, -0.9514564047869466);
327  matrix_set(data->Z, data->m+1, 4, 3, -0.1093968234456487);
328  matrix_set(data->Z, data->m+1, 5, 0, 1.0000000000000000);
329  matrix_set(data->Z, data->m+1, 5, 1, 0.3277661334163890);
330  matrix_set(data->Z, data->m+1, 5, 2, 0.8271472175263959);
331  matrix_set(data->Z, data->m+1, 5, 3, 0.6938788574898458);
332  matrix_set(data->Z, data->m+1, 6, 0, 1.0000000000000000);
333  matrix_set(data->Z, data->m+1, 6, 1, -0.8459013990907077);
334  matrix_set(data->Z, data->m+1, 6, 2, -0.2453035880572786);
335  matrix_set(data->Z, data->m+1, 6, 3, 0.0078257345629504);
336  matrix_set(data->Z, data->m+1, 7, 0, 1.0000000000000000);
337  matrix_set(data->Z, data->m+1, 7, 1, -0.4629532094536982);
338  matrix_set(data->Z, data->m+1, 7, 2, 0.2935215202707828);
339  matrix_set(data->Z, data->m+1, 7, 3, 0.0540516162042732);
340 
341  // initialize the model
342  model->weight_idx = 2;
343  model->kappa = 0.5;
344  model->p = 1.5;
345  model->lambda = 0.123;
346 
347  gensvm_allocate_model(model);
348  gensvm_initialize_weights(data, model);
349  gensvm_simplex(model);
350  gensvm_simplex_diff(model);
351 
352  matrix_set(model->V, model->K-1, 0, 0, 0.6019309459245683);
353  matrix_set(model->V, model->K-1, 0, 1, 0.0063825200426701);
354  matrix_set(model->V, model->K-1, 1, 0, -0.9130102529085783);
355  matrix_set(model->V, model->K-1, 1, 1, -0.8230766493212237);
356  matrix_set(model->V, model->K-1, 2, 0, 0.5727079522160434);
357  matrix_set(model->V, model->K-1, 2, 1, 0.6466468145039965);
358  matrix_set(model->V, model->K-1, 3, 0, -0.8065680884346328);
359  matrix_set(model->V, model->K-1, 3, 1, 0.5912336906588613);
360 
361  // start test code //
362  double loss = gensvm_get_loss(model, data, work);
363 
364  mu_assert(fabs(loss - 0.972847045993281) < 1e-14,
365  "Incorrect value of the loss");
366  // end test code //
367 
368  gensvm_free_model(model);
369  gensvm_free_data(data);
370  gensvm_free_work(work);
371 
372  return NULL;
373 }
374 
376 {
377  struct GenModel *model = gensvm_init_model();
378  struct GenData *data = gensvm_init_data();
379 
380  int n = 8,
381  m = 3,
382  K = 3;
383 
384  // initialize the data
385  data->n = n;
386  data->K = K;
387  data->m = m;
388 
389  data->y = Calloc(long, data->n);
390  data->y[0] = 2;
391  data->y[1] = 1;
392  data->y[2] = 3;
393  data->y[3] = 2;
394  data->y[4] = 3;
395  data->y[5] = 3;
396  data->y[6] = 1;
397  data->y[7] = 2;
398 
399  data->Z = Calloc(double, (data->n)*(data->m+1));
400  matrix_set(data->Z, data->m+1, 0, 0, 1.0000000000000000);
401  matrix_set(data->Z, data->m+1, 0, 1, 0.6112542725178001);
402  matrix_set(data->Z, data->m+1, 0, 2, -0.7672096202890778);
403  matrix_set(data->Z, data->m+1, 0, 3, -0.2600867145849611);
404  matrix_set(data->Z, data->m+1, 1, 0, 1.0000000000000000);
405  matrix_set(data->Z, data->m+1, 1, 1, 0.5881180210361963);
406  matrix_set(data->Z, data->m+1, 1, 2, -0.5419496202623567);
407  matrix_set(data->Z, data->m+1, 1, 3, 0.7079932865564023);
408  matrix_set(data->Z, data->m+1, 2, 0, 1.0000000000000000);
409  matrix_set(data->Z, data->m+1, 2, 1, -0.9411484777876639);
410  matrix_set(data->Z, data->m+1, 2, 2, -0.0251648291772256);
411  matrix_set(data->Z, data->m+1, 2, 3, 0.5335722872738475);
412  matrix_set(data->Z, data->m+1, 3, 0, 1.0000000000000000);
413  matrix_set(data->Z, data->m+1, 3, 1, -0.6506872332924795);
414  matrix_set(data->Z, data->m+1, 3, 2, -0.6277901989029552);
415  matrix_set(data->Z, data->m+1, 3, 3, -0.1196037902922388);
416  matrix_set(data->Z, data->m+1, 4, 0, 1.0000000000000000);
417  matrix_set(data->Z, data->m+1, 4, 1, -0.9955402476800429);
418  matrix_set(data->Z, data->m+1, 4, 2, -0.9514564047869466);
419  matrix_set(data->Z, data->m+1, 4, 3, -0.1093968234456487);
420  matrix_set(data->Z, data->m+1, 5, 0, 1.0000000000000000);
421  matrix_set(data->Z, data->m+1, 5, 1, 0.3277661334163890);
422  matrix_set(data->Z, data->m+1, 5, 2, 0.8271472175263959);
423  matrix_set(data->Z, data->m+1, 5, 3, 0.6938788574898458);
424  matrix_set(data->Z, data->m+1, 6, 0, 1.0000000000000000);
425  matrix_set(data->Z, data->m+1, 6, 1, -0.8459013990907077);
426  matrix_set(data->Z, data->m+1, 6, 2, -0.2453035880572786);
427  matrix_set(data->Z, data->m+1, 6, 3, 0.0078257345629504);
428  matrix_set(data->Z, data->m+1, 7, 0, 1.0000000000000000);
429  matrix_set(data->Z, data->m+1, 7, 1, -0.4629532094536982);
430  matrix_set(data->Z, data->m+1, 7, 2, 0.2935215202707828);
431  matrix_set(data->Z, data->m+1, 7, 3, 0.0540516162042732);
432 
433  // initialize the model
434  model->n = n;
435  model->m = m;
436  model->K = K;
437  gensvm_allocate_model(model);
438  gensvm_simplex(model);
439  gensvm_simplex_diff(model);
440 
441  matrix_set(model->V, model->K-1, 0, 0, 0.6019309459245683);
442  matrix_set(model->V, model->K-1, 0, 1, 0.0063825200426701);
443  matrix_set(model->V, model->K-1, 1, 0, -0.9130102529085783);
444  matrix_set(model->V, model->K-1, 1, 1, -0.8230766493212237);
445  matrix_set(model->V, model->K-1, 2, 0, 0.5727079522160434);
446  matrix_set(model->V, model->K-1, 2, 1, 0.6466468145039965);
447  matrix_set(model->V, model->K-1, 3, 0, -0.8065680884346328);
448  matrix_set(model->V, model->K-1, 3, 1, 0.5912336906588613);
449 
450  // start test code //
451  double *ZV = Calloc(double, (data->n)*(data->K-1));
452  gensvm_calculate_errors(model, data, ZV);
453 
454  // test ZV values
455  mu_assert(fabs(matrix_get(ZV, data->K-1, 0, 0) -
456  -0.1857598783645273) < 1e-14,
457  "Incorrect value of ZV at 0, 0");
458  mu_assert(fabs(matrix_get(ZV, data->K-1, 0, 1) -
459  -1.1466122836367203) < 1e-14,
460  "Incorrect value of ZV at 0, 1");
461  mu_assert(fabs(matrix_get(ZV, data->K-1, 1, 0) -
462  -0.8164504861888491) < 1e-14,
463  "Incorrect value of ZV at 1, 0");
464  mu_assert(fabs(matrix_get(ZV, data->K-1, 1, 1) -
465  -0.4095442019090963) < 1e-14,
466  "Incorrect value of ZV at 1, 1");
467  mu_assert(fabs(matrix_get(ZV, data->K-1, 2, 0) -
468  1.0164346780798894) < 1e-14,
469  "Incorrect value of ZV at 2, 0");
470  mu_assert(fabs(matrix_get(ZV, data->K-1, 2, 1) -
471  1.0802130116671276) < 1e-14,
472  "Incorrect value of ZV at 2, 1");
473  mu_assert(fabs(matrix_get(ZV, data->K-1, 3, 0) -
474  0.9329432226278516) < 1e-14,
475  "Incorrect value of ZV at 3, 0");
476  mu_assert(fabs(matrix_get(ZV, data->K-1, 3, 1) -
477  0.0652756651284464) < 1e-14,
478  "Incorrect value of ZV at 3, 1");
479  mu_assert(fabs(matrix_get(ZV, data->K-1, 4, 0) -
480  1.0541987367985999) < 1e-14,
481  "Incorrect value of ZV at 4, 0");
482  mu_assert(fabs(matrix_get(ZV, data->K-1, 4, 1) -
483  0.1458531104005502) < 1e-14,
484  "Incorrect value of ZV at 4, 1");
485  mu_assert(fabs(matrix_get(ZV, data->K-1, 5, 0) -
486  0.2167303509991526) < 1e-14,
487  "Incorrect value of ZV at 5, 0");
488  mu_assert(fabs(matrix_get(ZV, data->K-1, 5, 1) -
489  0.6817225403124993) < 1e-14,
490  "Incorrect value of ZV at 5, 1");
491  mu_assert(fabs(matrix_get(ZV, data->K-1, 6, 0) -
492  1.2274482928895278) < 1e-14,
493  "Incorrect value of ZV at 6, 0");
494  mu_assert(fabs(matrix_get(ZV, data->K-1, 6, 1) -
495  0.5486262633865150) < 1e-14,
496  "Incorrect value of ZV at 6, 1");
497  mu_assert(fabs(matrix_get(ZV, data->K-1, 7, 0) -
498  1.1491177728196642) < 1e-14,
499  "Incorrect value of ZV at 7, 0");
500  mu_assert(fabs(matrix_get(ZV, data->K-1, 7, 1) -
501  0.6091903890783275) < 1e-14,
502  "Incorrect value of ZV at 7, 1");
503 
504  // test Q values
505  mu_assert(fabs(matrix_get(model->Q, data->K, 0, 0) -
506  -0.1857598783645273) < 1e-14,
507  "Incorrect value of Q at 0, 0");
508  mu_assert(fabs(matrix_get(model->Q, data->K, 0, 1) -
509  0.0000000000000000) < 1e-14,
510  "Incorrect value of Q at 0, 1");
511  mu_assert(fabs(matrix_get(model->Q, data->K, 0, 2) -
512  0.9001154267384245) < 1e-14,
513  "Incorrect value of Q at 0, 2");
514  mu_assert(fabs(matrix_get(model->Q, data->K, 1, 0) -
515  0.0000000000000000) < 1e-14,
516  "Incorrect value of Q at 1, 0");
517  mu_assert(fabs(matrix_get(model->Q, data->K, 1, 1) -
518  0.8164504861888491) < 1e-14,
519  "Incorrect value of Q at 1, 1");
520  mu_assert(fabs(matrix_get(model->Q, data->K, 1, 2) -
521  0.7629009259203254) < 1e-14,
522  "Incorrect value of Q at 1, 2");
523  mu_assert(fabs(matrix_get(model->Q, data->K, 2, 0) -
524  1.4437092486421736) < 1e-14,
525  "Incorrect value of Q at 2, 0");
526  mu_assert(fabs(matrix_get(model->Q, data->K, 2, 1) -
527  0.4272745705622841) < 1e-14,
528  "Incorrect value of Q at 2, 1");
529  mu_assert(fabs(matrix_get(model->Q, data->K, 2, 2) -
530  0.0000000000000000) < 1e-14,
531  "Incorrect value of Q at 2, 2");
532  mu_assert(fabs(matrix_get(model->Q, data->K, 3, 0) -
533  0.9329432226278516) < 1e-14,
534  "Incorrect value of Q at 3, 0");
535  mu_assert(fabs(matrix_get(model->Q, data->K, 3, 1) -
536  0.0000000000000000) < 1e-14,
537  "Incorrect value of Q at 3, 1");
538  mu_assert(fabs(matrix_get(model->Q, data->K, 3, 2) -
539  0.4099412270637651) < 1e-14,
540  "Incorrect value of Q at 3, 2");
541  mu_assert(fabs(matrix_get(model->Q, data->K, 4, 0) -
542  0.6534118672271528) < 1e-14,
543  "Incorrect value of Q at 4, 0");
544  mu_assert(fabs(matrix_get(model->Q, data->K, 4, 1) -
545  -0.4007868695714470) < 1e-14,
546  "Incorrect value of Q at 4, 1");
547  mu_assert(fabs(matrix_get(model->Q, data->K, 4, 2) -
548  0.0000000000000000) < 1e-14,
549  "Incorrect value of Q at 4, 2");
550  mu_assert(fabs(matrix_get(model->Q, data->K, 5, 0) -
551  0.6987542137426619) < 1e-14,
552  "Incorrect value of Q at 5, 0");
553  mu_assert(fabs(matrix_get(model->Q, data->K, 5, 1) -
554  0.4820238627435093) < 1e-14,
555  "Incorrect value of Q at 5, 1");
556  mu_assert(fabs(matrix_get(model->Q, data->K, 5, 2) -
557  0.0000000000000000) < 1e-14,
558  "Incorrect value of Q at 5, 2");
559  mu_assert(fabs(matrix_get(model->Q, data->K, 6, 0) -
560  0.0000000000000000) < 1e-14,
561  "Incorrect value of Q at 6, 0");
562  mu_assert(fabs(matrix_get(model->Q, data->K, 6, 1) -
563  -1.2274482928895278) < 1e-14,
564  "Incorrect value of Q at 6, 1");
565  mu_assert(fabs(matrix_get(model->Q, data->K, 6, 2) -
566  -1.0888484277208184) < 1e-14,
567  "Incorrect value of Q at 6, 2");
568  mu_assert(fabs(matrix_get(model->Q, data->K, 7, 0) -
569  1.1491177728196642) < 1e-14,
570  "Incorrect value of Q at 7, 0");
571  mu_assert(fabs(matrix_get(model->Q, data->K, 7, 1) -
572  0.0000000000000000) < 1e-14,
573  "Incorrect value of Q at 7, 1");
574  mu_assert(fabs(matrix_get(model->Q, data->K, 7, 2) -
575  0.0469845337266742) < 1e-14,
576  "Incorrect value of Q at 7, 2");
577 
578  free(ZV);
579  // end test code //
580 
581  gensvm_free_model(model);
582  gensvm_free_data(data);
583 
584  return NULL;
585 }
586 
588 {
589  struct GenModel *model = gensvm_init_model();
590  model->n = 5;
591  model->m = 3;
592  model->K = 3;
593  model->kappa = 0.5;
594 
595  gensvm_allocate_model(model);
596 
597  matrix_set(model->Q, model->K, 0, 0, -0.3386242674244120);
598  matrix_set(model->Q, model->K, 0, 1, 1.0828252163937386);
599  matrix_set(model->Q, model->K, 0, 2, 0.9734009993634181);
600  matrix_set(model->Q, model->K, 1, 0, 1.3744927461858576);
601  matrix_set(model->Q, model->K, 1, 1, 1.8086820272988162);
602  matrix_set(model->Q, model->K, 1, 2, 0.9587412628706828);
603  matrix_set(model->Q, model->K, 2, 0, -0.0530412768492290);
604  matrix_set(model->Q, model->K, 2, 1, 0.4026826962708268);
605  matrix_set(model->Q, model->K, 2, 2, -1.9705914880746673);
606  matrix_set(model->Q, model->K, 3, 0, -0.8749982403551375);
607  matrix_set(model->Q, model->K, 3, 1, 1.3981525936474806);
608  matrix_set(model->Q, model->K, 3, 2, 0.5845478158465323);
609  matrix_set(model->Q, model->K, 4, 0, 0.9594104113136890);
610  matrix_set(model->Q, model->K, 4, 1, -0.7058945833639207);
611  matrix_set(model->Q, model->K, 4, 2, -1.8413342248272893);
612 
613  // start test code //
614  gensvm_calculate_huber(model);
615 
616  mu_assert(fabs(matrix_get(model->H, model->K, 0, 0) -
617  0.5973049764458478) < 1e-14,
618  "Incorrect H at 0, 0");
619  mu_assert(fabs(matrix_get(model->H, model->K, 0, 1) -
620  0.0000000000000000) < 1e-14,
621  "Incorrect H at 0, 1");
622  mu_assert(fabs(matrix_get(model->H, model->K, 0, 2) -
623  0.0002358356116216) < 1e-14,
624  "Incorrect H at 0, 2");
625  mu_assert(fabs(matrix_get(model->H, model->K, 1, 0) -
626  0.0000000000000000) < 1e-14,
627  "Incorrect H at 1, 0");
628  mu_assert(fabs(matrix_get(model->H, model->K, 1, 1) -
629  0.0000000000000000) < 1e-14,
630  "Incorrect H at 1, 1");
631  mu_assert(fabs(matrix_get(model->H, model->K, 1, 2) -
632  0.0005674277965020) < 1e-14,
633  "Incorrect H at 1, 2");
634  mu_assert(fabs(matrix_get(model->H, model->K, 2, 0) -
635  0.3696319769160848) < 1e-14,
636  "Incorrect H at 2, 0");
637  mu_assert(fabs(matrix_get(model->H, model->K, 2, 1) -
638  0.1189293204447631) < 1e-14,
639  "Incorrect H at 2, 1");
640  mu_assert(fabs(matrix_get(model->H, model->K, 2, 2) -
641  2.2205914880746676) < 1e-14,
642  "Incorrect H at 2, 2");
643  mu_assert(fabs(matrix_get(model->H, model->K, 3, 0) -
644  1.1249982403551375) < 1e-14,
645  "Incorrect H at 3, 0");
646  mu_assert(fabs(matrix_get(model->H, model->K, 3, 1) -
647  0.0000000000000000) < 1e-14,
648  "Incorrect H at 3, 1");
649  mu_assert(fabs(matrix_get(model->H, model->K, 3, 2) -
650  0.0575335057726290) < 1e-14,
651  "Incorrect H at 3, 2");
652  mu_assert(fabs(matrix_get(model->H, model->K, 4, 0) -
653  0.0005491715699080) < 1e-14,
654  "Incorrect H at 4, 0");
655  mu_assert(fabs(matrix_get(model->H, model->K, 4, 1) -
656  0.9558945833639207) < 1e-14,
657  "Incorrect H at 4, 1");
658  mu_assert(fabs(matrix_get(model->H, model->K, 4, 2) -
659  2.0913342248272890) < 1e-14,
660  "Incorrect H at 4, 2");
661 
662  // start end code //
663 
664  gensvm_free_model(model);
665 
666  return NULL;
667 }
668 
670 {
671  struct GenModel *model = gensvm_init_model();
672  model->n = 5;
673  model->m = 3;
674  model->K = 3;
675 
676  gensvm_allocate_model(model);
677 
678  // start test code //
679 
680  matrix_set(model->V, model->K-1, 0, 0, 0.4534886648299394);
681  matrix_set(model->V, model->K-1, 0, 1, 0.0744278734246461);
682  matrix_set(model->V, model->K-1, 1, 0, 0.3119251404109698);
683  matrix_set(model->V, model->K-1, 1, 1, 0.4656439597720683);
684  matrix_set(model->V, model->K-1, 2, 0, 0.2011718791962903);
685  matrix_set(model->V, model->K-1, 2, 1, 0.6500799120482493);
686  matrix_set(model->V, model->K-1, 3, 0, 0.4203721613186416);
687  matrix_set(model->V, model->K-1, 3, 1, 0.3322561487796912);
688 
689  matrix_set(model->Vbar, model->K-1, 0, 0, 0.4716285304362394);
690  matrix_set(model->Vbar, model->K-1, 0, 1, 0.9580963971307287);
691  matrix_set(model->Vbar, model->K-1, 1, 0, 0.4665492786460124);
692  matrix_set(model->Vbar, model->K-1, 1, 1, 0.7584128769293659);
693  matrix_set(model->Vbar, model->K-1, 2, 0, 0.0694310200377222);
694  matrix_set(model->Vbar, model->K-1, 2, 1, 0.9819492320913891);
695  matrix_set(model->Vbar, model->K-1, 3, 0, 0.9308026068356582);
696  matrix_set(model->Vbar, model->K-1, 3, 1, 0.1323286413371241);
697 
698  gensvm_step_doubling(model);
699 
700  mu_assert(fabs(matrix_get(model->V, model->K-1, 0, 0) -
701  0.4353487992236394) < 1e-14,
702  "Incorrect V at 0, 0");
703  mu_assert(fabs(matrix_get(model->V, model->K-1, 0, 1) -
704  -0.8092406502814364) < 1e-14,
705  "Incorrect V at 0, 1");
706  mu_assert(fabs(matrix_get(model->V, model->K-1, 1, 0) -
707  0.1573010021759272) < 1e-14,
708  "Incorrect V at 1, 0");
709  mu_assert(fabs(matrix_get(model->V, model->K-1, 1, 1) -
710  0.1728750426147708) < 1e-14,
711  "Incorrect V at 1, 1");
712  mu_assert(fabs(matrix_get(model->V, model->K-1, 2, 0) -
713  0.3329127383548583) < 1e-14,
714  "Incorrect V at 2, 0");
715  mu_assert(fabs(matrix_get(model->V, model->K-1, 2, 1) -
716  0.3182105920051096) < 1e-14,
717  "Incorrect V at 2, 1");
718  mu_assert(fabs(matrix_get(model->V, model->K-1, 3, 0) -
719  -0.0900582841983750) < 1e-14,
720  "Incorrect V at 3, 0");
721  mu_assert(fabs(matrix_get(model->V, model->K-1, 3, 1) -
722  0.5321836562222582) < 1e-14,
723  "Incorrect V at 3, 1");
724 
725  // end test code //
726 
727  gensvm_free_model(model);
728 
729  return NULL;
730 }
731 
732 char *all_tests()
733 {
734  mu_suite_start();
735 
741 
743 
744  return NULL;
745 }
746 
Minimal unit testing framework for C.
#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 epsilon
stopping criterion for the IM algorithm.
Definition: gensvm_base.h:101
RUN_TESTS(all_tests)
void gensvm_simplex(struct GenModel *model)
Generate matrix of simplex vertex coordinates.
long m
number of features for the workspace
Definition: gensvm_base.h:154
char * test_gensvm_optimize()
double p
parameter for the L-p norm in the loss function
Definition: gensvm_base.h:103
#define mu_assert(test, message)
Definition: minunit.h:29
long K
number of classes
Definition: gensvm_base.h:58
void gensvm_step_doubling(struct GenModel *model)
Use step doubling.
#define matrix_get(M, cols, i, j)
void gensvm_optimize(struct GenModel *model, struct GenData *data)
The main training loop for GenSVM.
char * test_gensvm_get_loss_1()
void gensvm_free_work(struct GenWork *work)
Free an allocated GenWork instance.
Definition: gensvm_base.c:277
double * Z
Definition: gensvm_base.h:68
A structure to hold the GenSVM workspace.
Definition: gensvm_base.h:151
void gensvm_free_model(struct GenModel *model)
Free allocated GenModel struct.
Definition: gensvm_base.c:211
int weight_idx
which weights to use (1 = unit, 2 = group)
Definition: gensvm_base.h:93
struct GenWork * gensvm_init_work(struct GenModel *model)
Initialize the workspace structure.
Definition: gensvm_base.c:245
#define Malloc(type, size)
Definition: gensvm_memory.h:48
double * V
augmented weight matrix
Definition: gensvm_base.h:115
#define mu_run_test(test)
Definition: minunit.h:35
double * Q
error matrix
Definition: gensvm_base.h:124
double gensvm_get_loss(struct GenModel *model, struct GenData *data, struct GenWork *work)
Calculate the current value of the loss function.
long * y
array of class labels, 1..K
Definition: gensvm_base.h:66
char * all_tests()
struct GenModel * gensvm_init_model(void)
Initialize a GenModel structure.
Definition: gensvm_base.c:102
void gensvm_simplex_diff(struct GenModel *model)
Generate the simplex difference matrix.
A structure to represent the data.
Definition: gensvm_base.h:57
void gensvm_initialize_weights(struct GenData *data, struct GenModel *model)
Initialize instance weights.
Definition: gensvm_init.c:152
A structure to represent a single GenSVM model.
Definition: gensvm_base.h:92
char * test_gensvm_calculate_huber()
double * Vbar
Definition: gensvm_base.h:117
long n
number of instances in the dataset
Definition: gensvm_base.h:97
char * test_gensvm_step_doubling()
void gensvm_free_data(struct GenData *data)
Free allocated GenData struct.
Definition: gensvm_base.c:73
double * rho
vector of instance weights
Definition: gensvm_base.h:128
void gensvm_calculate_errors(struct GenModel *model, struct GenData *data, double *ZV)
Calculate the scalar errors.
void gensvm_allocate_model(struct GenModel *model)
Allocate memory for a GenModel.
Definition: gensvm_base.c:144
long r
number of eigenvalues (width of Z)
Definition: gensvm_base.h:64
Header file for gensvm_optimize.c.
void gensvm_init_V(struct GenModel *from_model, struct GenModel *to_model, struct GenData *data)
Seed the matrix V from an existing model or using rand.
Definition: gensvm_init.c:57
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
long m
number of predictors (width of RAW)
Definition: gensvm_base.h:62
#define matrix_set(M, cols, i, j, val)
Header file for gensvm_init.c.
long n
number of instances
Definition: gensvm_base.h:60
void gensvm_calculate_huber(struct GenModel *model)
Calculate the Huber hinge errors.
struct GenData * gensvm_init_data(void)
Initialize a GenData structure.
Definition: gensvm_base.c:45
char * test_gensvm_get_loss_2()
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
#define mu_suite_start()
Definition: minunit.h:24
char * test_gensvm_calculate_errors()
double lambda
regularization parameter in the loss function
Definition: gensvm_base.h:107