MCPcopy Create free account
hub / github.com/abess-team/abess / splicing

Method splicing

src/Algorithm.h:483–557  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

481 };
482
483 bool splicing(T4 &X, T1 &y, Eigen::VectorXi &A, Eigen::VectorXi &I, int &C_max, T2 &beta, T3 &coef0,
484 Eigen::VectorXd &bd, Eigen::VectorXd &weights, Eigen::VectorXi &g_index, Eigen::VectorXi &g_size,
485 int N, double tau, double &train_loss) {
486 if (C_max <= 0) return false;
487
488 // init
489 // int p = X.cols();
490 int n = X.rows();
491
492 int A_size = A.size();
493 int I_size = I.size();
494
495 Eigen::VectorXd beta_A_group(A_size);
496 Eigen::VectorXd d_I_group(I_size);
497 for (int i = 0; i < A_size; i++) {
498 beta_A_group(i) = bd(A(i));
499 }
500
501 for (int i = 0; i < I_size; i++) {
502 d_I_group(i) = bd(I(i));
503 }
504
505 Eigen::VectorXi A_min_k = min_k(beta_A_group, C_max, true);
506 Eigen::VectorXi I_max_k = max_k(d_I_group, C_max, true);
507 Eigen::VectorXi s1 = vector_slice(A, A_min_k);
508 Eigen::VectorXi s2 = vector_slice(I, I_max_k);
509
510 // for (int i=0;i<C_max;i++){
511 // cout<<"try: ("<<s1(i)<<","<<bd(s1(i))<<") -> ("<<s2(i)<<","<<bd(s2(i))<<")"<<endl;///
512 // }
513
514 Eigen::VectorXi A_exchange(A_size);
515 Eigen::VectorXi A_ind_exchage;
516 T4 X_A_exchage;
517 T2 beta_A_exchange;
518 T3 coef0_A_exchange;
519
520 double L;
521 for (int k = C_max; k >= 1;) {
522 A_exchange = diff_union(A, s1, s2);
523 A_ind_exchage = find_ind(A_exchange, g_index, g_size, (this->beta).rows(), N);
524 X_A_exchage = X_seg(X, n, A_ind_exchage, this->model_type);
525 slice(beta, A_ind_exchage, beta_A_exchange);
526 coef0_A_exchange = coef0;
527
528 bool success = this->primary_model_fit(X_A_exchage, y, weights, beta_A_exchange, coef0_A_exchange,
529 train_loss, A_exchange, g_index, g_size);
530 // if (success){
531 L = this->loss_function(X_A_exchage, y, weights, beta_A_exchange, coef0_A_exchange, A_exchange, g_index,
532 g_size, this->lambda_level);
533 // }else{
534 // L = train_loss + 1;
535 // }
536
537 if (train_loss - L > tau) {
538 train_loss = L;
539 A = A_exchange;
540 I = complement(A_exchange, N);

Callers 1

get_AMethod · 0.95

Calls 14

primary_model_fitMethod · 0.95
loss_functionMethod · 0.95
min_kFunction · 0.85
max_kFunction · 0.85
vector_sliceFunction · 0.85
diff_unionFunction · 0.85
find_indFunction · 0.85
X_segFunction · 0.85
complementFunction · 0.85
slice_restoreFunction · 0.85
sliceFunction · 0.70
rowsMethod · 0.45

Tested by

no test coverage detected