libflame
revision_anchor
|
Go to the source code of this file.
Functions | |
FLA_Error | FLA_UDdate_UT_blk_var1 (FLA_Obj R, FLA_Obj C, FLA_Obj D, FLA_Obj T, fla_uddateut_t *cntl) |
FLA_Error | FLA_UDdate_UT_blk_var2 (FLA_Obj R, FLA_Obj C, FLA_Obj D, FLA_Obj T, fla_uddateut_t *cntl) |
FLA_Error | FLA_UDdate_UT_unb_var1 (FLA_Obj R, FLA_Obj C, FLA_Obj D, FLA_Obj T) |
FLA_Error | FLA_UDdate_UT_opt_var1 (FLA_Obj R, FLA_Obj C, FLA_Obj D, FLA_Obj T) |
FLA_Error | FLA_UDdate_UT_ops_var1 (int mn_RT, int m_C, int m_D, float *R, int rs_R, int cs_R, float *C, int rs_C, int cs_C, float *D, int rs_D, int cs_D, float *T, int rs_T, int cs_T) |
FLA_Error | FLA_UDdate_UT_opd_var1 (int mn_RT, int m_C, int m_D, double *R, int rs_R, int cs_R, double *C, int rs_C, int cs_C, double *D, int rs_D, int cs_D, double *T, int rs_T, int cs_T) |
FLA_Error | FLA_UDdate_UT_opc_var1 (int mn_RT, int m_C, int m_D, scomplex *R, int rs_R, int cs_R, scomplex *C, int rs_C, int cs_C, scomplex *D, int rs_D, int cs_D, scomplex *T, int rs_T, int cs_T) |
FLA_Error | FLA_UDdate_UT_opz_var1 (int mn_RT, int m_C, int m_D, dcomplex *R, int rs_R, int cs_R, dcomplex *C, int rs_C, int cs_C, dcomplex *D, int rs_D, int cs_D, dcomplex *T, int rs_T, int cs_T) |
FLA_Error FLA_UDdate_UT_blk_var1 | ( | FLA_Obj | R, |
FLA_Obj | C, | ||
FLA_Obj | D, | ||
FLA_Obj | T, | ||
fla_uddateut_t * | cntl | ||
) |
References FLA_Apply_QUD_UT_internal(), FLA_Cont_with_1x3_to_1x2(), FLA_Cont_with_3x3_to_2x2(), FLA_Obj_length(), FLA_Obj_min_dim(), FLA_Obj_width(), FLA_Part_1x2(), FLA_Part_2x1(), FLA_Part_2x2(), FLA_Repart_1x2_to_1x3(), FLA_Repart_2x2_to_3x3(), and FLA_UDdate_UT_internal().
Referenced by FLA_UDdate_UT_internal().
{ FLA_Obj RTL, RTR, R00, R01, R02, RBL, RBR, R10, R11, R12, R20, R21, R22; FLA_Obj CL, CR, C0, C1, C2; FLA_Obj DL, DR, D0, D1, D2; FLA_Obj TL, TR, T0, T1, W12; FLA_Obj T1T, T1B; FLA_Obj W12T, W12B; dim_t b_alg, b; // Query the algorithmic blocksize by inspecting the length of T. b_alg = FLA_Obj_length( T ); FLA_Part_2x2( R, &RTL, &RTR, &RBL, &RBR, 0, 0, FLA_TL ); FLA_Part_1x2( C, &CL, &CR, 0, FLA_LEFT ); FLA_Part_1x2( D, &DL, &DR, 0, FLA_LEFT ); FLA_Part_1x2( T, &TL, &TR, 0, FLA_LEFT ); while ( FLA_Obj_min_dim( RBR ) > 0 ){ b = min( b_alg, FLA_Obj_min_dim( RBR ) ); FLA_Repart_2x2_to_3x3( RTL, /**/ RTR, &R00, /**/ &R01, &R02, /* ************* */ /* ******************** */ &R10, /**/ &R11, &R12, RBL, /**/ RBR, &R20, /**/ &R21, &R22, b, b, FLA_BR ); FLA_Repart_1x2_to_1x3( CL, /**/ CR, &C0, /**/ &C1, &C2, b, FLA_RIGHT ); FLA_Repart_1x2_to_1x3( DL, /**/ DR, &D0, /**/ &D1, &D2, b, FLA_RIGHT ); FLA_Repart_1x2_to_1x3( TL, /**/ TR, &T0, /**/ &T1, &W12, b, FLA_RIGHT ); /*------------------------------------------------------------*/ FLA_Part_2x1( T1, &T1T, &T1B, b, FLA_TOP ); /* Perform an up/downdate of the upper triangular factor R11 via up/downdating UT Householder transformations: [ R11, ... C1, ... D1, T1T ] = FLA_UDdate_UT( R11, ... C1, ... D1, T1T ); by updating R11 in such a way that removes the contributions of the rows in D1 while simultaneously adding new contributions to the factorization from the rows of C1. Note that C1 and D1 are also updated in the process. */ FLA_UDdate_UT_internal( R11, C1, D1, T1T, FLA_Cntl_sub_uddateut( cntl ) ); if ( FLA_Obj_width( R12 ) > 0 ) { FLA_Part_2x1( W12, &W12T, &W12B, b, FLA_TOP ); /* Apply Q' to R12, C2, and D2 from the left: / R12 \ / R12 \ | C2 | = Q' * | C2 | \ D2 / \ D2 / where Q is formed from C1 and D1. */ FLA_Apply_QUD_UT_internal( FLA_LEFT, FLA_CONJ_TRANSPOSE, FLA_FORWARD, FLA_COLUMNWISE, T1T, W12T, R12, C1, C2, D1, D2, FLA_Cntl_sub_apqudut( cntl ) ); } /*------------------------------------------------------------*/ FLA_Cont_with_3x3_to_2x2( &RTL, /**/ &RTR, R00, R01, /**/ R02, R10, R11, /**/ R12, /* ************** */ /* ****************** */ &RBL, /**/ &RBR, R20, R21, /**/ R22, FLA_TL ); FLA_Cont_with_1x3_to_1x2( &CL, /**/ &CR, C0, C1, /**/ C2, FLA_LEFT ); FLA_Cont_with_1x3_to_1x2( &DL, /**/ &DR, D0, D1, /**/ D2, FLA_LEFT ); FLA_Cont_with_1x3_to_1x2( &TL, /**/ &TR, T0, T1, /**/ W12, FLA_LEFT ); } return FLA_SUCCESS; }
FLA_Error FLA_UDdate_UT_blk_var2 | ( | FLA_Obj | R, |
FLA_Obj | C, | ||
FLA_Obj | D, | ||
FLA_Obj | T, | ||
fla_uddateut_t * | cntl | ||
) |
References FLA_Cont_with_3x1_to_2x1(), FLA_Determine_blocksize(), FLA_Obj_length(), FLA_Part_2x1(), FLA_Repart_2x1_to_3x1(), and FLA_UDdate_UT_internal().
Referenced by FLA_UDdate_UT_internal().
{ FLA_Obj CT, C0, CB, C1, C2; FLA_Obj DT, D0, DB, D1, D2; FLA_Obj TT, T0, TB, T1, T2; dim_t b_C, b_D, b_T; FLA_Part_2x1( C, &CT, &CB, 0, FLA_TOP ); FLA_Part_2x1( D, &DT, &DB, 0, FLA_TOP ); FLA_Part_2x1( T, &TT, &TB, 0, FLA_TOP ); while ( FLA_Obj_length( CT ) < FLA_Obj_length( C ) && FLA_Obj_length( DT ) < FLA_Obj_length( D ) ){ b_C = FLA_Determine_blocksize( CB, FLA_BOTTOM, FLA_Cntl_blocksize( cntl ) ); b_D = FLA_Determine_blocksize( DB, FLA_BOTTOM, FLA_Cntl_blocksize( cntl ) ); b_T = FLA_Determine_blocksize( TB, FLA_BOTTOM, FLA_Cntl_blocksize( cntl ) ); FLA_Repart_2x1_to_3x1( CT, &C0, /* ** */ /* ****** */ &C1, CB, &C2, b_C, FLA_BOTTOM ); FLA_Repart_2x1_to_3x1( DT, &D0, /* ** */ /* ****** */ &D1, DB, &D2, b_D, FLA_BOTTOM ); FLA_Repart_2x1_to_3x1( TT, &T0, /* ** */ /* ****** */ &T1, TB, &T2, b_T, FLA_BOTTOM ); /*------------------------------------------------------------*/ /* Perform an up/downdate of the upper triangular Cholesky factor R via "UD" UT Householder transformations: [ R, ... C1, ... D1, T1 ] = FLA_UDdate_UT( R, ... C1, ... D1, T1 ); by updating R in such a way that removes the contributions of the rows in D1 while simultaneously adding new contributions to the factorization from the rows of C1. Note that C1 and D1 are also updated in the process. Also note that either C1 or D1 may become empty at any iteration. */ FLA_UDdate_UT_internal( R, C1, D1, T1, FLA_Cntl_sub_uddateut( cntl ) ); /*------------------------------------------------------------*/ FLA_Cont_with_3x1_to_2x1( &CT, C0, C1, /* ** */ /* ****** */ &CB, C2, FLA_TOP ); FLA_Cont_with_3x1_to_2x1( &DT, D0, D1, /* ** */ /* ****** */ &DB, D2, FLA_TOP ); FLA_Cont_with_3x1_to_2x1( &TT, T0, T1, /* ** */ /* ****** */ &TB, T2, FLA_TOP ); } return FLA_SUCCESS; }
FLA_Error FLA_UDdate_UT_opc_var1 | ( | int | mn_RT, |
int | m_C, | ||
int | m_D, | ||
scomplex * | R, | ||
int | rs_R, | ||
int | cs_R, | ||
scomplex * | C, | ||
int | rs_C, | ||
int | cs_C, | ||
scomplex * | D, | ||
int | rs_D, | ||
int | cs_D, | ||
scomplex * | T, | ||
int | rs_T, | ||
int | cs_T | ||
) |
References bl1_cherk(), bl1_cident(), bl1_cscalediag(), BLIS1_CONJ_TRANSPOSE, BLIS1_NO_CONJUGATE, BLIS1_UPPER_TRIANGULAR, FLA_Apply_HUD_UT_l_opc_var1(), FLA_Househ3UD_UT_opc(), FLA_MINUS_ONE, FLA_ONE, and FLA_ONE_HALF.
Referenced by FLA_UDdate_UT_opt_var1().
{ scomplex* buff_half = FLA_COMPLEX_PTR( FLA_ONE_HALF ); float* buff_1 = FLA_FLOAT_PTR( FLA_ONE ); float* buff_m1 = FLA_FLOAT_PTR( FLA_MINUS_ONE ); int i; for ( i = 0; i < mn_RT; ++i ) { scomplex* rho11 = buff_R + (i )*cs_R + (i )*rs_R; scomplex* r12t = buff_R + (i+1)*cs_R + (i )*rs_R; scomplex* c1 = buff_C + (i )*cs_C + (0 )*rs_C; scomplex* C2 = buff_C + (i+1)*cs_C + (0 )*rs_C; scomplex* d1 = buff_D + (i )*cs_D + (0 )*rs_D; scomplex* D2 = buff_D + (i+1)*cs_D + (0 )*rs_D; scomplex* tau11 = buff_T + (i )*cs_T + (i )*rs_T; scomplex* w12t = buff_T + (i+1)*cs_T + (i )*rs_T; int mn_ahead = mn_RT - i - 1; //------------------------------------------------------------// // FLA_Househ3UD_UT( rho11, // c1, // d1, tau11 ); FLA_Househ3UD_UT_opc( m_C, m_D, rho11, c1, rs_C, d1, rs_D, tau11 ); // FLA_Apply_HUD_UT( FLA_LEFT, // tau11, r12t, // c1, C2, // d1, D2 ); FLA_Apply_HUD_UT_l_opc_var1( m_C, m_D, mn_ahead, tau11, w12t, cs_T, r12t, cs_R, c1, rs_C, C2, rs_C, cs_C, d1, rs_D, D2, rs_D, cs_D ); //------------------------------------------------------------// } // FLA_Set_to_identity( T ); bl1_cident( mn_RT, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_ONE, C, FLA_ONE, T ); bl1_cherk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_C, buff_1, buff_C, rs_C, cs_C, buff_1, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_MINUS_ONE, D, FLA_ONE, T ); bl1_cherk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_D, buff_m1, buff_D, rs_D, cs_D, buff_1, buff_T, rs_T, cs_T ); // FLA_Scale_diag( FLA_NO_CONJUGATE, FLA_ONE_HALF, T ); bl1_cscalediag( BLIS1_NO_CONJUGATE, 0, mn_RT, mn_RT, buff_half, buff_T, rs_T, cs_T ); return FLA_SUCCESS; }
FLA_Error FLA_UDdate_UT_opd_var1 | ( | int | mn_RT, |
int | m_C, | ||
int | m_D, | ||
double * | R, | ||
int | rs_R, | ||
int | cs_R, | ||
double * | C, | ||
int | rs_C, | ||
int | cs_C, | ||
double * | D, | ||
int | rs_D, | ||
int | cs_D, | ||
double * | T, | ||
int | rs_T, | ||
int | cs_T | ||
) |
References bl1_dident(), bl1_dscalediag(), bl1_dsyrk(), BLIS1_CONJ_TRANSPOSE, BLIS1_NO_CONJUGATE, BLIS1_UPPER_TRIANGULAR, FLA_Apply_HUD_UT_l_opd_var1(), FLA_Househ3UD_UT_opd(), FLA_MINUS_ONE, FLA_ONE, and FLA_ONE_HALF.
Referenced by FLA_UDdate_UT_opt_var1().
{ double* buff_half = FLA_DOUBLE_PTR( FLA_ONE_HALF ); double* buff_1 = FLA_DOUBLE_PTR( FLA_ONE ); double* buff_m1 = FLA_DOUBLE_PTR( FLA_MINUS_ONE ); int i; for ( i = 0; i < mn_RT; ++i ) { double* rho11 = buff_R + (i )*cs_R + (i )*rs_R; double* r12t = buff_R + (i+1)*cs_R + (i )*rs_R; double* c1 = buff_C + (i )*cs_C + (0 )*rs_C; double* C2 = buff_C + (i+1)*cs_C + (0 )*rs_C; double* d1 = buff_D + (i )*cs_D + (0 )*rs_D; double* D2 = buff_D + (i+1)*cs_D + (0 )*rs_D; double* tau11 = buff_T + (i )*cs_T + (i )*rs_T; double* w12t = buff_T + (i+1)*cs_T + (i )*rs_T; int mn_ahead = mn_RT - i - 1; //------------------------------------------------------------// // FLA_Househ3UD_UT( rho11, // c1, // d1, tau11 ); FLA_Househ3UD_UT_opd( m_C, m_D, rho11, c1, rs_C, d1, rs_D, tau11 ); // FLA_Apply_HUD_UT( FLA_LEFT, // tau11, r12t, // c1, C2, // d1, D2 ); FLA_Apply_HUD_UT_l_opd_var1( m_C, m_D, mn_ahead, tau11, w12t, cs_T, r12t, cs_R, c1, rs_C, C2, rs_C, cs_C, d1, rs_D, D2, rs_D, cs_D ); //------------------------------------------------------------// } // FLA_Set_to_identity( T ); bl1_dident( mn_RT, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_ONE, C, FLA_ONE, T ); bl1_dsyrk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_C, buff_1, buff_C, rs_C, cs_C, buff_1, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_MINUS_ONE, D, FLA_ONE, T ); bl1_dsyrk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_D, buff_m1, buff_D, rs_D, cs_D, buff_1, buff_T, rs_T, cs_T ); // FLA_Scale_diag( FLA_NO_CONJUGATE, FLA_ONE_HALF, T ); bl1_dscalediag( BLIS1_NO_CONJUGATE, 0, mn_RT, mn_RT, buff_half, buff_T, rs_T, cs_T ); return FLA_SUCCESS; }
FLA_Error FLA_UDdate_UT_ops_var1 | ( | int | mn_RT, |
int | m_C, | ||
int | m_D, | ||
float * | R, | ||
int | rs_R, | ||
int | cs_R, | ||
float * | C, | ||
int | rs_C, | ||
int | cs_C, | ||
float * | D, | ||
int | rs_D, | ||
int | cs_D, | ||
float * | T, | ||
int | rs_T, | ||
int | cs_T | ||
) |
References bl1_sident(), bl1_sscalediag(), bl1_ssyrk(), BLIS1_CONJ_TRANSPOSE, BLIS1_NO_CONJUGATE, BLIS1_UPPER_TRIANGULAR, FLA_Apply_HUD_UT_l_ops_var1(), FLA_Househ3UD_UT_ops(), FLA_MINUS_ONE, FLA_ONE, and FLA_ONE_HALF.
Referenced by FLA_UDdate_UT_opt_var1().
{ float* buff_half = FLA_FLOAT_PTR( FLA_ONE_HALF ); float* buff_1 = FLA_FLOAT_PTR( FLA_ONE ); float* buff_m1 = FLA_FLOAT_PTR( FLA_MINUS_ONE ); int i; for ( i = 0; i < mn_RT; ++i ) { float* rho11 = buff_R + (i )*cs_R + (i )*rs_R; float* r12t = buff_R + (i+1)*cs_R + (i )*rs_R; float* c1 = buff_C + (i )*cs_C + (0 )*rs_C; float* C2 = buff_C + (i+1)*cs_C + (0 )*rs_C; float* d1 = buff_D + (i )*cs_D + (0 )*rs_D; float* D2 = buff_D + (i+1)*cs_D + (0 )*rs_D; float* tau11 = buff_T + (i )*cs_T + (i )*rs_T; float* w12t = buff_T + (i+1)*cs_T + (i )*rs_T; int mn_ahead = mn_RT - i - 1; //------------------------------------------------------------// // FLA_Househ3UD_UT( rho11, // c1, // d1, tau11 ); FLA_Househ3UD_UT_ops( m_C, m_D, rho11, c1, rs_C, d1, rs_D, tau11 ); // FLA_Apply_HUD_UT( FLA_LEFT, // tau11, r12t, // c1, C2, // d1, D2 ); FLA_Apply_HUD_UT_l_ops_var1( m_C, m_D, mn_ahead, tau11, w12t, cs_T, r12t, cs_R, c1, rs_C, C2, rs_C, cs_C, d1, rs_D, D2, rs_D, cs_D ); //------------------------------------------------------------// } // FLA_Set_to_identity( T ); bl1_sident( mn_RT, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_ONE, C, FLA_ONE, T ); bl1_ssyrk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_C, buff_1, buff_C, rs_C, cs_C, buff_1, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_MINUS_ONE, D, FLA_ONE, T ); bl1_ssyrk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_D, buff_m1, buff_D, rs_D, cs_D, buff_1, buff_T, rs_T, cs_T ); // FLA_Scale_diag( FLA_NO_CONJUGATE, FLA_ONE_HALF, T ); bl1_sscalediag( BLIS1_NO_CONJUGATE, 0, mn_RT, mn_RT, buff_half, buff_T, rs_T, cs_T ); return FLA_SUCCESS; }
References FLA_Obj_col_stride(), FLA_Obj_datatype(), FLA_Obj_length(), FLA_Obj_row_stride(), FLA_UDdate_UT_opc_var1(), FLA_UDdate_UT_opd_var1(), FLA_UDdate_UT_ops_var1(), and FLA_UDdate_UT_opz_var1().
Referenced by FLA_UDdate_UT_internal().
{ FLA_Datatype datatype; int mn_RT, m_C, m_D; int rs_R, cs_R; int rs_C, cs_C; int rs_D, cs_D; int rs_T, cs_T; datatype = FLA_Obj_datatype( R ); mn_RT = FLA_Obj_length( R ); m_C = FLA_Obj_length( C ); m_D = FLA_Obj_length( D ); rs_R = FLA_Obj_row_stride( R ); cs_R = FLA_Obj_col_stride( R ); rs_C = FLA_Obj_row_stride( C ); cs_C = FLA_Obj_col_stride( C ); rs_D = FLA_Obj_row_stride( D ); cs_D = FLA_Obj_col_stride( D ); rs_T = FLA_Obj_row_stride( T ); cs_T = FLA_Obj_col_stride( T ); switch ( datatype ) { case FLA_FLOAT: { float* buff_R = FLA_FLOAT_PTR( R ); float* buff_C = FLA_FLOAT_PTR( C ); float* buff_D = FLA_FLOAT_PTR( D ); float* buff_T = FLA_FLOAT_PTR( T ); FLA_UDdate_UT_ops_var1( mn_RT, m_C, m_D, buff_R, rs_R, cs_R, buff_C, rs_C, cs_C, buff_D, rs_D, cs_D, buff_T, rs_T, cs_T ); break; } case FLA_DOUBLE: { double* buff_R = FLA_DOUBLE_PTR( R ); double* buff_C = FLA_DOUBLE_PTR( C ); double* buff_D = FLA_DOUBLE_PTR( D ); double* buff_T = FLA_DOUBLE_PTR( T ); FLA_UDdate_UT_opd_var1( mn_RT, m_C, m_D, buff_R, rs_R, cs_R, buff_C, rs_C, cs_C, buff_D, rs_D, cs_D, buff_T, rs_T, cs_T ); break; } case FLA_COMPLEX: { scomplex* buff_R = FLA_COMPLEX_PTR( R ); scomplex* buff_C = FLA_COMPLEX_PTR( C ); scomplex* buff_D = FLA_COMPLEX_PTR( D ); scomplex* buff_T = FLA_COMPLEX_PTR( T ); FLA_UDdate_UT_opc_var1( mn_RT, m_C, m_D, buff_R, rs_R, cs_R, buff_C, rs_C, cs_C, buff_D, rs_D, cs_D, buff_T, rs_T, cs_T ); break; } case FLA_DOUBLE_COMPLEX: { dcomplex* buff_R = FLA_DOUBLE_COMPLEX_PTR( R ); dcomplex* buff_C = FLA_DOUBLE_COMPLEX_PTR( C ); dcomplex* buff_D = FLA_DOUBLE_COMPLEX_PTR( D ); dcomplex* buff_T = FLA_DOUBLE_COMPLEX_PTR( T ); FLA_UDdate_UT_opz_var1( mn_RT, m_C, m_D, buff_R, rs_R, cs_R, buff_C, rs_C, cs_C, buff_D, rs_D, cs_D, buff_T, rs_T, cs_T ); break; } } return FLA_SUCCESS; }
FLA_Error FLA_UDdate_UT_opz_var1 | ( | int | mn_RT, |
int | m_C, | ||
int | m_D, | ||
dcomplex * | R, | ||
int | rs_R, | ||
int | cs_R, | ||
dcomplex * | C, | ||
int | rs_C, | ||
int | cs_C, | ||
dcomplex * | D, | ||
int | rs_D, | ||
int | cs_D, | ||
dcomplex * | T, | ||
int | rs_T, | ||
int | cs_T | ||
) |
References bl1_zherk(), bl1_zident(), bl1_zscalediag(), BLIS1_CONJ_TRANSPOSE, BLIS1_NO_CONJUGATE, BLIS1_UPPER_TRIANGULAR, FLA_Apply_HUD_UT_l_opz_var1(), FLA_Househ3UD_UT_opz(), FLA_MINUS_ONE, FLA_ONE, and FLA_ONE_HALF.
Referenced by FLA_UDdate_UT_opt_var1().
{ dcomplex* buff_half = FLA_DOUBLE_COMPLEX_PTR( FLA_ONE_HALF ); double* buff_1 = FLA_DOUBLE_PTR( FLA_ONE ); double* buff_m1 = FLA_DOUBLE_PTR( FLA_MINUS_ONE ); int i; for ( i = 0; i < mn_RT; ++i ) { dcomplex* rho11 = buff_R + (i )*cs_R + (i )*rs_R; dcomplex* r12t = buff_R + (i+1)*cs_R + (i )*rs_R; dcomplex* c1 = buff_C + (i )*cs_C + (0 )*rs_C; dcomplex* C2 = buff_C + (i+1)*cs_C + (0 )*rs_C; dcomplex* d1 = buff_D + (i )*cs_D + (0 )*rs_D; dcomplex* D2 = buff_D + (i+1)*cs_D + (0 )*rs_D; dcomplex* tau11 = buff_T + (i )*cs_T + (i )*rs_T; dcomplex* w12t = buff_T + (i+1)*cs_T + (i )*rs_T; int mn_ahead = mn_RT - i - 1; //------------------------------------------------------------// // FLA_Househ3UD_UT( rho11, // c1, // d1, tau11 ); FLA_Househ3UD_UT_opz( m_C, m_D, rho11, c1, rs_C, d1, rs_D, tau11 ); // FLA_Apply_HUD_UT( FLA_LEFT, // tau11, r12t, // c1, C2, // d1, D2 ); FLA_Apply_HUD_UT_l_opz_var1( m_C, m_D, mn_ahead, tau11, w12t, cs_T, r12t, cs_R, c1, rs_C, C2, rs_C, cs_C, d1, rs_D, D2, rs_D, cs_D ); //------------------------------------------------------------// } // FLA_Set_to_identity( T ); bl1_zident( mn_RT, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_ONE, C, FLA_ONE, T ); bl1_zherk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_C, buff_1, buff_C, rs_C, cs_C, buff_1, buff_T, rs_T, cs_T ); // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, // FLA_MINUS_ONE, D, FLA_ONE, T ); bl1_zherk( BLIS1_UPPER_TRIANGULAR, BLIS1_CONJ_TRANSPOSE, mn_RT, m_D, buff_m1, buff_D, rs_D, cs_D, buff_1, buff_T, rs_T, cs_T ); // FLA_Scale_diag( FLA_NO_CONJUGATE, FLA_ONE_HALF, T ); bl1_zscalediag( BLIS1_NO_CONJUGATE, 0, mn_RT, mn_RT, buff_half, buff_T, rs_T, cs_T ); return FLA_SUCCESS; }
References FLA_Apply_HUD_UT(), FLA_Cont_with_1x3_to_1x2(), FLA_Cont_with_3x3_to_2x2(), FLA_Herk_external(), FLA_Househ3UD_UT(), FLA_MINUS_ONE, FLA_Obj_min_dim(), FLA_ONE, FLA_ONE_HALF, FLA_Part_1x2(), FLA_Part_2x2(), FLA_Repart_1x2_to_1x3(), FLA_Repart_2x2_to_3x3(), FLA_Scale_diag(), and FLA_Set_to_identity().
Referenced by FLA_UDdate_UT_internal().
{ FLA_Obj RTL, RTR, R00, r01, R02, RBL, RBR, r10t, rho11, r12t, R20, r21, R22; FLA_Obj CL, CR, C0, c1, C2; FLA_Obj DL, DR, D0, d1, D2; FLA_Obj TTL, TTR, T00, t01, T02, TBL, TBR, t10t, tau11, w12t, T20, t21, T22; FLA_Part_2x2( R, &RTL, &RTR, &RBL, &RBR, 0, 0, FLA_TL ); FLA_Part_1x2( C, &CL, &CR, 0, FLA_LEFT ); FLA_Part_1x2( D, &DL, &DR, 0, FLA_LEFT ); FLA_Part_2x2( T, &TTL, &TTR, &TBL, &TBR, 0, 0, FLA_TL ); while ( FLA_Obj_min_dim( RBR ) > 0 ){ FLA_Repart_2x2_to_3x3( RTL, /**/ RTR, &R00, /**/ &r01, &R02, /* ************* */ /* ************************** */ &r10t, /**/ &rho11, &r12t, RBL, /**/ RBR, &R20, /**/ &r21, &R22, 1, 1, FLA_BR ); FLA_Repart_1x2_to_1x3( CL, /**/ CR, &C0, /**/ &c1, &C2, 1, FLA_RIGHT ); FLA_Repart_1x2_to_1x3( DL, /**/ DR, &D0, /**/ &d1, &D2, 1, FLA_RIGHT ); FLA_Repart_2x2_to_3x3( TTL, /**/ TTR, &T00, /**/ &t01, &T02, /* ************* */ /* ************************ */ &t10t, /**/ &tau11, &w12t, TBL, /**/ TBR, &T20, /**/ &t21, &T22, 1, 1, FLA_BR ); /*------------------------------------------------------------*/ // Compute tau11, u1, and v2 from rho11, c1, and d1 such that tau11, u1, // and v1 determine an up/downdating UT Householder transform H such that // applying H from the left to the column vector consisting of rho11, c1, // and d1 annihilates the entries in c1 and d1 (and updates rho11). FLA_Househ3UD_UT( rho11, c1, d1, tau11 ); // / r12t \ / r12t \ // | C2 | = H' | C2 | // \ D2 / \ D2 / // // where H is formed from tau11, u1 (stored in c1) and v1 (stored in d1). FLA_Apply_HUD_UT( FLA_LEFT, tau11, w12t, r12t, c1, C2, d1, D2 ); /*------------------------------------------------------------*/ FLA_Cont_with_3x3_to_2x2( &RTL, /**/ &RTR, R00, r01, /**/ R02, r10t, rho11, /**/ r12t, /* ************** */ /* ************************ */ &RBL, /**/ &RBR, R20, r21, /**/ R22, FLA_TL ); FLA_Cont_with_1x3_to_1x2( &CL, /**/ &CR, C0, c1, /**/ C2, FLA_LEFT ); FLA_Cont_with_1x3_to_1x2( &DL, /**/ &DR, D0, d1, /**/ D2, FLA_LEFT ); FLA_Cont_with_3x3_to_2x2( &TTL, /**/ &TTR, T00, t01, /**/ T02, t10t, tau11, /**/ w12t, /* ************** */ /* ********************** */ &TBL, /**/ &TBR, T20, t21, /**/ T22, FLA_TL ); } // T = I + C' * C - D' * D; // T = striu( T ) + 0.5*diag( T ); // NOTE: The only reason this 'herk' method of computing T works is because // up-and-downdating is used to up/downdate a system that is being solved // either by QR factorization, or the method of normal equations (Cholesky // factorization on A' * A), and in either case, R will have a real diagonal. FLA_Set_to_identity( T ); FLA_Herk_external( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, FLA_ONE, C, FLA_ONE, T ); FLA_Herk_external( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE, FLA_MINUS_ONE, D, FLA_ONE, T ); FLA_Scale_diag( FLA_NO_CONJUGATE, FLA_ONE_HALF, T ); return FLA_SUCCESS; }