From c54699dd4693f6d478e1c8cec7e2f6793359da4e Mon Sep 17 00:00:00 2001
From: Parikshit Ram
Date: Fri, 22 Feb 2008 06:47:01 +0000
Subject: [PATCH] optimizers added with more terminating conditions although
none seem to work, and main deleted accidentally
---
fastlib/u/pram/opt/optimizers.h | 40 +++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 12 deletions(-)
diff --git a/fastlib/u/pram/opt/optimizers.h b/fastlib/u/pram/opt/optimizers.h
index 2bdf9a983b..fe0b9ddafe 100644
--- a/fastlib/u/pram/opt/optimizers.h
+++ b/fastlib/u/pram/opt/optimizers.h
@@ -785,15 +785,15 @@ class SMD_SingleStep {
index_t iters;
index_t MAXIMUM_ITERATIONS = fx_param_int(opt_module_,"MAX_ITERS",100);
- double EPSILON = fx_param_double(opt_module_, "EPSILON", 1.0e-5);
- fx_format_param(opt_module_, "TOLERANCE", "%lf", 0.1);
+ double EPSILON = fx_param_double(opt_module_, "EPSILON", 1.0e-2);
+ fx_format_param(opt_module_, "TOLERANCE", "%lf", 0.01);
double TOLERANCE = fx_param_double_req(opt_module_, "TOLERANCE");
index_t dim = fx_param_int_req(opt_module_, "param_space_dim");
index_t num_batch = fx_param_int(opt_module_, "BATCHES",50);
Vector pold, pnew, grad, prev_grad;
long double f_old, f_new;
double scale, scale_prev, eta = 0.01, gamma, mu = 0.01;
- long double p_tol = 0.0, f_tol = 0.0;
+ double p_tol = 0.0, f_tol = 0.0;
Matrix data_batched;
index_t batch_size = data().n_cols() / num_batch;
@@ -858,14 +858,29 @@ class SMD_SingleStep {
// using just the point in the param_space
// which refuses to move
- if (p_tol < TOLERANCE) {
- fx_format_result(opt_module_, "iters", "%d", iters+1);
- fx_format_result(opt_module_,"min_obtained","%Lf", f_old);
- for (index_t i = 0; i < dim; i++) {
- pt[i] = pold.get(i);
+ if (p_tol < TOLERANCE) {
+ // rejected because stops too early, need the check
+ // the overall gradient is small
+ Vector temp_grad;
+ temp_grad.Init(dim);
+ long double f_final = (*func_ptr_)(pold, data(), &temp_grad);
+ double temp_grad_val = sqrt(la::Dot(temp_grad, temp_grad));
+ if (temp_grad_val < EPSILON) {
+
+ fx_format_result(opt_module_, "iters", "%d", iters+1);
+ fx_format_result(opt_module_,"min_obtained","%Lf", f_final);
+ for (index_t i = 0; i < dim; i++) {
+ pt[i] = pold.get(i);
+ }
+ printf("iters: %"LI"d\n", iters);
+ for(index_t i = 0; i < dim; i++) {
+ printf("%lf, ", pold.get(i));
+ }
+ printf("\nfinal val: %Lf\n p_tol : %lf, iters : %"LI"d, g_tol : %lf\n",
+ f_final, p_tol, iters, temp_grad_val);
+
+ return;
}
- printf("iters: %"LI"d, min: %Lf\n", iters, f_old);
- return;
}
pold.CopyValues(pnew);
@@ -896,8 +911,9 @@ class SMD_SingleStep {
printf("%lf, ", pold.get(i));
}
long double f_final = (*func_ptr_)(pold, data(), &grad);
- printf("\nfinal val: %Lf\n p_tol : %Lf, iters : %"LI"d\n",
- f_final, p_tol, iters);
+ scale = sqrt(la::Dot(grad, grad));
+ printf("\nfinal val: %Lf, p_tol : %lf, iters : %"LI"d, g_tol : %lf\n",
+ f_final, p_tol, iters, scale);
return;
}