libflame revision_anchor
Functions
FLA_Lyap_n.h File Reference

(r)

Go to the source code of this file.

Functions

FLA_Error FLA_Lyap_n_unb_var1 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_unb_var2 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_unb_var3 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_unb_var4 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_blk_var1 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C, FLA_Obj scale, fla_lyap_t *cntl)
FLA_Error FLA_Lyap_n_blk_var2 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C, FLA_Obj scale, fla_lyap_t *cntl)
FLA_Error FLA_Lyap_n_blk_var3 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C, FLA_Obj scale, fla_lyap_t *cntl)
FLA_Error FLA_Lyap_n_blk_var4 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C, FLA_Obj scale, fla_lyap_t *cntl)
FLA_Error FLA_Lyap_n_opt_var1 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_ops_var1 (int m_AC, float *buff_sgn, float *buff_A, int rs_A, int cs_A, float *buff_W, int rs_W, int cs_W, float *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opd_var1 (int m_AC, double *buff_sgn, double *buff_A, int rs_A, int cs_A, double *buff_W, int rs_W, int cs_W, double *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opc_var1 (int m_AC, scomplex *buff_sgn, scomplex *buff_A, int rs_A, int cs_A, scomplex *buff_W, int rs_W, int cs_W, scomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opz_var1 (int m_AC, dcomplex *buff_sgn, dcomplex *buff_A, int rs_A, int cs_A, dcomplex *buff_W, int rs_W, int cs_W, dcomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opt_var2 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_ops_var2 (int m_AC, float *buff_sgn, float *buff_A, int rs_A, int cs_A, float *buff_W, int rs_W, int cs_W, float *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opd_var2 (int m_AC, double *buff_sgn, double *buff_A, int rs_A, int cs_A, double *buff_W, int rs_W, int cs_W, double *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opc_var2 (int m_AC, scomplex *buff_sgn, scomplex *buff_A, int rs_A, int cs_A, scomplex *buff_W, int rs_W, int cs_W, scomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opz_var2 (int m_AC, dcomplex *buff_sgn, dcomplex *buff_A, int rs_A, int cs_A, dcomplex *buff_W, int rs_W, int cs_W, dcomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opt_var3 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_ops_var3 (int m_AC, float *buff_sgn, float *buff_A, int rs_A, int cs_A, float *buff_W, int rs_W, int cs_W, float *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opd_var3 (int m_AC, double *buff_sgn, double *buff_A, int rs_A, int cs_A, double *buff_W, int rs_W, int cs_W, double *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opc_var3 (int m_AC, scomplex *buff_sgn, scomplex *buff_A, int rs_A, int cs_A, scomplex *buff_W, int rs_W, int cs_W, scomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opz_var3 (int m_AC, dcomplex *buff_sgn, dcomplex *buff_A, int rs_A, int cs_A, dcomplex *buff_W, int rs_W, int cs_W, dcomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opt_var4 (FLA_Obj isgn, FLA_Obj A, FLA_Obj C)
FLA_Error FLA_Lyap_n_ops_var4 (int m_AC, float *buff_sgn, float *buff_A, int rs_A, int cs_A, float *buff_W, int rs_W, int cs_W, float *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opd_var4 (int m_AC, double *buff_sgn, double *buff_A, int rs_A, int cs_A, double *buff_W, int rs_W, int cs_W, double *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opc_var4 (int m_AC, scomplex *buff_sgn, scomplex *buff_A, int rs_A, int cs_A, scomplex *buff_W, int rs_W, int cs_W, scomplex *buff_C, int rs_C, int cs_C)
FLA_Error FLA_Lyap_n_opz_var4 (int m_AC, dcomplex *buff_sgn, dcomplex *buff_A, int rs_A, int cs_A, dcomplex *buff_W, int rs_W, int cs_W, dcomplex *buff_C, int rs_C, int cs_C)

Function Documentation

FLA_Error FLA_Lyap_n_blk_var1 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C,
FLA_Obj  scale,
fla_lyap_t cntl 
)

References FLA_Cont_with_3x3_to_2x2(), FLA_Determine_blocksize(), FLA_Hemm_internal(), FLA_Her2k_internal(), FLA_Lyap_internal(), FLA_MINUS_ONE, FLA_Obj_length(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), and FLA_Sylv_internal().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00, A01, A02, 
          ABL,   ABR,      A10, A11, A12,
                           A20, A21, A22;
  FLA_Obj CTL,   CTR,      C00, C01, C02, 
          CBL,   CBR,      C10, C11, C12,
                           C20, C21, C22;
  dim_t   b;

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    b = FLA_Determine_blocksize( CTL, FLA_TL, FLA_Cntl_blocksize( cntl ) );

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00, &A01, /**/ &A02,
                                                &A10, &A11, /**/ &A12,
                        /* ************* */   /* ******************** */
                           ABL, /**/ ABR,       &A20, &A21, /**/ &A22,
                           b, b, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00, &C01, /**/ &C02,
                                                &C10, &C11, /**/ &C12,
                        /* ************* */   /* ******************** */
                           CBL, /**/ CBR,       &C20, &C21, /**/ &C22,
                           b, b, FLA_TL );

    /*------------------------------------------------------------*/

    // C12 = isgn * C12 - A12 * C22;
    // C12 = sylv( A11, A22', C12 );
    FLA_Hemm_internal( FLA_RIGHT, FLA_UPPER_TRIANGULAR,
                       FLA_MINUS_ONE, C22, A12, isgn, C12,
                       FLA_Cntl_sub_hemm( cntl ) );
    FLA_Sylv_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_ONE, A11, A22, C12, scale,
                       FLA_Cntl_sub_sylv( cntl ) );

    // C11 = isgn * C11 - A12 * C12' - C12 * A12';
    FLA_Her2k_internal( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE,
                        FLA_MINUS_ONE, A12, C12, isgn, C11,
                        FLA_Cntl_sub_her2k( cntl ) );

    // C11 = lyap_n( A11, C11 );
    FLA_Lyap_internal( FLA_NO_TRANSPOSE, FLA_ONE, A11, C11, scale,
                       FLA_Cntl_sub_lyap( cntl ) );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00, /**/ A01, A02,
                            /* ************** */  /* ****************** */
                                                     A10, /**/ A11, A12,
                              &ABL, /**/ &ABR,       A20, /**/ A21, A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00, /**/ C01, C02,
                            /* ************** */  /* ****************** */
                                                     C10, /**/ C11, C12,
                              &CBL, /**/ &CBR,       C20, /**/ C21, C22,
                              FLA_BR );
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_blk_var2 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C,
FLA_Obj  scale,
fla_lyap_t cntl 
)

References FLA_Cont_with_3x3_to_2x2(), FLA_Determine_blocksize(), FLA_Gemm_internal(), FLA_Hemm_internal(), FLA_Her2k_internal(), FLA_Lyap_internal(), FLA_MINUS_ONE, FLA_Obj_length(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), and FLA_Sylv_internal().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00, A01, A02, 
          ABL,   ABR,      A10, A11, A12,
                           A20, A21, A22;
  FLA_Obj CTL,   CTR,      C00, C01, C02, 
          CBL,   CBR,      C10, C11, C12,
                           C20, C21, C22;
  dim_t   b;

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    b = FLA_Determine_blocksize( CTL, FLA_TL, FLA_Cntl_blocksize( cntl ) );

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00, &A01, /**/ &A02,
                                                &A10, &A11, /**/ &A12,
                        /* ************* */   /* ******************** */
                           ABL, /**/ ABR,       &A20, &A21, /**/ &A22,
                           b, b, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00, &C01, /**/ &C02,
                                                &C10, &C11, /**/ &C12,
                        /* ************* */   /* ******************** */
                           CBL, /**/ CBR,       &C20, &C21, /**/ &C22,
                           b, b, FLA_TL );

    /*------------------------------------------------------------*/

    // C12 = sylv( A11, A22', C12 );
    FLA_Sylv_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_ONE, A11, A22, C12, scale,
                       FLA_Cntl_sub_sylv( cntl ) );
  
    // C11 = isgn * C11 - A12 * C12' - C12 * A12';
    // C11 = lyap_n( A11, C11 );
    FLA_Her2k_internal( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE,
                        FLA_MINUS_ONE, A12, C12, isgn, C11,
                        FLA_Cntl_sub_her2k( cntl ) );
    FLA_Lyap_internal( FLA_NO_TRANSPOSE, FLA_ONE, A11, C11, scale,
                       FLA_Cntl_sub_lyap( cntl ) );

    // C02 = C02 - A01 * C12;
    FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_NO_TRANSPOSE,
                       FLA_MINUS_ONE, A01, C12, FLA_ONE, C02,
                       FLA_Cntl_sub_gemm1( cntl ) );

    // C01 = isgn * C01 - A01 * C11;
    // C01 = C01 - A02 * C12';
    FLA_Hemm_internal( FLA_RIGHT, FLA_UPPER_TRIANGULAR,
                       FLA_MINUS_ONE, C11, A01, isgn, C01,
                       FLA_Cntl_sub_hemm( cntl ) );
    FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_MINUS_ONE, A02, C12, FLA_ONE, C01,
                       FLA_Cntl_sub_gemm2( cntl ) );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00, /**/ A01, A02,
                            /* ************** */  /* ****************** */
                                                     A10, /**/ A11, A12,
                              &ABL, /**/ &ABR,       A20, /**/ A21, A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00, /**/ C01, C02,
                            /* ************** */  /* ****************** */
                                                     C10, /**/ C11, C12,
                              &CBL, /**/ &CBR,       C20, /**/ C21, C22,
                              FLA_BR );
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_blk_var3 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C,
FLA_Obj  scale,
fla_lyap_t cntl 
)

References FLA_Cont_with_3x3_to_2x2(), FLA_Determine_blocksize(), FLA_Gemm_internal(), FLA_Hemm_internal(), FLA_Her2k_internal(), FLA_Lyap_internal(), FLA_MINUS_ONE, FLA_Obj_length(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), and FLA_Sylv_internal().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00, A01, A02, 
          ABL,   ABR,      A10, A11, A12,
                           A20, A21, A22;
  FLA_Obj CTL,   CTR,      C00, C01, C02, 
          CBL,   CBR,      C10, C11, C12,
                           C20, C21, C22;
  dim_t   b;

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    b = FLA_Determine_blocksize( CTL, FLA_TL, FLA_Cntl_blocksize( cntl ) );

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00, &A01, /**/ &A02,
                                                &A10, &A11, /**/ &A12,
                        /* ************* */   /* ******************** */
                           ABL, /**/ ABR,       &A20, &A21, /**/ &A22,
                           b, b, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00, &C01, /**/ &C02,
                                                &C10, &C11, /**/ &C12,
                        /* ************* */   /* ******************** */
                           CBL, /**/ CBR,       &C20, &C21, /**/ &C22,
                           b, b, FLA_TL );

    /*------------------------------------------------------------*/

    // C11 = isgn * C11 - A12 * C12' - C12 * A12';
    // C11 = lyap_n( A11, C11 );
    FLA_Her2k_internal( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE,
                        FLA_MINUS_ONE, A12, C12, isgn, C11,
                        FLA_Cntl_sub_her2k( cntl ) );
    FLA_Lyap_internal( FLA_NO_TRANSPOSE, FLA_ONE, A11, C11, scale,
                       FLA_Cntl_sub_lyap( cntl ) );

    // C01 = isgn * C01 - C02 * A12' - A02 * C12';
    FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_MINUS_ONE, C02, A12, isgn, C01,
                       FLA_Cntl_sub_gemm1( cntl ) );
    FLA_Gemm_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_MINUS_ONE, A02, C12, FLA_ONE, C01,
                       FLA_Cntl_sub_gemm2( cntl ) );

    // C01 = C01 - A01 * C11;
    // C01 = sylv( A00, A11', C01 );
    FLA_Hemm_internal( FLA_RIGHT, FLA_UPPER_TRIANGULAR,
                       FLA_MINUS_ONE, C11, A01, FLA_ONE, C01,
                       FLA_Cntl_sub_hemm( cntl ) );
    FLA_Sylv_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_ONE, A00, A11, C01, scale,
                       FLA_Cntl_sub_sylv( cntl ) );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00, /**/ A01, A02,
                            /* ************** */  /* ****************** */
                                                     A10, /**/ A11, A12,
                              &ABL, /**/ &ABR,       A20, /**/ A21, A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00, /**/ C01, C02,
                            /* ************** */  /* ****************** */
                                                     C10, /**/ C11, C12,
                              &CBL, /**/ &CBR,       C20, /**/ C21, C22,
                              FLA_BR );
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_blk_var4 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C,
FLA_Obj  scale,
fla_lyap_t cntl 
)

References FLA_Cont_with_3x3_to_2x2(), FLA_Determine_blocksize(), FLA_Hemm_internal(), FLA_Her2k_internal(), FLA_Lyap_internal(), FLA_MINUS_ONE, FLA_Obj_length(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), FLA_Scal_internal(), and FLA_Sylv_internal().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00, A01, A02, 
          ABL,   ABR,      A10, A11, A12,
                           A20, A21, A22;
  FLA_Obj CTL,   CTR,      C00, C01, C02, 
          CBL,   CBR,      C10, C11, C12,
                           C20, C21, C22;
  dim_t   b;

  // C = isgn * C;
  FLA_Scal_internal( isgn, C,
                     FLA_Cntl_sub_scal( cntl ) );

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    b = FLA_Determine_blocksize( CTL, FLA_TL, FLA_Cntl_blocksize( cntl ) );

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00, &A01, /**/ &A02,
                                                &A10, &A11, /**/ &A12,
                        /* ************* */   /* ******************** */
                           ABL, /**/ ABR,       &A20, &A21, /**/ &A22,
                           b, b, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00, &C01, /**/ &C02,
                                                &C10, &C11, /**/ &C12,
                        /* ************* */   /* ******************** */
                           CBL, /**/ CBR,       &C20, &C21, /**/ &C22,
                           b, b, FLA_TL );

    /*------------------------------------------------------------*/

    // C11 = lyap_n( A11, C11 );
    FLA_Lyap_internal( FLA_NO_TRANSPOSE, FLA_ONE, A11, C11, scale,
                       FLA_Cntl_sub_lyap( cntl ) );

    // C01 = C01 - A01 * C11;
    // C01 = sylv( A00, A11', C01 );
    FLA_Hemm_internal( FLA_RIGHT, FLA_UPPER_TRIANGULAR,
                       FLA_MINUS_ONE, C11, A01, FLA_ONE, C01,
                       FLA_Cntl_sub_hemm( cntl ) );
    FLA_Sylv_internal( FLA_NO_TRANSPOSE, FLA_CONJ_TRANSPOSE,
                       FLA_ONE, A00, A11, C01, scale,
                       FLA_Cntl_sub_sylv( cntl ) );

    // C00 = C00 - A01 * C01' - C01 * A01';
    FLA_Her2k_internal( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE,
                        FLA_MINUS_ONE, A01, C01, FLA_ONE, C00,
                        FLA_Cntl_sub_her2k( cntl ) );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00, /**/ A01, A02,
                            /* ************** */  /* ****************** */
                                                     A10, /**/ A11, A12,
                              &ABL, /**/ &ABR,       A20, /**/ A21, A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00, /**/ C01, C02,
                            /* ************** */  /* ****************** */
                                                     C10, /**/ C11, C12,
                              &CBL, /**/ &CBR,       C20, /**/ C21, C22,
                              FLA_BR );
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opc_var1 ( int  m_AC,
scomplex buff_sgn,
scomplex buff_A,
int  rs_A,
int  cs_A,
scomplex buff_W,
int  rs_W,
int  cs_W,
scomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_ccopymrt(), bli_cdot2s(), bli_chemv(), bli_cscalm(), bli_cshiftdiag(), bli_ctrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var1().

{
  scomplex* buff_1   = FLA_COMPLEX_PTR( FLA_ONE );
  scomplex* buff_m1  = FLA_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_cscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    scomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    scomplex* a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    scomplex* A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    scomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    scomplex* c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;
    scomplex* C22      = buff_C + (i+1)*cs_C + (i+1)*rs_C;

    scomplex* W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    scomplex  omega;

    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Hemvc( FLA_UPPER_TRIANGULAR, FLA_CONJUGATE, FLA_MINUS_ONE, C22, a12t, FLA_ONE, c12t );
    bli_chemv( BLIS_UPPER_TRIANGULAR,
               BLIS_CONJUGATE,
               m_ahead,
               buff_m1,
               C22,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c12t, cs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );
    bli_ccopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_cshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_ctrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22,  rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_cdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_ccopyconj( alpha11, &omega );
    bli_cadd3( alpha11, &omega, &omega );
    bli_cinvscals( &omega, gamma11 );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opc_var2 ( int  m_AC,
scomplex buff_sgn,
scomplex buff_A,
int  rs_A,
int  cs_A,
scomplex buff_W,
int  rs_W,
int  cs_W,
scomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_caxpysv(), bli_ccopymrt(), bli_cdot2s(), bli_cgemv(), bli_cger(), bli_cscalm(), bli_cshiftdiag(), bli_ctrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var2().

{
  scomplex* buff_1   = FLA_COMPLEX_PTR( FLA_ONE );
  scomplex* buff_m1  = FLA_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_cscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    scomplex* a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    scomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    scomplex* A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    scomplex* a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    scomplex* A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    scomplex* c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    scomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    scomplex* C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    scomplex* c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    scomplex* W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    scomplex  omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );;
    bli_ccopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_cshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_ctrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22, rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_cdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_ccopyconj( alpha11, &omega );
    bli_cadd3( alpha11, &omega, &omega );
    bli_cinvscals( &omega, gamma11 );

    // FLA_Ger( FLA_MINUS_ONE, a01, c12t, C02 );
    bli_cger( BLIS_NO_CONJUGATE,
              BLIS_NO_CONJUGATE,
              m_behind,
              m_ahead,
              buff_m1,
              a01,  rs_A,
              c12t, cs_C,
              C02,  rs_C, cs_C );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 ););
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_caxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_cgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opc_var3 ( int  m_AC,
scomplex buff_sgn,
scomplex buff_A,
int  rs_A,
int  cs_A,
scomplex buff_W,
int  rs_W,
int  cs_W,
scomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_caxpysv(), bli_ccopymrt(), bli_cdot2s(), bli_cgemv(), bli_cscalm(), bli_cshiftdiag(), bli_ctrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var3().

{
  scomplex* buff_1   = FLA_COMPLEX_PTR( FLA_ONE );
  scomplex* buff_m1  = FLA_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_cscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    scomplex* A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    scomplex* a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    scomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    scomplex* A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    scomplex* a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;

    scomplex* c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    scomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    scomplex* C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    scomplex* c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    scomplex* W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    scomplex  omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_cdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_ccopyconj( alpha11, &omega );
    bli_cadd3( alpha11, &omega, &omega );
    bli_cinvscals( &omega, gamma11 );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, C02, a12t, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_caxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_cgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               C02,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c01,  rs_C );

    bli_cgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_ccopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_cshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_ctrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opc_var4 ( int  m_AC,
scomplex buff_sgn,
scomplex buff_A,
int  rs_A,
int  cs_A,
scomplex buff_W,
int  rs_W,
int  cs_W,
scomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_caxpysv(), bli_ccopymrt(), bli_cher2(), bli_cscalm(), bli_cshiftdiag(), bli_ctrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var4().

{
  scomplex* buff_1   = FLA_COMPLEX_PTR( FLA_ONE );
  scomplex* buff_m1  = FLA_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_cscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    scomplex* A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    scomplex* a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    scomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;

    scomplex* C00      = buff_C + (0  )*cs_C + (0  )*rs_C;
    scomplex* c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    scomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;

    scomplex* W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    scomplex  omega;

    int       m_behind = i;

    /*------------------------------------------------------------*/

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_ccopyconj( alpha11, &omega );
    bli_cadd3( alpha11, &omega, &omega );
    bli_cinvscals( &omega, gamma11 );
  
    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    bli_caxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    // FLA_Copyrt( BLIS_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_ccopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_cshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_ctrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );
  
    // FLA_Her2( FLA_UPPER_TRIANGULAR, FLA_MINUS_ONE, a01, c01, C00 );
    bli_cher2( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_CONJUGATE,
               m_behind,
               buff_m1,
               a01, rs_A,
               c01, rs_C,
               C00, rs_C, cs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opd_var1 ( int  m_AC,
double *  buff_sgn,
double *  buff_A,
int  rs_A,
int  cs_A,
double *  buff_W,
int  rs_W,
int  cs_W,
double *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_dcopymrt(), bli_ddot2s(), bli_dhemv(), bli_dscalm(), bli_dshiftdiag(), bli_dtrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var1().

{
  double*   buff_1   = FLA_DOUBLE_PTR( FLA_ONE );
  double*   buff_m1  = FLA_DOUBLE_PTR( FLA_MINUS_ONE );
  int       i;

  bli_dscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    double*   alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    double*   a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    double*   A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    double*   gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    double*   c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;
    double*   C22      = buff_C + (i+1)*cs_C + (i+1)*rs_C;

    double*   W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    double    omega;

    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Hemvc( FLA_UPPER_TRIANGULAR, FLA_CONJUGATE, FLA_MINUS_ONE, C22, a12t, FLA_ONE, c12t );
    bli_dhemv( BLIS_UPPER_TRIANGULAR,
               BLIS_CONJUGATE,
               m_ahead,
               buff_m1,
               C22,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c12t, cs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );
    bli_dcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_dshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_dtrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22,  rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_ddot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_dcopyconj( alpha11, &omega );
    bli_dadd3( alpha11, &omega, &omega );
    bli_dinvscals( &omega, gamma11 );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opd_var2 ( int  m_AC,
double *  buff_sgn,
double *  buff_A,
int  rs_A,
int  cs_A,
double *  buff_W,
int  rs_W,
int  cs_W,
double *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_daxpysv(), bli_dcopymrt(), bli_ddot2s(), bli_dgemv(), bli_dger(), bli_dscalm(), bli_dshiftdiag(), bli_dtrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var2().

{
  double*   buff_1   = FLA_DOUBLE_PTR( FLA_ONE );
  double*   buff_m1  = FLA_DOUBLE_PTR( FLA_MINUS_ONE );
  int       i;

  bli_dscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    double*   a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    double*   alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    double*   A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    double*   a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    double*   A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    double*   c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    double*   gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    double*   C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    double*   c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    double*   W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    double    omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );;
    bli_dcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_dshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_dtrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22, rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_ddot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_dcopyconj( alpha11, &omega );
    bli_dadd3( alpha11, &omega, &omega );
    bli_dinvscals( &omega, gamma11 );

    // FLA_Ger( FLA_MINUS_ONE, a01, c12t, C02 );
    bli_dger( BLIS_NO_CONJUGATE,
              BLIS_NO_CONJUGATE,
              m_behind,
              m_ahead,
              buff_m1,
              a01,  rs_A,
              c12t, cs_C,
              C02,  rs_C, cs_C );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 ););
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_daxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_dgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opd_var3 ( int  m_AC,
double *  buff_sgn,
double *  buff_A,
int  rs_A,
int  cs_A,
double *  buff_W,
int  rs_W,
int  cs_W,
double *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_daxpysv(), bli_dcopymrt(), bli_ddot2s(), bli_dgemv(), bli_dscalm(), bli_dshiftdiag(), bli_dtrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var3().

{
  double*   buff_1   = FLA_DOUBLE_PTR( FLA_ONE );
  double*   buff_m1  = FLA_DOUBLE_PTR( FLA_MINUS_ONE );
  int       i;

  bli_dscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    double*   A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    double*   a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    double*   alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    double*   A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    double*   a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;

    double*   c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    double*   gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    double*   C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    double*   c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    double*   W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    double    omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_ddot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_dcopyconj( alpha11, &omega );
    bli_dadd3( alpha11, &omega, &omega );
    bli_dinvscals( &omega, gamma11 );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, C02, a12t, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_daxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_dgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               C02,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c01,  rs_C );

    bli_dgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_dcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_dshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_dtrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opd_var4 ( int  m_AC,
double *  buff_sgn,
double *  buff_A,
int  rs_A,
int  cs_A,
double *  buff_W,
int  rs_W,
int  cs_W,
double *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_daxpysv(), bli_dcopymrt(), bli_dher2(), bli_dscalm(), bli_dshiftdiag(), bli_dtrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var4().

{
  double*   buff_1   = FLA_DOUBLE_PTR( FLA_ONE );
  double*   buff_m1  = FLA_DOUBLE_PTR( FLA_MINUS_ONE );
  int       i;

  bli_dscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    double*   A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    double*   a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    double*   alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;

    double*   C00      = buff_C + (0  )*cs_C + (0  )*rs_C;
    double*   c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    double*   gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;

    double*   W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    double    omega;

    int       m_behind = i;

    /*------------------------------------------------------------*/

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_dcopyconj( alpha11, &omega );
    bli_dadd3( alpha11, &omega, &omega );
    bli_dinvscals( &omega, gamma11 );
  
    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    bli_daxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    // FLA_Copyrt( BLIS_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_dcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_dshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_dtrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );
  
    // FLA_Her2( FLA_UPPER_TRIANGULAR, FLA_MINUS_ONE, a01, c01, C00 );
    bli_dher2( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_CONJUGATE,
               m_behind,
               buff_m1,
               a01, rs_A,
               c01, rs_C,
               C00, rs_C, cs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_ops_var1 ( int  m_AC,
float *  buff_sgn,
float *  buff_A,
int  rs_A,
int  cs_A,
float *  buff_W,
int  rs_W,
int  cs_W,
float *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_scopymrt(), bli_sdot2s(), bli_shemv(), bli_sscalm(), bli_sshiftdiag(), bli_strsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var1().

{
  float*    buff_1   = FLA_FLOAT_PTR( FLA_ONE );
  float*    buff_m1  = FLA_FLOAT_PTR( FLA_MINUS_ONE );
  int       i;

  bli_sscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    float*    alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    float*    a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    float*    A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    float*    gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    float*    c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;
    float*    C22      = buff_C + (i+1)*cs_C + (i+1)*rs_C;

    float*    W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    float     omega;

    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Hemvc( FLA_UPPER_TRIANGULAR, FLA_CONJUGATE, FLA_MINUS_ONE, C22, a12t, FLA_ONE, c12t );
    bli_shemv( BLIS_UPPER_TRIANGULAR,
               BLIS_CONJUGATE,
               m_ahead,
               buff_m1,
               C22,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c12t, cs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );
    bli_scopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_sshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_strsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22,  rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_sdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_scopyconj( alpha11, &omega );
    bli_sadd3( alpha11, &omega, &omega );
    bli_sinvscals( &omega, gamma11 );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_ops_var2 ( int  m_AC,
float *  buff_sgn,
float *  buff_A,
int  rs_A,
int  cs_A,
float *  buff_W,
int  rs_W,
int  cs_W,
float *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_saxpysv(), bli_scopymrt(), bli_sdot2s(), bli_sgemv(), bli_sger(), bli_sscalm(), bli_sshiftdiag(), bli_strsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var2().

{
  float*    buff_1   = FLA_FLOAT_PTR( FLA_ONE );
  float*    buff_m1  = FLA_FLOAT_PTR( FLA_MINUS_ONE );
  int       i;

  bli_sscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    float*    a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    float*    alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    float*    A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    float*    a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    float*    A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    float*    c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    float*    gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    float*    C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    float*    c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    float*    W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    float     omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );;
    bli_scopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_sshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_strsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22, rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_sdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_scopyconj( alpha11, &omega );
    bli_sadd3( alpha11, &omega, &omega );
    bli_sinvscals( &omega, gamma11 );

    // FLA_Ger( FLA_MINUS_ONE, a01, c12t, C02 );
    bli_sger( BLIS_NO_CONJUGATE,
              BLIS_NO_CONJUGATE,
              m_behind,
              m_ahead,
              buff_m1,
              a01,  rs_A,
              c12t, cs_C,
              C02,  rs_C, cs_C );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 ););
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_saxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_sgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_ops_var3 ( int  m_AC,
float *  buff_sgn,
float *  buff_A,
int  rs_A,
int  cs_A,
float *  buff_W,
int  rs_W,
int  cs_W,
float *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_saxpysv(), bli_scopymrt(), bli_sdot2s(), bli_sgemv(), bli_sscalm(), bli_sshiftdiag(), bli_strsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var3().

{
  float*    buff_1   = FLA_FLOAT_PTR( FLA_ONE );
  float*    buff_m1  = FLA_FLOAT_PTR( FLA_MINUS_ONE );
  int       i;

  bli_sscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    float*    A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    float*    a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    float*    alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    float*    A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    float*    a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;

    float*    c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    float*    gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    float*    C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    float*    c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    float*    W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    float     omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_sdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_scopyconj( alpha11, &omega );
    bli_sadd3( alpha11, &omega, &omega );
    bli_sinvscals( &omega, gamma11 );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, C02, a12t, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_saxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_sgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               C02,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c01,  rs_C );

    bli_sgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_scopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_sshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_strsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_ops_var4 ( int  m_AC,
float *  buff_sgn,
float *  buff_A,
int  rs_A,
int  cs_A,
float *  buff_W,
int  rs_W,
int  cs_W,
float *  buff_C,
int  rs_C,
int  cs_C 
)

References bli_saxpysv(), bli_scopymrt(), bli_sher2(), bli_sscalm(), bli_sshiftdiag(), bli_strsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var4().

{
  float*    buff_1   = FLA_FLOAT_PTR( FLA_ONE );
  float*    buff_m1  = FLA_FLOAT_PTR( FLA_MINUS_ONE );
  int       i;

  bli_sscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    float*    A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    float*    a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    float*    alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;

    float*    C00      = buff_C + (0  )*cs_C + (0  )*rs_C;
    float*    c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    float*    gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;

    float*    W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    float     omega;

    int       m_behind = i;

    /*------------------------------------------------------------*/

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_scopyconj( alpha11, &omega );
    bli_sadd3( alpha11, &omega, &omega );
    bli_sinvscals( &omega, gamma11 );
  
    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    bli_saxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    // FLA_Copyrt( BLIS_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_scopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_sshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_strsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );
  
    // FLA_Her2( FLA_UPPER_TRIANGULAR, FLA_MINUS_ONE, a01, c01, C00 );
    bli_sher2( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_CONJUGATE,
               m_behind,
               buff_m1,
               a01, rs_A,
               c01, rs_C,
               C00, rs_C, cs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opt_var1 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Lyap_n_opc_var1(), FLA_Lyap_n_opd_var1(), FLA_Lyap_n_ops_var1(), FLA_Lyap_n_opz_var1(), FLA_Obj_col_stride(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), and FLA_Obj_row_stride().

Referenced by FLA_Lyap_n().

{
  FLA_Datatype datatype;
  int          m_AC;
  int          rs_A, cs_A;
  int          rs_W, cs_W;
  int          rs_C, cs_C;
  FLA_Obj      W;

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );

  datatype = FLA_Obj_datatype( A );

  m_AC     = FLA_Obj_length( A );

  rs_A     = FLA_Obj_row_stride( A );
  cs_A     = FLA_Obj_col_stride( A );

  rs_W     = FLA_Obj_row_stride( W );
  cs_W     = FLA_Obj_col_stride( W );

  rs_C     = FLA_Obj_row_stride( C );
  cs_C     = FLA_Obj_col_stride( C );
 
  switch ( datatype )
  {
    case FLA_FLOAT:
    {
      float* buff_A   = FLA_FLOAT_PTR( A );
      float* buff_W   = FLA_FLOAT_PTR( W );
      float* buff_C   = FLA_FLOAT_PTR( C );
      float* buff_sgn = FLA_FLOAT_PTR( isgn );

      FLA_Lyap_n_ops_var1( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE:
    {
      double* buff_A   = FLA_DOUBLE_PTR( A );
      double* buff_W   = FLA_DOUBLE_PTR( W );
      double* buff_C   = FLA_DOUBLE_PTR( C );
      double* buff_sgn = FLA_DOUBLE_PTR( isgn );

      FLA_Lyap_n_opd_var1( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_COMPLEX:
    {
      scomplex* buff_A   = FLA_COMPLEX_PTR( A );
      scomplex* buff_W   = FLA_COMPLEX_PTR( W );
      scomplex* buff_C   = FLA_COMPLEX_PTR( C );
      scomplex* buff_sgn = FLA_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opc_var1( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE_COMPLEX:
    {
      dcomplex* buff_A   = FLA_DOUBLE_COMPLEX_PTR( A );
      dcomplex* buff_W   = FLA_DOUBLE_COMPLEX_PTR( W );
      dcomplex* buff_C   = FLA_DOUBLE_COMPLEX_PTR( C );
      dcomplex* buff_sgn = FLA_DOUBLE_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opz_var1( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }
  }

  FLA_Obj_free( &W );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opt_var2 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Lyap_n_opc_var2(), FLA_Lyap_n_opd_var2(), FLA_Lyap_n_ops_var2(), FLA_Lyap_n_opz_var2(), FLA_Obj_col_stride(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), and FLA_Obj_row_stride().

Referenced by FLA_Lyap_n().

{
  FLA_Datatype datatype;
  int          m_AC;
  int          rs_A, cs_A;
  int          rs_W, cs_W;
  int          rs_C, cs_C;
  FLA_Obj      W;

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );

  datatype = FLA_Obj_datatype( A );

  m_AC     = FLA_Obj_length( A );

  rs_A     = FLA_Obj_row_stride( A );
  cs_A     = FLA_Obj_col_stride( A );

  rs_W     = FLA_Obj_row_stride( W );
  cs_W     = FLA_Obj_col_stride( W );

  rs_C     = FLA_Obj_row_stride( C );
  cs_C     = FLA_Obj_col_stride( C );
 
  switch ( datatype )
  {
    case FLA_FLOAT:
    {
      float* buff_A   = FLA_FLOAT_PTR( A );
      float* buff_W   = FLA_FLOAT_PTR( W );
      float* buff_C   = FLA_FLOAT_PTR( C );
      float* buff_sgn = FLA_FLOAT_PTR( isgn );

      FLA_Lyap_n_ops_var2( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE:
    {
      double* buff_A   = FLA_DOUBLE_PTR( A );
      double* buff_W   = FLA_DOUBLE_PTR( W );
      double* buff_C   = FLA_DOUBLE_PTR( C );
      double* buff_sgn = FLA_DOUBLE_PTR( isgn );

      FLA_Lyap_n_opd_var2( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_COMPLEX:
    {
      scomplex* buff_A   = FLA_COMPLEX_PTR( A );
      scomplex* buff_W   = FLA_COMPLEX_PTR( W );
      scomplex* buff_C   = FLA_COMPLEX_PTR( C );
      scomplex* buff_sgn = FLA_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opc_var2( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE_COMPLEX:
    {
      dcomplex* buff_A   = FLA_DOUBLE_COMPLEX_PTR( A );
      dcomplex* buff_W   = FLA_DOUBLE_COMPLEX_PTR( W );
      dcomplex* buff_C   = FLA_DOUBLE_COMPLEX_PTR( C );
      dcomplex* buff_sgn = FLA_DOUBLE_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opz_var2( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }
  }

  FLA_Obj_free( &W );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opt_var3 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Lyap_n_opc_var3(), FLA_Lyap_n_opd_var3(), FLA_Lyap_n_ops_var3(), FLA_Lyap_n_opz_var3(), FLA_Obj_col_stride(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), and FLA_Obj_row_stride().

Referenced by FLA_Lyap_n().

{
  FLA_Datatype datatype;
  int          m_AC;
  int          rs_A, cs_A;
  int          rs_W, cs_W;
  int          rs_C, cs_C;
  FLA_Obj      W;

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );

  datatype = FLA_Obj_datatype( A );

  m_AC     = FLA_Obj_length( A );

  rs_A     = FLA_Obj_row_stride( A );
  cs_A     = FLA_Obj_col_stride( A );

  rs_W     = FLA_Obj_row_stride( W );
  cs_W     = FLA_Obj_col_stride( W );

  rs_C     = FLA_Obj_row_stride( C );
  cs_C     = FLA_Obj_col_stride( C );
 
  switch ( datatype )
  {
    case FLA_FLOAT:
    {
      float* buff_A   = FLA_FLOAT_PTR( A );
      float* buff_W   = FLA_FLOAT_PTR( W );
      float* buff_C   = FLA_FLOAT_PTR( C );
      float* buff_sgn = FLA_FLOAT_PTR( isgn );

      FLA_Lyap_n_ops_var3( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE:
    {
      double* buff_A   = FLA_DOUBLE_PTR( A );
      double* buff_W   = FLA_DOUBLE_PTR( W );
      double* buff_C   = FLA_DOUBLE_PTR( C );
      double* buff_sgn = FLA_DOUBLE_PTR( isgn );

      FLA_Lyap_n_opd_var3( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_COMPLEX:
    {
      scomplex* buff_A   = FLA_COMPLEX_PTR( A );
      scomplex* buff_W   = FLA_COMPLEX_PTR( W );
      scomplex* buff_C   = FLA_COMPLEX_PTR( C );
      scomplex* buff_sgn = FLA_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opc_var3( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE_COMPLEX:
    {
      dcomplex* buff_A   = FLA_DOUBLE_COMPLEX_PTR( A );
      dcomplex* buff_W   = FLA_DOUBLE_COMPLEX_PTR( W );
      dcomplex* buff_C   = FLA_DOUBLE_COMPLEX_PTR( C );
      dcomplex* buff_sgn = FLA_DOUBLE_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opz_var3( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }
  }

  FLA_Obj_free( &W );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opt_var4 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Lyap_n_opc_var4(), FLA_Lyap_n_opd_var4(), FLA_Lyap_n_ops_var4(), FLA_Lyap_n_opz_var4(), FLA_Obj_col_stride(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), and FLA_Obj_row_stride().

Referenced by FLA_Lyap_n().

{
  FLA_Datatype datatype;
  int          m_AC;
  int          rs_A, cs_A;
  int          rs_W, cs_W;
  int          rs_C, cs_C;
  FLA_Obj      W;

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );

  datatype = FLA_Obj_datatype( A );

  m_AC     = FLA_Obj_length( A );

  rs_A     = FLA_Obj_row_stride( A );
  cs_A     = FLA_Obj_col_stride( A );

  rs_W     = FLA_Obj_row_stride( W );
  cs_W     = FLA_Obj_col_stride( W );

  rs_C     = FLA_Obj_row_stride( C );
  cs_C     = FLA_Obj_col_stride( C );
 
  switch ( datatype )
  {
    case FLA_FLOAT:
    {
      float* buff_A   = FLA_FLOAT_PTR( A );
      float* buff_W   = FLA_FLOAT_PTR( W );
      float* buff_C   = FLA_FLOAT_PTR( C );
      float* buff_sgn = FLA_FLOAT_PTR( isgn );

      FLA_Lyap_n_ops_var4( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE:
    {
      double* buff_A   = FLA_DOUBLE_PTR( A );
      double* buff_W   = FLA_DOUBLE_PTR( W );
      double* buff_C   = FLA_DOUBLE_PTR( C );
      double* buff_sgn = FLA_DOUBLE_PTR( isgn );

      FLA_Lyap_n_opd_var4( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_COMPLEX:
    {
      scomplex* buff_A   = FLA_COMPLEX_PTR( A );
      scomplex* buff_W   = FLA_COMPLEX_PTR( W );
      scomplex* buff_C   = FLA_COMPLEX_PTR( C );
      scomplex* buff_sgn = FLA_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opc_var4( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }

    case FLA_DOUBLE_COMPLEX:
    {
      dcomplex* buff_A   = FLA_DOUBLE_COMPLEX_PTR( A );
      dcomplex* buff_W   = FLA_DOUBLE_COMPLEX_PTR( W );
      dcomplex* buff_C   = FLA_DOUBLE_COMPLEX_PTR( C );
      dcomplex* buff_sgn = FLA_DOUBLE_COMPLEX_PTR( isgn );

      FLA_Lyap_n_opz_var4( m_AC,
                           buff_sgn,
                           buff_A, rs_A, cs_A,
                           buff_W, rs_W, cs_W,
                           buff_C, rs_C, cs_C );

      break;
    }
  }

  FLA_Obj_free( &W );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opz_var1 ( int  m_AC,
dcomplex buff_sgn,
dcomplex buff_A,
int  rs_A,
int  cs_A,
dcomplex buff_W,
int  rs_W,
int  cs_W,
dcomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_zcopymrt(), bli_zdot2s(), bli_zhemv(), bli_zscalm(), bli_zshiftdiag(), bli_ztrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var1().

{
  dcomplex* buff_1   = FLA_DOUBLE_COMPLEX_PTR( FLA_ONE );
  dcomplex* buff_m1  = FLA_DOUBLE_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_zscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    dcomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    dcomplex* a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    dcomplex* A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    dcomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    dcomplex* c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;
    dcomplex* C22      = buff_C + (i+1)*cs_C + (i+1)*rs_C;

    dcomplex* W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    dcomplex  omega;

    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Hemvc( FLA_UPPER_TRIANGULAR, FLA_CONJUGATE, FLA_MINUS_ONE, C22, a12t, FLA_ONE, c12t );
    bli_zhemv( BLIS_UPPER_TRIANGULAR,
               BLIS_CONJUGATE,
               m_ahead,
               buff_m1,
               C22,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c12t, cs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );
    bli_zcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_zshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_ztrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22,  rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_zdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_zcopyconj( alpha11, &omega );
    bli_zadd3( alpha11, &omega, &omega );
    bli_zinvscals( &omega, gamma11 );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opz_var2 ( int  m_AC,
dcomplex buff_sgn,
dcomplex buff_A,
int  rs_A,
int  cs_A,
dcomplex buff_W,
int  rs_W,
int  cs_W,
dcomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_zaxpysv(), bli_zcopymrt(), bli_zdot2s(), bli_zgemv(), bli_zger(), bli_zscalm(), bli_zshiftdiag(), bli_ztrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var2().

{
  dcomplex* buff_1   = FLA_DOUBLE_COMPLEX_PTR( FLA_ONE );
  dcomplex* buff_m1  = FLA_DOUBLE_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_zscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    dcomplex* a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    dcomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    dcomplex* A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    dcomplex* a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;
    dcomplex* A22      = buff_A + (i+1)*cs_A + (i+1)*rs_A;

    dcomplex* c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    dcomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    dcomplex* C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    dcomplex* c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    dcomplex* W22      = buff_W + (i+1)*cs_W + (i+1)*rs_W;

    dcomplex  omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    // FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );;
    bli_zcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_CONJ_NO_TRANSPOSE,
                  m_ahead,
                  m_ahead,
                  A22, rs_A, cs_A,
                  W22, rs_W, cs_W );

    bli_zshiftdiag( BLIS_NO_CONJUGATE,
                    0,
                    m_ahead,
                    m_ahead,
                    alpha11,
                    W22, rs_W, cs_W );

    bli_ztrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_ahead,
               W22,  rs_W, cs_W,
               c12t, cs_C );

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_zdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_zcopyconj( alpha11, &omega );
    bli_zadd3( alpha11, &omega, &omega );
    bli_zinvscals( &omega, gamma11 );

    // FLA_Ger( FLA_MINUS_ONE, a01, c12t, C02 );
    bli_zger( BLIS_NO_CONJUGATE,
              BLIS_NO_CONJUGATE,
              m_behind,
              m_ahead,
              buff_m1,
              a01,  rs_A,
              c12t, cs_C,
              C02,  rs_C, cs_C );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 ););
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_zaxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_zgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opz_var3 ( int  m_AC,
dcomplex buff_sgn,
dcomplex buff_A,
int  rs_A,
int  cs_A,
dcomplex buff_W,
int  rs_W,
int  cs_W,
dcomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_zaxpysv(), bli_zcopymrt(), bli_zdot2s(), bli_zgemv(), bli_zscalm(), bli_zshiftdiag(), bli_ztrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var3().

{
  dcomplex* buff_1   = FLA_DOUBLE_COMPLEX_PTR( FLA_ONE );
  dcomplex* buff_m1  = FLA_DOUBLE_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_zscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    dcomplex* A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    dcomplex* a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    dcomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;
    dcomplex* A02      = buff_A + (i+1)*cs_A + (0  )*rs_A;
    dcomplex* a12t     = buff_A + (i+1)*cs_A + (i  )*rs_A;

    dcomplex* c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    dcomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;
    dcomplex* C02      = buff_C + (i+1)*cs_C + (0  )*rs_C;
    dcomplex* c12t     = buff_C + (i+1)*cs_C + (i  )*rs_C;

    dcomplex* W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    dcomplex  omega;

    int       m_behind = i;
    int       m_ahead  = m_AC - i - 1;

    /*------------------------------------------------------------*/

    // FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );
    bli_zdot2s( BLIS_CONJUGATE,
                m_ahead,
                buff_m1,
                a12t, cs_A,
                c12t, cs_C,
                buff_1,
                gamma11 );

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_zcopyconj( alpha11, &omega );
    bli_zadd3( alpha11, &omega, &omega );
    bli_zinvscals( &omega, gamma11 );

    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, C02, a12t, FLA_ONE, c01 );
    // FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );
    bli_zaxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    bli_zgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               C02,  rs_C, cs_C,
               a12t, cs_A,
               buff_1,
               c01,  rs_C );

    bli_zgemv( BLIS_NO_TRANSPOSE,
               BLIS_CONJUGATE,
               m_behind,
               m_ahead,
               buff_m1,
               A02,  rs_A, cs_A,
               c12t, cs_C,
               buff_1,
               c01,  rs_C );

    // FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_zcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_zshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_ztrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_opz_var4 ( int  m_AC,
dcomplex buff_sgn,
dcomplex buff_A,
int  rs_A,
int  cs_A,
dcomplex buff_W,
int  rs_W,
int  cs_W,
dcomplex buff_C,
int  rs_C,
int  cs_C 
)

References bli_zaxpysv(), bli_zcopymrt(), bli_zher2(), bli_zscalm(), bli_zshiftdiag(), bli_ztrsv(), FLA_MINUS_ONE, and FLA_ONE.

Referenced by FLA_Lyap_n_opt_var4().

{
  dcomplex* buff_1   = FLA_DOUBLE_COMPLEX_PTR( FLA_ONE );
  dcomplex* buff_m1  = FLA_DOUBLE_COMPLEX_PTR( FLA_MINUS_ONE );
  int       i;

  bli_zscalm( BLIS_NO_CONJUGATE,
              m_AC,
              m_AC,
              buff_sgn,
              buff_C, rs_C, cs_C );

  for ( i = m_AC - 1; i >= 0; --i )
  {
    dcomplex* A00      = buff_A + (0  )*cs_A + (0  )*rs_A;
    dcomplex* a01      = buff_A + (i  )*cs_A + (0  )*rs_A;
    dcomplex* alpha11  = buff_A + (i  )*cs_A + (i  )*rs_A;

    dcomplex* C00      = buff_C + (0  )*cs_C + (0  )*rs_C;
    dcomplex* c01      = buff_C + (i  )*cs_C + (0  )*rs_C;
    dcomplex* gamma11  = buff_C + (i  )*cs_C + (i  )*rs_C;

    dcomplex* W00      = buff_W + (0  )*cs_W + (0  )*rs_W;

    dcomplex  omega;

    int       m_behind = i;

    /*------------------------------------------------------------*/

    // FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    // FLA_Mult_add( FLA_ONE, alpha11, omega );
    // FLA_Inv_scal( omega, gamma11 );
    bli_zcopyconj( alpha11, &omega );
    bli_zadd3( alpha11, &omega, &omega );
    bli_zinvscals( &omega, gamma11 );
  
    // FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    bli_zaxpysv( m_behind,
                 buff_m1,
                 gamma11,
                 a01, rs_A,
                 buff_1,
                 c01, rs_C );

    // FLA_Copyrt( BLIS_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    // FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    // FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );
    bli_zcopymrt( BLIS_UPPER_TRIANGULAR,
                  BLIS_NO_TRANSPOSE,
                  m_behind,
                  m_behind,
                  A00, rs_A, cs_A,
                  W00, rs_W, cs_W );

    bli_zshiftdiag( BLIS_CONJUGATE,
                    0,
                    m_behind,
                    m_behind,
                    alpha11,
                    W00, rs_W, cs_W );

    bli_ztrsv( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_TRANSPOSE,
               BLIS_NONUNIT_DIAG,
               m_behind,
               W00, rs_W, cs_W,
               c01, rs_C );
  
    // FLA_Her2( FLA_UPPER_TRIANGULAR, FLA_MINUS_ONE, a01, c01, C00 );
    bli_zher2( BLIS_UPPER_TRIANGULAR,
               BLIS_NO_CONJUGATE,
               m_behind,
               buff_m1,
               a01, rs_A,
               c01, rs_C,
               C00, rs_C, cs_C );

    /*------------------------------------------------------------*/
  }

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_unb_var1 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Cont_with_3x3_to_2x2(), FLA_Copyrt(), FLA_Copyt(), FLA_Dot2cs(), FLA_Hemvc(), FLA_Inv_scal(), FLA_MINUS_ONE, FLA_Mult_add(), FLA_Obj_create(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), FLA_Obj_shift_diagonal(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), FLA_Scal(), and FLA_Trsv().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00,  a01,     A02, 
          ABL,   ABR,      a10t, alpha11, a12t,
                           A20,  a21,     A22;

  FLA_Obj CTL,   CTR,      C00,  c01,     C02, 
          CBL,   CBR,      c10t, gamma11, c12t,
                           C20,  c21,     C22;

  FLA_Obj WTL,   WTR,      W00,  w01,     W02, 
          WBL,   WBR,      w10t, omega11, w12t,
                           W20,  w21,     W22;

  FLA_Obj W, omega;

  FLA_Scal( isgn, C );

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );
  FLA_Obj_create( FLA_Obj_datatype( A ), 1, 1, 0, 0, &omega );

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  FLA_Part_2x2( W,    &WTL, &WTR,
                      &WBL, &WBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00,  &a01,     /**/ &A02,
                                                &a10t, &alpha11, /**/ &a12t,
                        /* ************* */   /* ************************** */
                           ABL, /**/ ABR,       &A20,  &a21,     /**/ &A22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00,  &c01,     /**/ &C02,
                                                &c10t, &gamma11, /**/ &c12t,
                        /* ************* */   /* ************************** */
                           CBL, /**/ CBR,       &C20,  &c21,     /**/ &C22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( WTL, /**/ WTR,       &W00,  &w01,     /**/ &W02,
                                                &w10t, &omega11, /**/ &w12t,
                        /* ************* */   /* ************************** */
                           WBL, /**/ WBR,       &W20,  &w21,     /**/ &W22,
                           1, 1, FLA_TL );

    /*------------------------------------------------------------*/

    // c12t   = c12t   - a12t * C22;
    // c12t^T = c12t^T - C22^T a12t^T;
    FLA_Hemvc( FLA_UPPER_TRIANGULAR, FLA_CONJUGATE, FLA_MINUS_ONE, C22, a12t, FLA_ONE, c12t );

    // c12t   = c12t * inv( triu(A22') + alpha11 * I );
    // c12t^T = inv( triu(conj(A22)) + alpha11 * I ) * c12t^T;
    FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );

    // gamma11 = gamma11 - a12t * c12t' - c12t * a12t';
    FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );

    // gamma11 = gamma11 / ( alpha11 + alpha11' );
    FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    FLA_Mult_add( FLA_ONE, alpha11, omega );
    FLA_Inv_scal( omega, gamma11 );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00,  /**/ a01,     A02,
                            /* ************** */  /* ************************ */
                                                     a10t, /**/ alpha11, a12t,
                              &ABL, /**/ &ABR,       A20,  /**/ a21,     A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00,  /**/ c01,     C02,
                            /* ************** */  /* ************************ */
                                                     c10t, /**/ gamma11, c12t,
                              &CBL, /**/ &CBR,       C20,  /**/ c21,     C22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &WTL, /**/ &WTR,       W00,  /**/ w01,     W02,
                            /* ************** */  /* ************************ */
                                                     w10t, /**/ omega11, w12t,
                              &WBL, /**/ &WBR,       W20,  /**/ w21,     W22,
                              FLA_BR );
  }

  FLA_Obj_free( &W );
  FLA_Obj_free( &omega );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_unb_var2 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Axpys(), FLA_Cont_with_3x3_to_2x2(), FLA_Copyrt(), FLA_Copyt(), FLA_Dot2cs(), FLA_Gemvc(), FLA_Ger(), FLA_Inv_scal(), FLA_MINUS_ONE, FLA_Mult_add(), FLA_Obj_create(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), FLA_Obj_shift_diagonal(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), FLA_Scal(), and FLA_Trsv().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00,  a01,     A02, 
          ABL,   ABR,      a10t, alpha11, a12t,
                           A20,  a21,     A22;

  FLA_Obj CTL,   CTR,      C00,  c01,     C02, 
          CBL,   CBR,      c10t, gamma11, c12t,
                           C20,  c21,     C22;

  FLA_Obj WTL,   WTR,      W00,  w01,     W02,
          WBL,   WBR,      w10t, omega11, w12t,
                           W20,  w21,     W22;

  FLA_Obj W, omega;

  FLA_Scal( isgn, C );

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );
  FLA_Obj_create( FLA_Obj_datatype( A ), 1, 1, 0, 0, &omega );

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  FLA_Part_2x2( W,    &WTL, &WTR,
                      &WBL, &WBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00,  &a01,     /**/ &A02,
                                                &a10t, &alpha11, /**/ &a12t,
                        /* ************* */   /* ************************** */
                           ABL, /**/ ABR,       &A20,  &a21,     /**/ &A22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00,  &c01,     /**/ &C02,
                                                &c10t, &gamma11, /**/ &c12t,
                        /* ************* */   /* ************************** */
                           CBL, /**/ CBR,       &C20,  &c21,     /**/ &C22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( WTL, /**/ WTR,       &W00,  &w01,     /**/ &W02,
                                                &w10t, &omega11, /**/ &w12t,
                        /* ************* */   /* ************************** */
                           WBL, /**/ WBR,       &W20,  &w21,     /**/ &W22,
                           1, 1, FLA_TL );

    /*------------------------------------------------------------*/

    // c12t   = c12t * inv( triu(A22') + alpha11 * I );
    // c12t^T = inv( triu(conj(A22)) + alpha11 * I ) * c12t^T;
    FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_CONJ_NO_TRANSPOSE, A22, W22 );
    FLA_Obj_shift_diagonal( FLA_NO_CONJUGATE, alpha11, W22 );
    FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W22, c12t );

    // gamma11 = gamma11 - a12t * c12t' - c12t * a12t';
    FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );

    // gamma11 = gamma11 / ( alpha11 + alpha11' );
    FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    FLA_Mult_add( FLA_ONE, alpha11, omega );
    FLA_Inv_scal( omega, gamma11 );

    // C02 = C02 - a01 * c12t;
    FLA_Ger( FLA_MINUS_ONE, a01, c12t, C02 );

    // c01 = c01 - a01 * gamma11;
    FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );

    // c01 = c01 - A02 * c12t'
    FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00,  /**/ a01,     A02,
                            /* ************** */  /* ************************ */
                                                     a10t, /**/ alpha11, a12t,
                              &ABL, /**/ &ABR,       A20,  /**/ a21,     A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00,  /**/ c01,     C02,
                            /* ************** */  /* ************************ */
                                                     c10t, /**/ gamma11, c12t,
                              &CBL, /**/ &CBR,       C20,  /**/ c21,     C22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &WTL, /**/ &WTR,       W00,  /**/ w01,     W02,
                            /* ************** */  /* ************************ */
                                                     w10t, /**/ omega11, w12t,
                              &WBL, /**/ &WBR,       W20,  /**/ w21,     W22,
                              FLA_BR );
  }

  FLA_Obj_free( &W );
  FLA_Obj_free( &omega );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_unb_var3 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Axpys(), FLA_Cont_with_3x3_to_2x2(), FLA_Copyrt(), FLA_Copyt(), FLA_Dot2cs(), FLA_Gemvc(), FLA_Inv_scal(), FLA_MINUS_ONE, FLA_Mult_add(), FLA_Obj_create(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), FLA_Obj_shift_diagonal(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), FLA_Scal(), and FLA_Trsv().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00,  a01,     A02, 
          ABL,   ABR,      a10t, alpha11, a12t,
                           A20,  a21,     A22;

  FLA_Obj CTL,   CTR,      C00,  c01,     C02, 
          CBL,   CBR,      c10t, gamma11, c12t,
                           C20,  c21,     C22;

  FLA_Obj WTL,   WTR,      W00,  w01,     W02,
          WBL,   WBR,      w10t, omega11, w12t,
                           W20,  w21,     W22;

  FLA_Obj W, omega;

  FLA_Scal( isgn, C );

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );
  FLA_Obj_create( FLA_Obj_datatype( A ), 1, 1, 0, 0, &omega );

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  FLA_Part_2x2( W,    &WTL, &WTR,
                      &WBL, &WBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00,  &a01,     /**/ &A02,
                                                &a10t, &alpha11, /**/ &a12t,
                        /* ************* */   /* ************************** */
                           ABL, /**/ ABR,       &A20,  &a21,     /**/ &A22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00,  &c01,     /**/ &C02,
                                                &c10t, &gamma11, /**/ &c12t,
                        /* ************* */   /* ************************** */
                           CBL, /**/ CBR,       &C20,  &c21,     /**/ &C22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( WTL, /**/ WTR,       &W00,  &w01,     /**/ &W02,
                                                &w10t, &omega11, /**/ &w12t,
                        /* ************* */   /* ************************** */
                           WBL, /**/ WBR,       &W20,  &w21,     /**/ &W22,
                           1, 1, FLA_TL );

    /*------------------------------------------------------------*/

    // gamma11 = gamma11 - a12t * c12t' - c12t * a12t';
    FLA_Dot2cs( FLA_CONJUGATE, FLA_MINUS_ONE, a12t, c12t, FLA_ONE, gamma11 );

    // gamma11 = gamma11 / ( alpha11 + alpha11' );
    FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    FLA_Mult_add( FLA_ONE, alpha11, omega );
    FLA_Inv_scal( omega, gamma11 );

    // c01 = c01 - a01 * gamma11;
    // c01 = c01 - C02 * a12t' - A02 * c12t'
    FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );
    FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, C02, a12t, FLA_ONE, c01 );
    FLA_Gemvc( FLA_NO_TRANSPOSE, FLA_CONJUGATE, FLA_MINUS_ONE, A02, c12t, FLA_ONE, c01 );

    // c01 = inv( triu(A00) + conj(alpha) * I ) * c01;
    FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00,  /**/ a01,     A02,
                            /* ************** */  /* ************************ */
                                                     a10t, /**/ alpha11, a12t,
                              &ABL, /**/ &ABR,       A20,  /**/ a21,     A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00,  /**/ c01,     C02,
                            /* ************** */  /* ************************ */
                                                     c10t, /**/ gamma11, c12t,
                              &CBL, /**/ &CBR,       C20,  /**/ c21,     C22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &WTL, /**/ &WTR,       W00,  /**/ w01,     W02,
                            /* ************** */  /* ************************ */
                                                     w10t, /**/ omega11, w12t,
                              &WBL, /**/ &WBR,       W20,  /**/ w21,     W22,
                              FLA_BR );
  }

  FLA_Obj_free( &W );
  FLA_Obj_free( &omega );

  return FLA_SUCCESS;
}
FLA_Error FLA_Lyap_n_unb_var4 ( FLA_Obj  isgn,
FLA_Obj  A,
FLA_Obj  C 
)

References FLA_Axpys(), FLA_Cont_with_3x3_to_2x2(), FLA_Copyrt(), FLA_Copyt(), FLA_Her2(), FLA_Inv_scal(), FLA_MINUS_ONE, FLA_Mult_add(), FLA_Obj_create(), FLA_Obj_create_conf_to(), FLA_Obj_datatype(), FLA_Obj_free(), FLA_Obj_length(), FLA_Obj_shift_diagonal(), FLA_ONE, FLA_Part_2x2(), FLA_Repart_2x2_to_3x3(), FLA_Scal(), and FLA_Trsv().

Referenced by FLA_Lyap_n().

{
  FLA_Obj ATL,   ATR,      A00,  a01,     A02, 
          ABL,   ABR,      a10t, alpha11, a12t,
                           A20,  a21,     A22;

  FLA_Obj CTL,   CTR,      C00,  c01,     C02, 
          CBL,   CBR,      c10t, gamma11, c12t,
                           C20,  c21,     C22;

  FLA_Obj WTL,   WTR,      W00,  w01,     W02,
          WBL,   WBR,      w10t, omega11, w12t,
                           W20,  w21,     W22;

  FLA_Obj W, omega;

  FLA_Scal( isgn, C );

  FLA_Obj_create_conf_to( FLA_NO_TRANSPOSE, A, &W );
  FLA_Obj_create( FLA_Obj_datatype( A ), 1, 1, 0, 0, &omega );

  FLA_Part_2x2( A,    &ATL, &ATR,
                      &ABL, &ABR,     0, 0, FLA_BR );

  FLA_Part_2x2( C,    &CTL, &CTR,
                      &CBL, &CBR,     0, 0, FLA_BR );

  FLA_Part_2x2( W,    &WTL, &WTR,
                      &WBL, &WBR,     0, 0, FLA_BR );

  while ( FLA_Obj_length( CTL ) > 0 ){

    FLA_Repart_2x2_to_3x3( ATL, /**/ ATR,       &A00,  &a01,     /**/ &A02,
                                                &a10t, &alpha11, /**/ &a12t,
                        /* ************* */   /* ************************** */
                           ABL, /**/ ABR,       &A20,  &a21,     /**/ &A22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( CTL, /**/ CTR,       &C00,  &c01,     /**/ &C02,
                                                &c10t, &gamma11, /**/ &c12t,
                        /* ************* */   /* ************************** */
                           CBL, /**/ CBR,       &C20,  &c21,     /**/ &C22,
                           1, 1, FLA_TL );

    FLA_Repart_2x2_to_3x3( WTL, /**/ WTR,       &W00,  &w01,     /**/ &W02,
                                                &w10t, &omega11, /**/ &w12t,
                        /* ************* */   /* ************************** */
                           WBL, /**/ WBR,       &W20,  &w21,     /**/ &W22,
                           1, 1, FLA_TL );

    /*------------------------------------------------------------*/

    // gamma11 = gamma11 / ( alpha11 + alpha11' );
    FLA_Copyt( FLA_CONJ_NO_TRANSPOSE, alpha11, omega );
    FLA_Mult_add( FLA_ONE, alpha11, omega );
    FLA_Inv_scal( omega, gamma11 );

    // c01 = c01 - a01 * gamma11;
    FLA_Axpys( FLA_MINUS_ONE, gamma11, a01, FLA_ONE, c01 );

    // c01 = inv( triu(A00) + conj(alpha) * I ) * c01;
    FLA_Copyrt( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, A00, W00 );
    FLA_Obj_shift_diagonal( FLA_CONJUGATE, alpha11, W00 );
    FLA_Trsv( FLA_UPPER_TRIANGULAR, FLA_NO_TRANSPOSE, FLA_NONUNIT_DIAG, W00, c01 );

    // C00 = C00 - a01 * c01' - c01 * a01';
    FLA_Her2( FLA_UPPER_TRIANGULAR, FLA_MINUS_ONE, a01, c01, C00 );

    /*------------------------------------------------------------*/

    FLA_Cont_with_3x3_to_2x2( &ATL, /**/ &ATR,       A00,  /**/ a01,     A02,
                            /* ************** */  /* ************************ */
                                                     a10t, /**/ alpha11, a12t,
                              &ABL, /**/ &ABR,       A20,  /**/ a21,     A22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &CTL, /**/ &CTR,       C00,  /**/ c01,     C02,
                            /* ************** */  /* ************************ */
                                                     c10t, /**/ gamma11, c12t,
                              &CBL, /**/ &CBR,       C20,  /**/ c21,     C22,
                              FLA_BR );

    FLA_Cont_with_3x3_to_2x2( &WTL, /**/ &WTR,       W00,  /**/ w01,     W02,
                            /* ************** */  /* ************************ */
                                                     w10t, /**/ omega11, w12t,
                              &WBL, /**/ &WBR,       W20,  /**/ w21,     W22,
                              FLA_BR );
  }

  FLA_Obj_free( &W );
  FLA_Obj_free( &omega );

  return FLA_SUCCESS;
}