aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGertjan van den Burg <burg@ese.eur.nl>2016-09-30 20:22:18 +0200
committerGertjan van den Burg <burg@ese.eur.nl>2016-09-30 20:22:18 +0200
commit369fd7c981bc468e9002be6f4813e08664413a81 (patch)
tree37312074e6dabb06b1375f298666a7fe63a78237 /src
parentremove unnecessary W and t matrices (diff)
downloadgensvm-369fd7c981bc468e9002be6f4813e08664413a81.tar.gz
gensvm-369fd7c981bc468e9002be6f4813e08664413a81.zip
Remove category matrix from implementation
It's a remnant from the Matlab implementation, where it actually makes sense to use. Here it becomes a significant memory burden for large datasets, and doesn't provide any speedup
Diffstat (limited to 'src')
-rw-r--r--src/gensvm_base.c6
-rw-r--r--src/gensvm_optimize.c53
2 files changed, 15 insertions, 44 deletions
diff --git a/src/gensvm_base.c b/src/gensvm_base.c
index 7710fc9..2c30530 100644
--- a/src/gensvm_base.c
+++ b/src/gensvm_base.c
@@ -94,7 +94,6 @@ struct GenModel *gensvm_init_model()
model->UU = NULL;
model->Q = NULL;
model->H = NULL;
- model->R = NULL;
model->rho = NULL;
model->data_file = NULL;
@@ -123,7 +122,6 @@ void gensvm_allocate_model(struct GenModel *model)
model->UU = Calloc(double, n*K*(K-1));
model->Q = Calloc(double, n*K);
model->H = Calloc(double, n*K);
- model->R = Calloc(double, n*K);
model->rho = Calloc(double, n);
}
@@ -156,9 +154,6 @@ void gensvm_reallocate_model(struct GenModel *model, long n, long m)
model->H = Realloc(model->H, double, n*K);
Memset(model->H, double, n*K);
- model->R = Realloc(model->R, double, n*K);
- Memset(model->R, double, n*K);
-
model->rho = Realloc(model->rho, double, n);
Memset(model->rho, double, n);
@@ -197,7 +192,6 @@ void gensvm_free_model(struct GenModel *model)
free(model->Q);
free(model->H);
free(model->rho);
- free(model->R);
free(model->kernelparam);
free(model->data_file);
diff --git a/src/gensvm_optimize.c b/src/gensvm_optimize.c
index 19e697e..d08f917 100644
--- a/src/gensvm_optimize.c
+++ b/src/gensvm_optimize.c
@@ -68,7 +68,7 @@ void gensvm_optimize(struct GenModel *model, struct GenData *data)
gensvm_simplex(model->K, model->U);
gensvm_simplex_diff(model, data);
- gensvm_category_matrix(model, data);
+ gensvm_simplex(model);
L = gensvm_get_loss(model, data, ZV);
Lbar = L + 2.0*model->epsilon*L;
@@ -141,9 +141,10 @@ double gensvm_get_loss(struct GenModel *model, struct GenData *data,
rowvalue = 0;
value = 0;
for (j=0; j<K; j++) {
+ if (j == (data->y[i]-1))
+ continue;
value = matrix_get(model->H, K, i, j);
value = pow(value, model->p);
- value *= matrix_get(model->R, K, i, j);
rowvalue += value;
}
rowvalue = pow(rowvalue, 1.0/(model->p));
@@ -181,16 +182,18 @@ double gensvm_get_loss(struct GenModel *model, struct GenData *data,
* @returns the value of omega for instance i
*
*/
-double gensvm_calculate_omega(struct GenModel *model, long i)
+double gensvm_calculate_omega(struct GenModel *model, struct GenData *data,
+ long i)
{
long j;
- double h, r, omega = 0.0,
+ double h, omega = 0.0,
p = model->p;
for (j=0; j<model->K; j++) {
+ if (j == (data->y[i]-1))
+ continue;
h = matrix_get(model->H, model->K, i, j);
- r = matrix_get(model->R, model->K, i, j);
- omega += pow(h, p)*r;
+ omega += pow(h, p);
}
omega = (1.0/p)*pow(omega, 1.0/p - 1.0);
@@ -211,14 +214,16 @@ double gensvm_calculate_omega(struct GenModel *model, long i)
* @returns whether or not we can do simple majorization
*
*/
-bool gensvm_majorize_is_simple(struct GenModel *model, long i)
+bool gensvm_majorize_is_simple(struct GenModel *model, struct GenData *data,
+ long i)
{
long j;
- double h, r, value = 0;
+ double h, value = 0;
for (j=0; j<model->K; j++) {
+ if (j == (data->y[i]-1))
+ continue;
h = matrix_get(model->H, model->K, i, j);
- r = matrix_get(model->R, model->K, i, j);
- value += (h*r > 0) ? 1 : 0;
+ value += (h > 0) ? 1 : 0;
if (value > 1)
return false;
}
@@ -572,34 +577,6 @@ void gensvm_get_update(struct GenModel *model, struct GenData *data,
}
/**
- * @brief Generate the category matrix
- *
- * @details
- * Generate the category matrix R. The category matrix has 1's everywhere
- * except at the column corresponding to the label of instance i, there the
- * element is 0.
- *
- * @param[in,out] model corresponding GenModel
- * @param[in] dataset corresponding GenData
- *
- */
-void gensvm_category_matrix(struct GenModel *model, struct GenData *data)
-{
- long i, j;
- long n = model->n;
- long K = model->K;
-
- for (i=0; i<n; i++) {
- for (j=0; j<K; j++) {
- if (data->y[i] != j+1)
- matrix_set(model->R, K, i, j, 1.0);
- else
- matrix_set(model->R, K, i, j, 0.0);
- }
- }
-}
-
-/**
* @brief Generate the simplex difference matrix
*
* @details