11
11
// Update one coordinate
12
12
13
13
double objective (double * Sigma_ptr , /* A covariance matrix: X^TX/n */
14
- int * ever_active_ptr , /* Ever active set: 0 -based */
15
- int * nactive_ptr , /* Size of ever active set */
16
- int nrow , /* how many rows in Sigma */
17
- int row , /* which row: 0 -based */
18
- double bound , /* Lagrange multipler for \ell_1 */
19
- double * theta ) /* current value */
14
+ int * ever_active_ptr , /* Ever active set: 1 -based */
15
+ int * nactive_ptr , /* Size of ever active set */
16
+ int nrow , /* how many rows in Sigma */
17
+ int row , /* which row: 1 -based */
18
+ double bound , /* Lagrange multipler for \ell_1 */
19
+ double * theta ) /* current value */
20
20
{
21
21
int irow , icol ;
22
22
double value = 0 ;
@@ -32,13 +32,13 @@ double objective(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
32
32
for (irow = 0 ; irow < nactive ; irow ++ ) {
33
33
34
34
active_row_ptr = ((int * ) ever_active_ptr + irow );
35
- active_row = * active_row_ptr ;
35
+ active_row = * active_row_ptr - 1 ; // Ever-active set is 1-based
36
36
theta_row_ptr = ((double * ) theta + active_row );
37
37
38
38
for (icol = 0 ; icol < nactive ; icol ++ ) {
39
39
40
40
active_col_ptr = ((int * ) ever_active_ptr + icol );
41
- active_col = * active_col_ptr ;
41
+ active_col = * active_col_ptr - 1 ; // Ever-active set is 1-based
42
42
theta_col_ptr = ((double * ) theta + active_col );
43
43
44
44
Sigma_ptr_tmp = ((double * ) Sigma_ptr + nrow * active_col + active_row ); // Matrices are column-major order
@@ -48,14 +48,15 @@ double objective(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
48
48
value = value + bound * fabs ((* theta_row_ptr )); // the \ell_1 term
49
49
}
50
50
51
- theta_row_ptr = ((double * ) theta + row );
51
+ theta_row_ptr = ((double * ) theta + ( row - 1 )); // row is 1-based index
52
52
value -= (* theta_row_ptr ); // the elementary basis vector term
53
53
54
54
return (value );
55
55
}
56
56
57
57
// Check if active and add it to active list if necessary
58
-
58
+ // Ever active set is stored as 1-based indices
59
+ // coord is 0-based
59
60
int update_ever_active (int coord ,
60
61
int * ever_active_ptr ,
61
62
int * nactive_ptr ) {
@@ -67,7 +68,7 @@ int update_ever_active(int coord,
67
68
for (iactive = 0 ; iactive < nactive ; iactive ++ ) {
68
69
ever_active_ptr_tmp = ((int * ) ever_active_ptr + iactive );
69
70
active_var = (* ever_active_ptr_tmp );
70
- if (active_var == coord ) {
71
+ if (active_var - 1 == coord ) { // Indices in active set are 1-based
71
72
return (1 );
72
73
}
73
74
}
@@ -79,7 +80,7 @@ int update_ever_active(int coord,
79
80
// number of active variables
80
81
81
82
ever_active_ptr_tmp = ((int * ) ever_active_ptr + * nactive_ptr );
82
- * ever_active_ptr_tmp = coord ;
83
+ * ever_active_ptr_tmp = coord + 1 ; // Indices are 1-based
83
84
* nactive_ptr += 1 ;
84
85
85
86
return (0 );
@@ -88,7 +89,7 @@ int update_ever_active(int coord,
88
89
int check_KKT (double * theta , /* current theta */
89
90
double * gradient_ptr , /* Sigma times theta */
90
91
int nrow , /* how many rows in Sigma */
91
- int row , /* which row: 0 -based */
92
+ int row , /* which row: 1 -based */
92
93
double bound , /* Lagrange multipler for \ell_1 */
93
94
double tol ) /* precision for checking KKT conditions */
94
95
{
@@ -108,7 +109,7 @@ int check_KKT(double *theta, /* current theta */
108
109
109
110
// For the basis vector
110
111
111
- if (row == irow ) {
112
+ if (row - 1 == irow ) { // Row is a 1-based index
112
113
gradient -= 1 ;
113
114
}
114
115
@@ -139,7 +140,7 @@ double update_one_coord(double *Sigma_ptr, /* A covariance matrix: X^T
139
140
int nrow , /* How many rows in Sigma */
140
141
double bound , /* feasibility parameter */
141
142
double * theta , /* current value */
142
- int row , /* which row: 0 -based */
143
+ int row , /* which row: 1 -based */
143
144
int coord , /* which coordinate to update: 0-based */
144
145
int is_active ) /* Is this part of ever_active */
145
146
{
@@ -156,8 +157,6 @@ double update_one_coord(double *Sigma_ptr, /* A covariance matrix: X^T
156
157
double * quadratic_ptr = ((double * ) Sigma_diag_ptr + coord );
157
158
double quadratic_term = * quadratic_ptr ;
158
159
159
- // int *ever_active_ptr_tmp;
160
-
161
160
gradient_ptr_tmp = ((double * ) gradient_ptr + coord );
162
161
linear_term = * gradient_ptr_tmp ;
163
162
@@ -167,9 +166,10 @@ double update_one_coord(double *Sigma_ptr, /* A covariance matrix: X^T
167
166
// The coord entry of gradient_ptr term has a diagonal term in it:
168
167
// Sigma[coord, coord] * theta[coord]
169
168
// This removes it.
169
+
170
170
linear_term -= quadratic_term * old_value ;
171
171
172
- if (row == coord ) {
172
+ if (row - 1 == coord ) { // Row is 1-based
173
173
linear_term -= 1 ;
174
174
}
175
175
@@ -220,13 +220,13 @@ double update_one_coord(double *Sigma_ptr, /* A covariance matrix: X^T
220
220
int find_one_row_ (double * Sigma_ptr , /* A covariance matrix: X^TX/n */
221
221
double * Sigma_diag_ptr , /* Diagonal entry of covariance matrix */
222
222
double * gradient_ptr , /* Sigma times theta */
223
- int * ever_active_ptr , /* Ever active set: 0 -based */
223
+ int * ever_active_ptr , /* Ever active set: 1 -based */
224
224
int * nactive_ptr , /* Size of ever active set */
225
225
int nrow , /* How many rows in Sigma */
226
226
double bound , /* feasibility parameter */
227
227
double * theta , /* current value */
228
228
int maxiter , /* how many iterations */
229
- int row , /* which coordinate to update: 0 -based */
229
+ int row , /* which coordinate to solve: 1 -based */
230
230
double kkt_tol , /* precision for checking KKT conditions */
231
231
double objective_tol ) /* precision for checking relative decrease in objective value */
232
232
{
@@ -267,7 +267,7 @@ int find_one_row_(double *Sigma_ptr, /* A covariance matrix: X^TX/n */
267
267
bound ,
268
268
theta ,
269
269
row ,
270
- * active_ptr ,
270
+ * active_ptr - 1 , // Ever active set is 1-based
271
271
1 );
272
272
active_ptr ++ ;
273
273
}
0 commit comments