int main() { int sum1, sum2; sum1 = init_mat(3); sum2 = mat_sum(); printf("sum1 = %d sum2 = %d\n", sum1, sum2); return 0; }
double first_subproblm_obj (double ** dist_mat, double ** yone, double ** zone, double ** wone, double rho, int N) { double ** temp = mat_init (N, N); double ** diffone = mat_init (N, N); mat_zeros (diffone, N, N); // sum1 = 0.5 * sum_n sum_k (w_nk * d^2_nk) -> loss mat_zeros (temp, N, N); mat_times (wone, dist_mat, temp, N, N); double sum1 = 0.5 * mat_sum (temp, N, N); // sum2 = y_1^T dot (w_1 - z) -> linear mat_zeros (temp, N, N); mat_sub (wone, zone, diffone, N, N); // temp = w_1 - z_1 mat_tdot (yone, diffone, temp, N, N); double sum2 = mat_sum (temp, N, N); // sum3 = 0.5 * rho * || w_1 - z_1 ||^2 -> quadratic mat_zeros (temp, N, N); mat_sub (wone, zone, temp, N, N); double sum3 = 0.5 * rho * mat_norm2 (temp, N, N); // sum4 = r dot (1 - sum_k w_nk) -> dummy double * temp_vec = new double [N]; mat_sum_row (wone, temp_vec, N, N); double dummy_penalty = 0.0; for (int i = 0; i < N; i ++) { dummy_penalty += r*(1 - temp_vec[i]); } double total = sum1+sum2+sum3+dummy_penalty; #ifdef FRANK_WOLFE_DUMP cout << "[Frank_wolfe] (loss, linear, quadratic, dummy, total) = (" << sum1 << ", " << sum2 << ", " << sum3 << ", " << dummy_penalty << ", " << total << ")" << endl; #endif mat_free (temp, N, N); mat_free (diffone, N, N); delete [] temp_vec; return total; }
double second_subproblem_obj (double ** ytwo, double ** z, double ** wtwo, double rho, int N, double* lambda) { double ** temp = mat_init (N, N); double ** difftwo = mat_init (N, N); mat_zeros (difftwo, N, N); // reg = 0.5 * sum_k max_n | w_nk | -> group-lasso mat_zeros (temp, N, N); double * maxn = new double [N]; for (int i = 0; i < N; i ++) { // Ian: need initial maxn[i] = -INF; } for (int i = 0; i < N; i ++) { for (int j = 0; j < N; j ++) { if (wtwo[i][j] > maxn[j]) maxn[j] = wtwo[i][j]; } } double sumk = 0.0; for (int i = 0; i < N; i ++) { sumk += lambda[i]*maxn[i]; } double group_lasso = sumk; // sum2 = y_2^T dot (w_2 - z) -> linear mat_zeros (temp, N, N); mat_sub (wtwo, z, difftwo, N, N); mat_tdot (ytwo, difftwo, temp, N, N); double sum2 = mat_sum (temp, N, N); // sum3 = 0.5 * rho * || w_2 - z_2 ||^2 -> quadratic mat_zeros (temp, N, N); mat_sub (wtwo, z, temp, N, N); double sum3 = 0.5 * rho * mat_norm2 (temp, N, N); mat_free (temp, N, N); // ouput values of each components #ifdef BLOCKWISE_DUMP cout << "[Blockwise] (group_lasso, linear, quadratic) = (" << group_lasso << ", " << sum2 << ", " << sum3 << ")" << endl; #endif //cerr << group_lasso << ", " << sum2 << ", " << sum3 << endl; return group_lasso + sum2 + sum3; }