@@ -100,34 +100,52 @@ int check_KKT(double *theta, /* current theta */
100
100
101
101
int irow ;
102
102
int fail = 0 ;
103
- double tol = 1.e-4 ;
104
- double * theta_ptr , * gradient_ptr_tmp ;
103
+ double tol = 1.e-5 ;
104
+ double * theta_ptr = theta ;
105
+ double * gradient_ptr_tmp = gradient_ptr ;
105
106
double gradient ;
106
107
107
108
for (irow = 0 ; irow < nrow ; irow ++ ) {
108
- theta_ptr = ((double * ) theta + irow );
109
- gradient_ptr_tmp = ((double * ) gradient_ptr + irow );
110
-
111
- // Compute this coordinate of the gradient
112
109
113
110
gradient = * gradient_ptr_tmp ;
114
111
115
- if (* theta_ptr != 0 ) { // these coordinates of gradients should be equal to -bound
116
- if ((* theta_ptr > 0 ) && (fabs (gradient + bound ) > (1. + tol ) * bound )) {
117
- fail += 1 ;
112
+ fprintf (stderr , "how does it look %d %f %f\n" , irow , * theta_ptr , gradient );
113
+
114
+ // Compute this coordinate of the gradient
115
+
116
+ if (fabs (* theta_ptr ) > tol ) { // these coordinates of gradients should be equal to \pm bound
117
+ fprintf (stderr , "active %f %f\n" , fabs (fabs (gradient ) - bound ), bound );
118
+ if (fabs (fabs (gradient ) - bound ) > tol * bound ) {
119
+ fprintf (stderr , "here1 %d %f %f\n" , irow , * theta_ptr , gradient );
120
+ return (0 );
121
+ // fail += 1;
118
122
}
119
- else if ((* theta_ptr < 0 ) && (fabs (gradient - bound ) > (1. + tol ) * bound )) {
120
- fail += 1 ;
123
+ else if ((* theta_ptr > 0 ) && (gradient > 0 )) {
124
+ fprintf (stderr , "here2 %d %f %f\n" , irow , * theta_ptr , gradient );
125
+ return (0 );
126
+ // fail += 1;
127
+ }
128
+ else if ((* theta_ptr < 0 ) && (gradient < 0 )) {
129
+ fprintf (stderr , "here3 %d %f %f\n" , irow , * theta_ptr , gradient );
130
+ return (0 );
131
+ // fail += 1;
121
132
}
122
133
}
123
134
else {
135
+ fprintf (stderr , "before4 %d %f %f\n" , irow , * theta_ptr , gradient );
124
136
if (fabs (gradient ) > (1. + tol ) * bound ) {
125
- fail += 1 ;
137
+ fprintf (stderr , "here4 %d %f %f\n" , irow , * theta_ptr , gradient );
138
+ return (0 );
139
+ // fail += 1;
126
140
}
127
141
}
142
+ theta_ptr ++ ;
143
+ gradient_ptr_tmp ++ ;
128
144
}
129
145
146
+ fprintf (stderr , "OK now\n" );
130
147
return (fail == 0 );
148
+
131
149
}
132
150
133
151
double update_one_coord (double * Sigma_ptr , /* A covariance matrix: X^TX/n */
@@ -236,7 +254,7 @@ int find_one_row_(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
236
254
bound ,
237
255
theta );
238
256
double new_value ;
239
- double tol = 1.e-5 ;
257
+ double tol = 1.e-8 ;
240
258
241
259
for (iter = 0 ; iter < maxiter ; iter ++ ) {
242
260
@@ -265,6 +283,7 @@ int find_one_row_(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
265
283
gradient_ptr ,
266
284
nrow ,
267
285
bound ) == 1 ) {
286
+ fprintf (stderr , "here5 \n" );
268
287
break ;
269
288
}
270
289
@@ -291,6 +310,7 @@ int find_one_row_(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
291
310
gradient_ptr ,
292
311
nrow ,
293
312
bound ) == 1 ) {
313
+ fprintf (stderr , "here6 \n" );
294
314
break ;
295
315
}
296
316
@@ -302,9 +322,9 @@ int find_one_row_(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
302
322
bound ,
303
323
theta );
304
324
305
- if (((old_value - new_value ) < tol * fabs (new_value )) && (iter > 0 )) {
306
- break ;
307
- }
325
+ /* if (((old_value - new_value) < tol * fabs(new_value)) && (iter > 0)) { */
326
+ /* break; */
327
+ /* } */
308
328
309
329
old_value = new_value ;
310
330
}
0 commit comments