diff options
| author | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2017-02-17 19:17:17 -0500 |
|---|---|---|
| committer | Gertjan van den Burg <gertjanvandenburg@gmail.com> | 2017-02-17 19:17:17 -0500 |
| commit | e8baad9ae430a838c34fa8173b36f92c9baa862d (patch) | |
| tree | 646574b2d6ee594b600c74d1e93ae2c0fbe898b2 | |
| parent | Bump version (diff) | |
| download | gensvm-e8baad9ae430a838c34fa8173b36f92c9baa862d.tar.gz gensvm-e8baad9ae430a838c34fa8173b36f92c9baa862d.zip | |
allow max_iter to be set in the model
| -rw-r--r-- | CHANGELOG.md | 13 | ||||
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | include/gensvm_base.h | 2 | ||||
| -rw-r--r-- | include/gensvm_task.h | 2 | ||||
| -rw-r--r-- | src/gensvm_base.c | 1 | ||||
| -rw-r--r-- | src/gensvm_copy.c | 2 | ||||
| -rw-r--r-- | src/gensvm_optimize.c | 11 | ||||
| -rw-r--r-- | src/gensvm_task.c | 6 | ||||
| -rw-r--r-- | tests/src/test_gensvm_copy.c | 2 | ||||
| -rw-r--r-- | tests/src/test_gensvm_io.c | 2 | ||||
| -rw-r--r-- | tests/src/test_gensvm_task.c | 2 |
11 files changed, 34 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..31f2e59 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Change Log + +## Version 0.1.3 + +- Allow max_iter to be set in the model + +## Version 0.1.2 + +- Remove kernelparam array in favor of explicit gamma, coef, degree + +## Version 0.1.1 + +- Tiny code fix @@ -1,4 +1,4 @@ -VERSION=0.1.2 +VERSION=0.1.3 CC=gcc CFLAGS=-Wall -DVERSION=$(VERSION) -g -O3 INCLUDE= -Iinclude diff --git a/include/gensvm_base.h b/include/gensvm_base.h index dee1d80..adef2a9 100644 --- a/include/gensvm_base.h +++ b/include/gensvm_base.h @@ -136,6 +136,8 @@ struct GenModel { double kernel_eigen_cutoff; ///< cutoff value for the ratio of eigenvalues in the reduced //eigendecomposition. + long max_iter; + ///< maximum number of iterations of the algorithm }; /** diff --git a/include/gensvm_task.h b/include/gensvm_task.h index a791262..77db463 100644 --- a/include/gensvm_task.h +++ b/include/gensvm_task.h @@ -75,6 +75,8 @@ struct GenTask { ///< coef parameter for the GenModel double degree; ///< degree parameter for the GenModel + long max_iter; + ///< maximum number of iterations of the algorithm struct GenData *train_data; ///< pointer to the training data struct GenData *test_data; diff --git a/src/gensvm_base.c b/src/gensvm_base.c index 79e5f45..6bb4367 100644 --- a/src/gensvm_base.c +++ b/src/gensvm_base.c @@ -114,6 +114,7 @@ struct GenModel *gensvm_init_model() model->degree = 2.0; model->kerneltype = K_LINEAR; model->kernel_eigen_cutoff = 1e-8; + model->max_iter = 1000000000; model->V = NULL; model->Vbar = NULL; diff --git a/src/gensvm_copy.c b/src/gensvm_copy.c index 28642c7..75c7e8c 100644 --- a/src/gensvm_copy.c +++ b/src/gensvm_copy.c @@ -48,4 +48,6 @@ void gensvm_copy_model(struct GenModel *from, struct GenModel *to) to->gamma = from->gamma; to->coef = from->coef; to->degree = from->degree; + + to->max_iter = from->max_iter; } diff --git a/src/gensvm_optimize.c b/src/gensvm_optimize.c index 95f9df2..fff6768 100644 --- a/src/gensvm_optimize.c +++ b/src/gensvm_optimize.c @@ -31,13 +31,6 @@ #include "gensvm_optimize.h" /** - * Maximum number of iterations of the algorithm. - */ -#ifndef GENSVM_MAX_ITER - #define GENSVM_MAX_ITER 1000000000 -#endif - -/** * Iteration frequency with which to print to stdout */ #ifndef GENSVM_PRINT_ITER @@ -94,7 +87,7 @@ void gensvm_optimize(struct GenModel *model, struct GenData *data) Lbar = L + 2.0*model->epsilon*L; // run main loop - while ((it < GENSVM_MAX_ITER) && (Lbar - L)/L > model->epsilon) + while ((it < model->max_iter) && (Lbar - L)/L > model->epsilon) { // ensures V contains newest V and Vbar contains V from // previous @@ -115,7 +108,7 @@ void gensvm_optimize(struct GenModel *model, struct GenData *data) if (L > Lbar) err("[GenSVM Warning]: Negative step occurred in " "majorization.\n"); - if (it >= GENSVM_MAX_ITER) + if (it >= model->max_iter) err("[GenSVM Warning]: maximum number of iterations " "reached.\n"); diff --git a/src/gensvm_task.c b/src/gensvm_task.c index 1526936..1112c66 100644 --- a/src/gensvm_task.c +++ b/src/gensvm_task.c @@ -53,6 +53,7 @@ struct GenTask *gensvm_init_task() t->train_data = NULL; t->test_data = NULL; t->performance = 0.0; + t->max_iter = 1000000000; return t; } @@ -103,6 +104,8 @@ struct GenTask *gensvm_copy_task(struct GenTask *t) nt->coef = t->coef; nt->degree = t->degree; + nt->max_iter = t->max_iter; + return nt; } @@ -130,4 +133,7 @@ void gensvm_task_to_model(struct GenTask *task, struct GenModel *model) model->gamma = task->gamma; model->coef = task->coef; model->degree = task->degree; + + // copy other parameters + model->max_iter = task->max_iter; } diff --git a/tests/src/test_gensvm_copy.c b/tests/src/test_gensvm_copy.c index ff5b86d..c9acf23 100644 --- a/tests/src/test_gensvm_copy.c +++ b/tests/src/test_gensvm_copy.c @@ -38,6 +38,7 @@ char *test_copy_model_linear() from_model->kappa = 1.0; from_model->weight_idx = 2; from_model->kerneltype = K_LINEAR; + from_model->max_iter = 100; gensvm_copy_model(from_model, to_model); @@ -48,6 +49,7 @@ char *test_copy_model_linear() mu_assert(to_model->weight_idx == 2, "to_model->weight_idx incorrect."); mu_assert(to_model->kerneltype == K_LINEAR, "to->kerneltype incorrect"); + mu_assert(to_model->max_iter == 100, "to->max_iter incorrect"); gensvm_free_model(from_model); gensvm_free_model(to_model); diff --git a/tests/src/test_gensvm_io.c b/tests/src/test_gensvm_io.c index fbfc0f0..72cdd04 100644 --- a/tests/src/test_gensvm_io.c +++ b/tests/src/test_gensvm_io.c @@ -654,7 +654,7 @@ char *test_gensvm_write_model() char buffer[GENSVM_MAX_LINE_LENGTH]; fgets(buffer, GENSVM_MAX_LINE_LENGTH, fid); - mu_assert(strcmp(buffer, "Output file for GenSVM (version 0.1.2)\n") + mu_assert(strcmp(buffer, "Output file for GenSVM (version 0.1.3)\n") == 0, "Line doesn't contain expected content (0).\n"); // skip the time line diff --git a/tests/src/test_gensvm_task.c b/tests/src/test_gensvm_task.c index 3966d1f..6ab32cc 100644 --- a/tests/src/test_gensvm_task.c +++ b/tests/src/test_gensvm_task.c @@ -46,6 +46,7 @@ char *test_task_to_model_linear() task->lambda = 1.4; task->epsilon = 5e-3; task->kerneltype = K_LINEAR; + task->max_iter = 100; gensvm_task_to_model(task, model); @@ -55,6 +56,7 @@ char *test_task_to_model_linear() mu_assert(model->lambda == 1.4, "Incorrect model lambda"); mu_assert(model->epsilon == 5e-3, "Incorrect model epsilon"); mu_assert(model->kerneltype == K_LINEAR, "Incorrect model kerneltype"); + mu_assert(model->max_iter == 100, "Incorrect model max_iter"); // end test code // gensvm_free_model(model); |
