|
libflame
revision_anchor
|
Functions | |
| 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_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(), BLIS_CONJUGATE, BLIS_NO_CONJUGATE, BLIS_NO_TRANSPOSE, BLIS_NONUNIT_DIAG, BLIS_UPPER_TRIANGULAR, 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_Shift_diag( 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_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(), BLIS_CONJUGATE, BLIS_NO_CONJUGATE, BLIS_NO_TRANSPOSE, BLIS_NONUNIT_DIAG, BLIS_UPPER_TRIANGULAR, 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_Shift_diag( 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_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(), BLIS_CONJUGATE, BLIS_NO_CONJUGATE, BLIS_NO_TRANSPOSE, BLIS_NONUNIT_DIAG, BLIS_UPPER_TRIANGULAR, 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_Shift_diag( 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_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_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(), BLIS_CONJUGATE, BLIS_NO_CONJUGATE, BLIS_NO_TRANSPOSE, BLIS_NONUNIT_DIAG, BLIS_UPPER_TRIANGULAR, 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_Shift_diag( 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;
}
1.7.6.1