mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-13 20:26:03 +08:00
Fix serious bug discovered with gcc 4.2
This commit is contained in:
parent
8d449bd80e
commit
c893917d65
@ -201,7 +201,7 @@ class GeneralProduct<Lhs, Rhs, OuterProduct>
|
|||||||
|
|
||||||
template<typename Dest> void scaleAndAddTo(Dest& dest, Scalar alpha) const
|
template<typename Dest> void scaleAndAddTo(Dest& dest, Scalar alpha) const
|
||||||
{
|
{
|
||||||
ei_outer_product_selector<Dest::Flags&RowMajorBit>::run(*this, dest, alpha);
|
ei_outer_product_selector<(int(Dest::Flags)&RowMajorBit) ? RowMajor : ColMajor>::run(*this, dest, alpha);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -259,7 +259,7 @@ class GeneralProduct<Lhs, Rhs, GemvProduct>
|
|||||||
template<typename Dest> void scaleAndAddTo(Dest& dst, Scalar alpha) const
|
template<typename Dest> void scaleAndAddTo(Dest& dst, Scalar alpha) const
|
||||||
{
|
{
|
||||||
ei_assert(m_lhs.rows() == dst.rows() && m_rhs.cols() == dst.cols());
|
ei_assert(m_lhs.rows() == dst.rows() && m_rhs.cols() == dst.cols());
|
||||||
ei_gemv_selector<Side,bool(int(MatrixType::Flags)&RowMajorBit),
|
ei_gemv_selector<Side,(int(MatrixType::Flags)&RowMajorBit) ? RowMajor : ColMajor,
|
||||||
bool(ei_blas_traits<MatrixType>::ActualAccess)>::run(*this, dst, alpha);
|
bool(ei_blas_traits<MatrixType>::ActualAccess)>::run(*this, dst, alpha);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -30,7 +30,7 @@ template<typename Lhs, typename Rhs,
|
|||||||
int Side, // can be OnTheLeft/OnTheRight
|
int Side, // can be OnTheLeft/OnTheRight
|
||||||
int Unrolling = Rhs::IsVectorAtCompileTime && Rhs::SizeAtCompileTime <= 8 // FIXME
|
int Unrolling = Rhs::IsVectorAtCompileTime && Rhs::SizeAtCompileTime <= 8 // FIXME
|
||||||
? CompleteUnrolling : NoUnrolling,
|
? CompleteUnrolling : NoUnrolling,
|
||||||
int StorageOrder = int(Lhs::Flags) & RowMajorBit,
|
int StorageOrder = (int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
|
||||||
int RhsCols = Rhs::ColsAtCompileTime
|
int RhsCols = Rhs::ColsAtCompileTime
|
||||||
>
|
>
|
||||||
struct ei_triangular_solver_selector;
|
struct ei_triangular_solver_selector;
|
||||||
@ -157,7 +157,7 @@ struct ei_triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,StorageOrder,
|
|||||||
{
|
{
|
||||||
const ActualLhsType actualLhs = LhsProductTraits::extract(lhs);
|
const ActualLhsType actualLhs = LhsProductTraits::extract(lhs);
|
||||||
ei_triangular_solve_matrix<Scalar,Side,Mode,LhsProductTraits::NeedToConjugate,StorageOrder,
|
ei_triangular_solve_matrix<Scalar,Side,Mode,LhsProductTraits::NeedToConjugate,StorageOrder,
|
||||||
Rhs::Flags&RowMajorBit>
|
(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor>
|
||||||
::run(lhs.rows(), Side==OnTheLeft? rhs.cols() : rhs.rows(), &actualLhs.coeff(0,0), actualLhs.stride(), &rhs.coeffRef(0,0), rhs.stride());
|
::run(lhs.rows(), Side==OnTheLeft? rhs.cols() : rhs.rows(), &actualLhs.coeff(0,0), actualLhs.stride(), &rhs.coeffRef(0,0), rhs.stride());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -149,9 +149,9 @@ class GeneralProduct<Lhs, Rhs, GemmProduct>
|
|||||||
|
|
||||||
ei_general_matrix_matrix_product<
|
ei_general_matrix_matrix_product<
|
||||||
Scalar,
|
Scalar,
|
||||||
(_ActualLhsType::Flags&RowMajorBit)?RowMajor:ColMajor, bool(LhsBlasTraits::NeedToConjugate),
|
(_ActualLhsType::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(LhsBlasTraits::NeedToConjugate),
|
||||||
(_ActualRhsType::Flags&RowMajorBit)?RowMajor:ColMajor, bool(RhsBlasTraits::NeedToConjugate),
|
(_ActualRhsType::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(RhsBlasTraits::NeedToConjugate),
|
||||||
(Dest::Flags&RowMajorBit)?RowMajor:ColMajor>
|
(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor>
|
||||||
::run(
|
::run(
|
||||||
this->rows(), this->cols(), lhs.cols(),
|
this->rows(), this->cols(), lhs.cols(),
|
||||||
(const Scalar*)&(lhs.const_cast_derived().coeffRef(0,0)), lhs.stride(),
|
(const Scalar*)&(lhs.const_cast_derived().coeffRef(0,0)), lhs.stride(),
|
||||||
|
@ -41,7 +41,7 @@ static EIGEN_DONT_INLINE void ei_product_selfadjoint_vector(
|
|||||||
const int PacketSize = sizeof(Packet)/sizeof(Scalar);
|
const int PacketSize = sizeof(Packet)/sizeof(Scalar);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
IsRowMajor = StorageOrder==RowMajorBit ? 1 : 0,
|
IsRowMajor = StorageOrder==RowMajor ? 1 : 0,
|
||||||
IsLower = UpLo == LowerTriangularBit ? 1 : 0,
|
IsLower = UpLo == LowerTriangularBit ? 1 : 0,
|
||||||
FirstTriangular = IsRowMajor == IsLower
|
FirstTriangular = IsRowMajor == IsLower
|
||||||
};
|
};
|
||||||
@ -186,7 +186,7 @@ struct SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>
|
|||||||
* RhsBlasTraits::extractScalarFactor(m_rhs);
|
* RhsBlasTraits::extractScalarFactor(m_rhs);
|
||||||
|
|
||||||
ei_assert(dst.stride()==1 && "not implemented yet");
|
ei_assert(dst.stride()==1 && "not implemented yet");
|
||||||
ei_product_selfadjoint_vector<Scalar, ei_traits<_ActualLhsType>::Flags&RowMajorBit, int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>
|
ei_product_selfadjoint_vector<Scalar, (ei_traits<_ActualLhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>
|
||||||
(
|
(
|
||||||
lhs.rows(), // size
|
lhs.rows(), // size
|
||||||
&lhs.coeff(0,0), lhs.stride(), // lhs info
|
&lhs.coeff(0,0), lhs.stride(), // lhs info
|
||||||
|
@ -132,7 +132,7 @@ SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
|
|||||||
|
|
||||||
Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived());
|
Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived());
|
||||||
|
|
||||||
enum { IsRowMajor = (ei_traits<MatrixType>::Flags&RowMajorBit)?1:0 };
|
enum { IsRowMajor = (ei_traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };
|
||||||
|
|
||||||
ei_selfadjoint_product<Scalar,
|
ei_selfadjoint_product<Scalar,
|
||||||
_ActualUType::Flags&RowMajorBit ? RowMajor : ColMajor,
|
_ActualUType::Flags&RowMajorBit ? RowMajor : ColMajor,
|
||||||
|
@ -85,7 +85,7 @@ SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
|
|||||||
Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())
|
Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())
|
||||||
* VBlasTraits::extractScalarFactor(v.derived());
|
* VBlasTraits::extractScalarFactor(v.derived());
|
||||||
|
|
||||||
enum { IsRowMajor = (ei_traits<MatrixType>::Flags&RowMajorBit)?1:0 };
|
enum { IsRowMajor = (ei_traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };
|
||||||
ei_selfadjoint_rank2_update_selector<Scalar,
|
ei_selfadjoint_rank2_update_selector<Scalar,
|
||||||
typename ei_cleantype<typename ei_conj_expr_if<IsRowMajor ^ UBlasTraits::NeedToConjugate,_ActualUType>::ret>::type,
|
typename ei_cleantype<typename ei_conj_expr_if<IsRowMajor ^ UBlasTraits::NeedToConjugate,_ActualUType>::ret>::type,
|
||||||
typename ei_cleantype<typename ei_conj_expr_if<IsRowMajor ^ VBlasTraits::NeedToConjugate,_ActualVType>::ret>::type,
|
typename ei_cleantype<typename ei_conj_expr_if<IsRowMajor ^ VBlasTraits::NeedToConjugate,_ActualVType>::ret>::type,
|
||||||
|
@ -145,7 +145,7 @@ struct TriangularProduct<Mode,true,Lhs,false,Rhs,true>
|
|||||||
Mode,
|
Mode,
|
||||||
LhsBlasTraits::NeedToConjugate,
|
LhsBlasTraits::NeedToConjugate,
|
||||||
RhsBlasTraits::NeedToConjugate,
|
RhsBlasTraits::NeedToConjugate,
|
||||||
ei_traits<Lhs>::Flags&RowMajorBit>
|
(int(ei_traits<Lhs>::Flags)&RowMajorBit) ? RowMajor : ColMajor>
|
||||||
::run(lhs,rhs,dst,actualAlpha);
|
::run(lhs,rhs,dst,actualAlpha);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user