GenSVM
test_gensvm_init.c
Go to the documentation of this file.
1 
27 #include "minunit.h"
28 #include "gensvm_init.h"
29 
31 {
32  int i;
33  long n = 5,
34  m = 2,
35  K = 3;
36  double value;
37  struct GenModel *model = gensvm_init_model();
38  struct GenData *data = gensvm_init_data();
39 
40  // start test code
41  model->n = n;
42  model->m = m;
43  model->K = K;
44  gensvm_allocate_model(model);
45 
46  data->n = n;
47  data->m = m;
48  data->K = K;
49  data->RAW = Calloc(double, n*(m+1));
50  for (i=0; i<n; i++) {
51  matrix_set(data->RAW, m+1, i, 0, 1.0);
52  matrix_set(data->RAW, m+1, i, 1, i);
53  matrix_set(data->RAW, m+1, i, 2, -i);
54  }
55  data->Z = data->RAW;
56 
57  gensvm_init_V(NULL, model, data);
58 
59  // first row all ones
60  value = matrix_get(model->V, K-1, 0, 0);
61  mu_assert(value == 1.0, "Incorrect value at 0, 0");
62  value = matrix_get(model->V, K-1, 0, 1);
63  mu_assert(value == 1.0, "Incorrect value at 0, 1");
64 
65  // second row between -1 and 0.25
66  value = matrix_get(model->V, K-1, 1, 0);
67  mu_assert(value >= -1.0 && value <= 0.25, "Incorrect value at 1, 0");
68  value = matrix_get(model->V, K-1, 1, 1);
69  mu_assert(value >= -1.0 && value <= 0.25, "Incorrect value at 1, 1");
70 
71  // third row between -0.25 and 1
72  value = matrix_get(model->V, K-1, 2, 0);
73  mu_assert(value >= -0.25 && value <= 1.0, "Incorrect value at 2, 0");
74  value = matrix_get(model->V, K-1, 2, 1);
75  mu_assert(value >= -0.25 && value <= 1.0, "Incorrect value at 2, 1");
76 
77  // end test code
78 
79  gensvm_free_model(model);
80  gensvm_free_data(data);
81 
82  return NULL;
83 }
84 
86 {
87  int i;
88  long n = 5,
89  m = 2,
90  K = 3;
91  double value;
92  struct GenModel *model = gensvm_init_model();
93  struct GenData *data = gensvm_init_data();
94 
95  // start test code
96  model->n = n;
97  model->m = m;
98  model->K = K;
99  gensvm_allocate_model(model);
100 
101  data->n = n;
102  data->m = m;
103  data->K = K;
104  data->RAW = Calloc(double, n*(m+1));
105  for (i=0; i<n; i++) {
106  matrix_set(data->RAW, m+1, i, 0, 1.0);
107  matrix_set(data->RAW, m+1, i, 1, i);
108  matrix_set(data->RAW, m+1, i, 2, -i);
109  }
110 
111  data->Z = data->RAW;
112  data->spZ = gensvm_dense_to_sparse(data->Z, n, m+1);
113  free(data->RAW);
114  data->RAW = NULL;
115  data->Z = NULL;
116 
117  gensvm_init_V(NULL, model, data);
118 
119  // first row all ones
120  value = matrix_get(model->V, K-1, 0, 0);
121  mu_assert(value == 1.0, "Incorrect value at 0, 0");
122  value = matrix_get(model->V, K-1, 0, 1);
123  mu_assert(value == 1.0, "Incorrect value at 0, 1");
124 
125  // second row between -1 and 0.25
126  value = matrix_get(model->V, K-1, 1, 0);
127  mu_assert(value >= -1.0 && value <= 0.25, "Incorrect value at 1, 0");
128  value = matrix_get(model->V, K-1, 1, 1);
129  mu_assert(value >= -1.0 && value <= 0.25, "Incorrect value at 1, 1");
130 
131  // third row between -0.25 and 1
132  value = matrix_get(model->V, K-1, 2, 0);
133  mu_assert(value >= -0.25 && value <= 1.0, "Incorrect value at 2, 0");
134  value = matrix_get(model->V, K-1, 2, 1);
135  mu_assert(value >= -0.25 && value <= 1.0, "Incorrect value at 2, 1");
136 
137  // end test code
138 
139  gensvm_free_model(model);
140  gensvm_free_data(data);
141 
142  return NULL;
143 }
144 
146 {
147  long n = 7,
148  m = 5,
149  K = 3;
150  struct GenModel *model = gensvm_init_model();
151  struct GenModel *seed = gensvm_init_model();
152  struct GenData *data = gensvm_init_data();
153 
154  model->n = n;
155  model->m = m;
156  model->K = K;
157  seed->n = n;
158  seed->m = m;
159  seed->K = K;
160  data->n = n;
161  data->m = m;
162  data->K = K;
163  gensvm_allocate_model(model);
164  gensvm_allocate_model(seed);
165 
166  // start test code
167  matrix_set(seed->V, seed->K-1, 0, 0, 123.0);
168  matrix_set(seed->V, seed->K-1, 1, 1, 321.0);
169  matrix_set(seed->V, seed->K-1, 2, 0, 111.0);
170  matrix_set(seed->V, seed->K-1, 5, 0, 222.0);
171  matrix_set(seed->V, seed->K-1, 3, 1, 333.0);
172 
173  gensvm_init_V(seed, model, data);
174 
175  mu_assert(matrix_get(model->V, model->K-1, 0, 0) == 123.0,
176  "Incorrect V value at 0, 0");
177  mu_assert(matrix_get(model->V, model->K-1, 0, 1) == 0.0,
178  "Incorrect V value at 0, 1");
179  mu_assert(matrix_get(model->V, model->K-1, 1, 0) == 0.0,
180  "Incorrect V value at 1, 0");
181  mu_assert(matrix_get(model->V, model->K-1, 1, 1) == 321.0,
182  "Incorrect V value at 1, 1");
183  mu_assert(matrix_get(model->V, model->K-1, 2, 0) == 111.0,
184  "Incorrect V value at 2, 0");
185  mu_assert(matrix_get(model->V, model->K-1, 2, 1) == 0.0,
186  "Incorrect V value at 2, 1");
187  mu_assert(matrix_get(model->V, model->K-1, 3, 0) == 0.0,
188  "Incorrect V value at 3, 0");
189  mu_assert(matrix_get(model->V, model->K-1, 3, 1) == 333.0,
190  "Incorrect V value at 3, 1");
191  mu_assert(matrix_get(model->V, model->K-1, 4, 0) == 0.0,
192  "Incorrect V value at 4, 0");
193  mu_assert(matrix_get(model->V, model->K-1, 4, 1) == 0.0,
194  "Incorrect V value at 4, 1");
195  mu_assert(matrix_get(model->V, model->K-1, 5, 0) == 222.0,
196  "Incorrect V value at 5, 0");
197  mu_assert(matrix_get(model->V, model->K-1, 5, 1) == 0.0,
198  "Incorrect V value at 5, 1");
199  // end test code
200 
201  gensvm_free_model(model);
202  gensvm_free_model(seed);
203  gensvm_free_data(data);
204 
205  return NULL;
206 }
207 
209 {
210  struct GenModel *model = gensvm_init_model();
211  struct GenData *data = NULL;
212  model->n = 7;
213  model->m = 5;
214  model->K = 3;
215  model->weight_idx = 1;
216  gensvm_allocate_model(model);
217 
218  // start test code
219  int i;
220  gensvm_initialize_weights(data, model);
221  for (i=0; i<model->n; i++) {
222  mu_assert(model->rho[i] == 1.0, "incorrect weight in rho");
223  }
224  // end test code
225 
226  gensvm_free_model(model);
227  gensvm_free_data(data);
228 
229  return NULL;
230 }
231 
233 {
234  struct GenModel *model = gensvm_init_model();
235  struct GenData *data = gensvm_init_data();
236  model->n = 8;
237  model->m = 5;
238  model->K = 3;
239  model->weight_idx = 2;
240  gensvm_allocate_model(model);
241 
242  data->y = Calloc(long, model->n);
243 
244  data->y[0] = 1;
245  data->y[1] = 1;
246  data->y[2] = 1;
247  data->y[3] = 1;
248  data->y[4] = 2;
249  data->y[5] = 2;
250  data->y[6] = 2;
251  data->y[7] = 3;
252 
253  // start test code
254  gensvm_initialize_weights(data, model);
255  int i;
256  for (i=0; i<4; i++) {
257  mu_assert(model->rho[i] == 8.0/(4.0 * 3.0),
258  "Incorrect weight for class 1");
259  }
260  for (i=0; i<3; i++) {
261  mu_assert(model->rho[4+i] == 8.0/(3.0 * 3.0),
262  "Incorrect weight for class 2");
263  }
264  mu_assert(model->rho[7] == 8.0/(1.0 * 3.0),
265  "Incorrect weight for class 3");
266 
267  // end test code
268 
269  gensvm_free_model(model);
270  gensvm_free_data(data);
271 
272  return NULL;
273 }
274 
276 {
277  mu_test_missing();
278  return NULL;
279 }
280 
281 char *all_tests()
282 {
283  mu_suite_start();
290 
291  return NULL;
292 }
293 
Minimal unit testing framework for C.
#define Calloc(type, size)
Definition: gensvm_memory.h:40
char * test_init_weights_2()
#define mu_assert(test, message)
Definition: minunit.h:29
long K
number of classes
Definition: gensvm_base.h:58
#define matrix_get(M, cols, i, j)
char * test_init_weights_wrong()
char * test_init_null_sparse()
double * Z
Definition: gensvm_base.h:68
char * test_init_seed()
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
double * V
augmented weight matrix
Definition: gensvm_base.h:115
#define mu_run_test(test)
Definition: minunit.h:35
long * y
array of class labels, 1..K
Definition: gensvm_base.h:66
struct GenModel * gensvm_init_model(void)
Initialize a GenModel structure.
Definition: gensvm_base.c:102
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
#define mu_test_missing()
Definition: minunit.h:60
long n
number of instances in the dataset
Definition: gensvm_base.h:97
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_allocate_model(struct GenModel *model)
Allocate memory for a GenModel.
Definition: gensvm_base.c:144
char * all_tests()
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
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
struct GenSparse * gensvm_dense_to_sparse(double *A, long rows, long cols)
Convert a dense matrix to a GenSparse structure if advantageous.
char * test_init_null_dense()
RUN_TESTS(all_tests)
#define matrix_set(M, cols, i, j, val)
char * test_init_weights_1()
Header file for gensvm_init.c.
long n
number of instances
Definition: gensvm_base.h:60
struct GenData * gensvm_init_data(void)
Initialize a GenData structure.
Definition: gensvm_base.c:45
long m
number of predictor variables in the dataset
Definition: gensvm_base.h:99
#define mu_suite_start()
Definition: minunit.h:24
double * RAW
augmented raw data matrix
Definition: gensvm_base.h:73
struct GenSparse * spZ
sparse representation of the augmented data matrix
Definition: gensvm_base.h:71