From e2c0ca1c082bfd7755c7af5bc5c9021bce64f3ba Mon Sep 17 00:00:00 2001 From: Gertjan van den Burg Date: Mon, 17 Oct 2016 13:41:46 +0200 Subject: 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 --- tests/src/test_gensvm_zv.c | 251 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 tests/src/test_gensvm_zv.c (limited to 'tests/src/test_gensvm_zv.c') 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); -- cgit v1.2.3