| 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); |
no test coverage detected