libflame revision_anchor
Functions
FLA_SA_Apply_pivots.c File Reference

(r)

Functions

FLA_Error FLA_SA_Apply_pivots (FLA_Obj C, FLA_Obj E, FLA_Obj p)

Function Documentation

FLA_Error FLA_SA_Apply_pivots ( FLA_Obj  C,
FLA_Obj  E,
FLA_Obj  p 
)

References bli_cswap(), bli_dswap(), bli_sswap(), bli_zswap(), FLA_Obj_col_stride(), FLA_Obj_datatype(), FLA_Obj_has_zero_dim(), FLA_Obj_length(), and FLA_Obj_width().

Referenced by FLA_SA_FS_blk(), and FLA_SA_LU_blk().

{
  FLA_Datatype datatype;
  int          m_C, n_C, cs_C;
  int                    cs_E;
  // int                    rs_C;
  // int                    rs_E;
  int          m_p;
  int          i;
  int*         buff_p;

  if ( FLA_Obj_has_zero_dim( C ) ) return FLA_SUCCESS;

  datatype = FLA_Obj_datatype( C );

  m_C    = FLA_Obj_length( C );
  n_C    = FLA_Obj_width( C );
  cs_C   = FLA_Obj_col_stride( C );
  // rs_C   = FLA_Obj_row_stride( C );

  cs_E   = FLA_Obj_col_stride( E );
  // rs_E   = FLA_Obj_row_stride( E );

  m_p    = FLA_Obj_length( p );
  
  buff_p = ( int * ) FLA_INT_PTR( p );


  switch ( datatype ){

  case FLA_FLOAT:
  {
    float* buff_C = ( float * ) FLA_FLOAT_PTR( C );
    float* buff_E = ( float * ) FLA_FLOAT_PTR( E );

    for ( i = 0; i < m_p; ++i )
    {
      if ( buff_p[ i ] != 0 ) 
        bli_sswap( n_C, 
                   buff_C + 0*cs_C + i,                         cs_C, 
                   buff_E + 0*cs_E + buff_p[ i ] - ( m_C - i ), cs_E );
    }
    break;
  }

  case FLA_DOUBLE:
  {
    double* buff_C = ( double * ) FLA_DOUBLE_PTR( C );
    double* buff_E = ( double * ) FLA_DOUBLE_PTR( E );

    for ( i = 0; i < m_p; ++i )
    {
      if ( buff_p[ i ] != 0 ) 
        bli_dswap( n_C, 
                   buff_C + 0*cs_C + i,                         cs_C, 
                   buff_E + 0*cs_E + buff_p[ i ] - ( m_C - i ), cs_E );
    }
    break;
  }

  case FLA_COMPLEX:
  {
    scomplex* buff_C = ( scomplex * ) FLA_COMPLEX_PTR( C );
    scomplex* buff_E = ( scomplex * ) FLA_COMPLEX_PTR( E );

    for ( i = 0; i < m_p; ++i )
    {
      if ( buff_p[ i ] != 0 ) 
        bli_cswap( n_C, 
                   buff_C + 0*cs_C + i,                         cs_C, 
                   buff_E + 0*cs_E + buff_p[ i ] - ( m_C - i ), cs_E );
    }
    break;
  }

  case FLA_DOUBLE_COMPLEX:
  {
    dcomplex* buff_C = ( dcomplex * ) FLA_DOUBLE_COMPLEX_PTR( C );
    dcomplex* buff_E = ( dcomplex * ) FLA_DOUBLE_COMPLEX_PTR( E );

    for ( i = 0; i < m_p; ++i )
    {
      if ( buff_p[ i ] != 0 ) 
        bli_zswap( n_C, 
                   buff_C + 0*cs_C + i,                         cs_C, 
                   buff_E + 0*cs_E + buff_p[ i ] - ( m_C - i ), cs_E );
    }
    break;
  }

  }

  return FLA_SUCCESS;
}