libflame revision_anchor
Functions
FLA_UDdate_UT_vars.h File Reference

(r)

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)

Function Documentation

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 bli_cherk(), bli_cident(), bli_cscalediag(), 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_Obj_set_to_identity( T );
  bli_cident( mn_RT, buff_T, rs_T, cs_T );

  // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE,
  //           FLA_ONE, C, FLA_ONE, T );
  bli_cherk( BLIS_UPPER_TRIANGULAR,
             BLIS_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 );
  bli_cherk( BLIS_UPPER_TRIANGULAR,
             BLIS_CONJ_TRANSPOSE,
             mn_RT,
             m_D,
             buff_m1,
             buff_D, rs_D, cs_D,
             buff_1,
             buff_T, rs_T, cs_T );
 
  // FLA_Obj_scale_diagonal( FLA_NO_CONJUGATE, FLA_ONE_HALF, T );
  bli_cscalediag( BLIS_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 bli_dident(), bli_dscalediag(), bli_dsyrk(), 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_Obj_set_to_identity( T );
  bli_dident( mn_RT, buff_T, rs_T, cs_T );

  // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE,
  //           FLA_ONE, C, FLA_ONE, T );
  bli_dsyrk( BLIS_UPPER_TRIANGULAR,
             BLIS_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 );
  bli_dsyrk( BLIS_UPPER_TRIANGULAR,
             BLIS_CONJ_TRANSPOSE,
             mn_RT,
             m_D,
             buff_m1,
             buff_D, rs_D, cs_D,
             buff_1,
             buff_T, rs_T, cs_T );
 
  // FLA_Obj_scale_diagonal( FLA_NO_CONJUGATE, FLA_ONE_HALF, T );
  bli_dscalediag( BLIS_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 bli_sident(), bli_sscalediag(), bli_ssyrk(), 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_Obj_set_to_identity( T );
  bli_sident( mn_RT, buff_T, rs_T, cs_T );

  // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE,
  //           FLA_ONE, C, FLA_ONE, T );
  bli_ssyrk( BLIS_UPPER_TRIANGULAR,
             BLIS_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 );
  bli_ssyrk( BLIS_UPPER_TRIANGULAR,
             BLIS_CONJ_TRANSPOSE,
             mn_RT,
             m_D,
             buff_m1,
             buff_D, rs_D, cs_D,
             buff_1,
             buff_T, rs_T, cs_T );
 
  // FLA_Obj_scale_diagonal( FLA_NO_CONJUGATE, FLA_ONE_HALF, T );
  bli_sscalediag( BLIS_NO_CONJUGATE,
                  0,
                  mn_RT,
                  mn_RT,
                  buff_half,
                  buff_T, rs_T, cs_T );

  return FLA_SUCCESS;
}
FLA_Error FLA_UDdate_UT_opt_var1 ( FLA_Obj  R,
FLA_Obj  C,
FLA_Obj  D,
FLA_Obj  T 
)

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 bli_zherk(), bli_zident(), bli_zscalediag(), 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_Obj_set_to_identity( T );
  bli_zident( mn_RT, buff_T, rs_T, cs_T );

  // FLA_Herk( FLA_UPPER_TRIANGULAR, FLA_CONJ_TRANSPOSE,
  //           FLA_ONE, C, FLA_ONE, T );
  bli_zherk( BLIS_UPPER_TRIANGULAR,
             BLIS_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 );
  bli_zherk( BLIS_UPPER_TRIANGULAR,
             BLIS_CONJ_TRANSPOSE,
             mn_RT,
             m_D,
             buff_m1,
             buff_D, rs_D, cs_D,
             buff_1,
             buff_T, rs_T, cs_T );
 
  // FLA_Obj_scale_diagonal( FLA_NO_CONJUGATE, FLA_ONE_HALF, T );
  bli_zscalediag( BLIS_NO_CONJUGATE,
                  0,
                  mn_RT,
                  mn_RT,
                  buff_half,
                  buff_T, rs_T, cs_T );

  return FLA_SUCCESS;
}
FLA_Error FLA_UDdate_UT_unb_var1 ( FLA_Obj  R,
FLA_Obj  C,
FLA_Obj  D,
FLA_Obj  T 
)

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_Obj_scale_diagonal(), FLA_Obj_set_to_identity(), FLA_ONE, FLA_ONE_HALF, FLA_Part_1x2(), FLA_Part_2x2(), FLA_Repart_1x2_to_1x3(), and FLA_Repart_2x2_to_3x3().

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_Obj_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_Obj_scale_diagonal( FLA_NO_CONJUGATE, FLA_ONE_HALF, T );

  return FLA_SUCCESS;
}