aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGertjan van den Burg <gertjanvandenburg@gmail.com>2017-02-17 19:17:17 -0500
committerGertjan van den Burg <gertjanvandenburg@gmail.com>2017-02-17 19:17:17 -0500
commite8baad9ae430a838c34fa8173b36f92c9baa862d (patch)
tree646574b2d6ee594b600c74d1e93ae2c0fbe898b2
parentBump version (diff)
downloadgensvm-e8baad9ae430a838c34fa8173b36f92c9baa862d.tar.gz
gensvm-e8baad9ae430a838c34fa8173b36f92c9baa862d.zip
allow max_iter to be set in the model
-rw-r--r--CHANGELOG.md13
-rw-r--r--Makefile2
-rw-r--r--include/gensvm_base.h2
-rw-r--r--include/gensvm_task.h2
-rw-r--r--src/gensvm_base.c1
-rw-r--r--src/gensvm_copy.c2
-rw-r--r--src/gensvm_optimize.c11
-rw-r--r--src/gensvm_task.c6
-rw-r--r--tests/src/test_gensvm_copy.c2
-rw-r--r--tests/src/test_gensvm_io.c2
-rw-r--r--tests/src/test_gensvm_task.c2
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
diff --git a/Makefile b/Makefile
index be43db4..fb6421c 100644
--- a/Makefile
+++ b/Makefile
@@ -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);