aboutsummaryrefslogtreecommitdiff
path: root/tests/src/test_gensvm_zv.c
diff options
context:
space:
mode:
authorGertjan van den Burg <burg@ese.eur.nl>2016-10-17 13:41:46 +0200
committerGertjan van den Burg <burg@ese.eur.nl>2016-10-17 13:41:46 +0200
commite2c0ca1c082bfd7755c7af5bc5c9021bce64f3ba (patch)
tree3564a0b9ed66ccf71d16bf54a304aad320876bbf /tests/src/test_gensvm_zv.c
parentupdate doxyfile (diff)
downloadgensvm-e2c0ca1c082bfd7755c7af5bc5c9021bce64f3ba.tar.gz
gensvm-e2c0ca1c082bfd7755c7af5bc5c9021bce64f3ba.zip
Update predictions to work with sparse matrices
This is done by pulling the Z*V routines from the gensvm_optimize file to a seperate file, since they are shared by prediction and get_loss
Diffstat (limited to 'tests/src/test_gensvm_zv.c')
-rw-r--r--tests/src/test_gensvm_zv.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/tests/src/test_gensvm_zv.c b/tests/src/test_gensvm_zv.c
new file mode 100644
index 0000000..21dd897
--- /dev/null
+++ b/tests/src/test_gensvm_zv.c
@@ -0,0 +1,251 @@
+/**
+ * @file test_gensvm_zv.c
+ * @author Gertjan van den Burg
+ * @date 2016-10-17
+ * @brief Unit tests for gensvm_zv.c functions
+
+ * Copyright (C)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ */
+
+#include "minunit.h"
+#include "gensvm_zv.h"
+
+char *test_zv_dense()
+{
+ int n = 8,
+ m = 3,
+ K = 3;
+
+ struct GenModel *model = gensvm_init_model();
+ model->n = n;
+ model->m = m;
+ model->K = K;
+ model->V = Calloc(double, (m+1)*(K-1));
+ matrix_set(model->V, model->K-1, 0, 0, 0.9025324416711976);
+ matrix_set(model->V, model->K-1, 0, 1, 0.9776784486541952);
+ matrix_set(model->V, model->K-1, 1, 0, 0.8336347240271171);
+ matrix_set(model->V, model->K-1, 1, 1, 0.1213543508830703);
+ matrix_set(model->V, model->K-1, 2, 0, 0.9401310852208050);
+ matrix_set(model->V, model->K-1, 2, 1, 0.7407478086613410);
+ matrix_set(model->V, model->K-1, 3, 0, 0.9053353815353901);
+ matrix_set(model->V, model->K-1, 3, 1, 0.8056059951641629);
+
+ struct GenData *data = gensvm_init_data();
+ data->n = n;
+ data->m = m;
+ data->K = K;
+ data->Z = Calloc(double, n*(m+1));
+ matrix_set(data->Z, data->m+1, 0, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 0, 1, 0.4787662921736276);
+ matrix_set(data->Z, data->m+1, 0, 2, 0.7983044792882817);
+ matrix_set(data->Z, data->m+1, 0, 3, 0.4273006962165122);
+ matrix_set(data->Z, data->m+1, 1, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 1, 1, 0.7160319769123790);
+ matrix_set(data->Z, data->m+1, 1, 2, 0.5233066338418962);
+ matrix_set(data->Z, data->m+1, 1, 3, 0.4063256860579537);
+ matrix_set(data->Z, data->m+1, 2, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 2, 1, 0.3735389652435536);
+ matrix_set(data->Z, data->m+1, 2, 2, 0.8156214578257802);
+ matrix_set(data->Z, data->m+1, 2, 3, 0.6928367712901857);
+ matrix_set(data->Z, data->m+1, 3, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 3, 1, 0.3694690105850765);
+ matrix_set(data->Z, data->m+1, 3, 2, 0.8539671806454873);
+ matrix_set(data->Z, data->m+1, 3, 3, 0.5455108033084728);
+ matrix_set(data->Z, data->m+1, 4, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 4, 1, 0.8802158533820680);
+ matrix_set(data->Z, data->m+1, 4, 2, 0.0690778177684403);
+ matrix_set(data->Z, data->m+1, 4, 3, 0.4513353324958240);
+ matrix_set(data->Z, data->m+1, 5, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 5, 1, 0.7752402729955837);
+ matrix_set(data->Z, data->m+1, 5, 2, 0.3941285577056867);
+ matrix_set(data->Z, data->m+1, 5, 3, 0.2921042477960945);
+ matrix_set(data->Z, data->m+1, 6, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 6, 1, 0.6139038657913901);
+ matrix_set(data->Z, data->m+1, 6, 2, 0.4529743309354828);
+ matrix_set(data->Z, data->m+1, 6, 3, 0.7295983135133345);
+ matrix_set(data->Z, data->m+1, 7, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 7, 1, 0.7663625136928905);
+ matrix_set(data->Z, data->m+1, 7, 2, 0.3845759571625976);
+ matrix_set(data->Z, data->m+1, 7, 3, 0.2291505633226144);
+
+ // start test code //
+ double *ZV = Calloc(double, n*(K-1));
+ double eps = 1e-14;
+ gensvm_calculate_ZV(model, data, ZV);
+
+ mu_assert(fabs(matrix_get(ZV, K-1, 0, 0) - 2.4390099428102818) < eps,
+ "Incorrect ZV at 0, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 0, 1) - 1.9713571175527906) < eps,
+ "Incorrect ZV at 0, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 1, 0) - 2.3592794147310747) < eps,
+ "Incorrect ZV at 1, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 1, 1) - 1.7795486953777246) < eps,
+ "Incorrect ZV at 1, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 2, 0) - 2.6079682228282564) < eps,
+ "Incorrect ZV at 2, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 2, 1) - 2.1853322915140310) < eps,
+ "Incorrect ZV at 2, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 3, 0) - 2.5072459618750060) < eps,
+ "Incorrect ZV at 3, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 3, 1) - 2.0945562119091297) < eps,
+ "Incorrect ZV at 3, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 4, 0) - 2.1098629909184887) < eps,
+ "Incorrect ZV at 4, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 4, 1) - 1.4992641640054902) < eps,
+ "Incorrect ZV at 4, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 5, 0) - 2.1837844720035213) < eps,
+ "Incorrect ZV at 5, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 5, 1) - 1.5990280274507829) < eps,
+ "Incorrect ZV at 5, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 6, 0) - 2.5006904382610986) < eps,
+ "Incorrect ZV at 6, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 6, 1) - 1.9754868722402175) < eps,
+ "Incorrect ZV at 6, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 7, 0) - 2.1104087689101294) < eps,
+ "Incorrect ZV at 7, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 7, 1) - 1.5401587391844891) < eps,
+ "Incorrect ZV at 7, 1");
+
+ free(ZV);
+ // end test code //
+ gensvm_free_data(data);
+ gensvm_free_model(model);
+
+ return NULL;
+}
+
+char *test_zv_sparse()
+{
+ int n = 8,
+ m = 3,
+ K = 3;
+
+ struct GenModel *model = gensvm_init_model();
+ model->n = n;
+ model->m = m;
+ model->K = K;
+ model->V = Calloc(double, (m+1)*(K-1));
+ matrix_set(model->V, model->K-1, 0, 0, 0.9025324416711976);
+ matrix_set(model->V, model->K-1, 0, 1, 0.9776784486541952);
+ matrix_set(model->V, model->K-1, 1, 0, 0.8336347240271171);
+ matrix_set(model->V, model->K-1, 1, 1, 0.1213543508830703);
+ matrix_set(model->V, model->K-1, 2, 0, 0.9401310852208050);
+ matrix_set(model->V, model->K-1, 2, 1, 0.7407478086613410);
+ matrix_set(model->V, model->K-1, 3, 0, 0.9053353815353901);
+ matrix_set(model->V, model->K-1, 3, 1, 0.8056059951641629);
+
+ struct GenData *data = gensvm_init_data();
+ data->n = n;
+ data->m = m;
+ data->K = K;
+ data->Z = Calloc(double, n*(m+1));
+ matrix_set(data->Z, data->m+1, 0, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 0, 1, 0.4787662921736276);
+ matrix_set(data->Z, data->m+1, 0, 2, 0.7983044792882817);
+ matrix_set(data->Z, data->m+1, 0, 3, 0.4273006962165122);
+ matrix_set(data->Z, data->m+1, 1, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 1, 1, 0.7160319769123790);
+ matrix_set(data->Z, data->m+1, 1, 2, 0.5233066338418962);
+ matrix_set(data->Z, data->m+1, 1, 3, 0.4063256860579537);
+ matrix_set(data->Z, data->m+1, 2, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 2, 1, 0.3735389652435536);
+ matrix_set(data->Z, data->m+1, 2, 2, 0.8156214578257802);
+ matrix_set(data->Z, data->m+1, 2, 3, 0.6928367712901857);
+ matrix_set(data->Z, data->m+1, 3, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 3, 1, 0.3694690105850765);
+ matrix_set(data->Z, data->m+1, 3, 2, 0.8539671806454873);
+ matrix_set(data->Z, data->m+1, 3, 3, 0.5455108033084728);
+ matrix_set(data->Z, data->m+1, 4, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 4, 1, 0.8802158533820680);
+ matrix_set(data->Z, data->m+1, 4, 2, 0.0690778177684403);
+ matrix_set(data->Z, data->m+1, 4, 3, 0.4513353324958240);
+ matrix_set(data->Z, data->m+1, 5, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 5, 1, 0.7752402729955837);
+ matrix_set(data->Z, data->m+1, 5, 2, 0.3941285577056867);
+ matrix_set(data->Z, data->m+1, 5, 3, 0.2921042477960945);
+ matrix_set(data->Z, data->m+1, 6, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 6, 1, 0.6139038657913901);
+ matrix_set(data->Z, data->m+1, 6, 2, 0.4529743309354828);
+ matrix_set(data->Z, data->m+1, 6, 3, 0.7295983135133345);
+ matrix_set(data->Z, data->m+1, 7, 0, 1.0000000000000000);
+ matrix_set(data->Z, data->m+1, 7, 1, 0.7663625136928905);
+ matrix_set(data->Z, data->m+1, 7, 2, 0.3845759571625976);
+ matrix_set(data->Z, data->m+1, 7, 3, 0.2291505633226144);
+
+ // convert Z to sparse matrix
+ data->spZ = gensvm_dense_to_sparse(data->Z, data->n, data->m+1);
+ free(data->Z);
+ data->RAW = NULL;
+ data->Z = NULL;
+
+ // start test code //
+ double *ZV = Calloc(double, n*(K-1));
+ double eps = 1e-14;
+ gensvm_calculate_ZV(model, data, ZV);
+
+ mu_assert(fabs(matrix_get(ZV, K-1, 0, 0) - 2.4390099428102818) < eps,
+ "Incorrect ZV at 0, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 0, 1) - 1.9713571175527906) < eps,
+ "Incorrect ZV at 0, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 1, 0) - 2.3592794147310747) < eps,
+ "Incorrect ZV at 1, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 1, 1) - 1.7795486953777246) < eps,
+ "Incorrect ZV at 1, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 2, 0) - 2.6079682228282564) < eps,
+ "Incorrect ZV at 2, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 2, 1) - 2.1853322915140310) < eps,
+ "Incorrect ZV at 2, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 3, 0) - 2.5072459618750060) < eps,
+ "Incorrect ZV at 3, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 3, 1) - 2.0945562119091297) < eps,
+ "Incorrect ZV at 3, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 4, 0) - 2.1098629909184887) < eps,
+ "Incorrect ZV at 4, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 4, 1) - 1.4992641640054902) < eps,
+ "Incorrect ZV at 4, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 5, 0) - 2.1837844720035213) < eps,
+ "Incorrect ZV at 5, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 5, 1) - 1.5990280274507829) < eps,
+ "Incorrect ZV at 5, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 6, 0) - 2.5006904382610986) < eps,
+ "Incorrect ZV at 6, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 6, 1) - 1.9754868722402175) < eps,
+ "Incorrect ZV at 6, 1");
+ mu_assert(fabs(matrix_get(ZV, K-1, 7, 0) - 2.1104087689101294) < eps,
+ "Incorrect ZV at 7, 0");
+ mu_assert(fabs(matrix_get(ZV, K-1, 7, 1) - 1.5401587391844891) < eps,
+ "Incorrect ZV at 7, 1");
+
+ free(ZV);
+ // end test code //
+ gensvm_free_data(data);
+ gensvm_free_model(model);
+
+ return NULL;
+}
+
+char *all_tests()
+{
+ mu_suite_start();
+ mu_run_test(test_zv_dense);
+ mu_run_test(test_zv_sparse);
+
+ return NULL;
+}
+
+RUN_TESTS(all_tests);