14
14
// Throughout X is a design matrix
15
15
16
16
double objective_wide (double * X_ptr , /* A design matrix */
17
+ double * X_theta_ptr , /* Fitted values */
17
18
double * linear_func_ptr , /* Linear term in objective */
18
19
int * ever_active_ptr , /* Ever active set: 0-based */
19
20
int * nactive_ptr , /* Size of ever active set */
@@ -24,7 +25,7 @@ double objective_wide(double *X_ptr, /* A design matrix */
24
25
{
25
26
int irow , icol ;
26
27
double value = 0 ;
27
- double * X_ptr_tmp = X_ptr ;
28
+ double * X_theta_ptr_tmp = X_theta_ptr ;
28
29
double * linear_func_ptr_tmp = linear_func_ptr ;
29
30
double * theta_row_ptr , * theta_col_ptr ;
30
31
int * active_row_ptr , * active_col_ptr ;
@@ -34,29 +35,32 @@ double objective_wide(double *X_ptr, /* A design matrix */
34
35
theta_row_ptr = theta ;
35
36
theta_col_ptr = theta ;
36
37
37
- for ( irow = 0 ; irow < nactive ; irow ++ ) {
38
+ double entry = 0 ; // An entry of X\theta
38
39
39
- active_row_ptr = ((int * ) ever_active_ptr + irow );
40
- active_row = * active_row_ptr - 1 ; // Ever-active is 1-based
41
- theta_row_ptr = ((double * ) theta + active_row );
40
+ // The term \|X\theta\|^2_2/nrow
42
41
43
- for (icol = 0 ; icol < nactive ; icol ++ ) {
44
-
45
- active_col_ptr = ((int * ) ever_active_ptr + icol );
46
- active_col = * active_col_ptr - 1 ; // Ever-active is 1-based
47
- theta_col_ptr = ((double * ) theta + active_col );
42
+ for (irow = 0 ; irow < nrow ; irow ++ ) {
48
43
49
- X_ptr_tmp = ((double * ) X_ptr + nrow * active_col + active_row ); // Matrices are column-major order
44
+ X_theta_ptr = ((double * ) X_theta_ptr + irow );
45
+ value += (* (X_theta_ptr )) * (* (X_theta_ptr ));
50
46
51
- value += 0.5 * ( * X_ptr_tmp ) * ( * theta_row_ptr ) * ( * theta_col_ptr );
52
- }
53
- value += bound * fabs (( * theta_row_ptr )); // the \ell_1 term
47
+ }
48
+
49
+ for ( irow = 0 ; irow < nactive ; irow ++ ) {
54
50
55
51
// The linear term in the objective
56
52
53
+ active_row_ptr = ((int * ) ever_active_ptr + irow );
54
+ active_row = * active_row_ptr - 1 ; // Ever-active is 1-based
55
+ theta_row_ptr = ((double * ) theta + active_row );
56
+
57
57
linear_func_ptr_tmp = ((double * ) linear_func_ptr + active_row );
58
58
value += (* linear_func_ptr_tmp ) * (* theta_row_ptr );
59
59
60
+ // The \ell_1 term
61
+
62
+ value += bound * fabs ((* theta_row_ptr ));
63
+
60
64
}
61
65
62
66
return (value );
0 commit comments