Assigning a row-major declsym expression to a column-major symmetric submatrix results in a compiler error
Issue #283
resolved
Example:
SymmetricMatrix<DynamicMatrix<double, columnMajor>> A(5);
DynamicMatrix<double, rowMajor> R(1, 1);
submatrix<0, 0, 1, 1>(A) += declsym(R); // <-- ERROR
Compiler output:
In file included from /usr/local/include/blaze/math/expressions/Matrix.h:44,
from /usr/local/include/blaze/math/views/Band.h:52,
from /usr/local/include/blaze/math/Band.h:50,
from /usr/local/include/blaze/Math.h:46,
from test.cpp:1:
/usr/local/include/blaze/math/expressions/Matrix.h: In instantiation of ‘blaze::EnableIf_t<IsSymmetric_v<MT2> > blaze::assign_backend(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT2, (! SO)>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO = true; MT2 = blaze::SymmetricMatrix<blaze::StaticMatrix<double, 1, 1, false>, false, true, true>; blaze::EnableIf_t<IsSymmetric_v<MT2> > = void]’:
/usr/local/include/blaze/math/expressions/Matrix.h:1101:18: required from ‘void blaze::assign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::SymmetricMatrix<blaze::StaticMatrix<double, 1, 1, false>, false, true, true>; bool SO2 = false]’
/usr/local/include/blaze/math/smp/default/DenseMatrix.h:108:10: required from ‘blaze::EnableIf_t<IsDenseMatrix_v<MT1> > blaze::smpAssign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::SymmetricMatrix<blaze::StaticMatrix<double, 1, 1, false>, false, true, true>; bool SO2 = false; blaze::EnableIf_t<IsDenseMatrix_v<MT1> > = void]’
/usr/local/include/blaze/math/views/submatrix/Dense.h:4765:16: required from ‘blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>::operator+=(const blaze::Matrix<MT, SO>&) [with MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO = false; MT = blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >; long unsigned int ...CSAs = {0, 0, 1, 1}; blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>&]’
test.cpp:15:46: required from here
/usr/local/include/blaze/math/expressions/Matrix.h:1065:4: error: static assertion failed: Symmetric matrix type detected
BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE( MT1 );
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/blaze/math/expressions/Matrix.h: In instantiation of ‘blaze::EnableIf_t<IsSymmetric_v<MT2> > blaze::addAssign_backend(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT2, (! SO)>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO = true; MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; blaze::EnableIf_t<IsSymmetric_v<MT2> > = void]’:
/usr/local/include/blaze/math/expressions/Matrix.h:1210:21: required from ‘void blaze::addAssign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO2 = false]’
/usr/local/include/blaze/math/smp/default/DenseMatrix.h:139:13: required from ‘blaze::EnableIf_t<IsDenseMatrix_v<MT1> > blaze::smpAddAssign(blaze::Matrix<MT, SO>&, const blaze::Matrix<MT, SO>&) [with MT1 = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>; bool SO1 = true; MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO2 = false; blaze::EnableIf_t<IsDenseMatrix_v<MT1> > = void]’
/usr/local/include/blaze/math/views/submatrix/Dense.h:4768:19: required from ‘blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>::operator+=(const blaze::Matrix<MT, SO>&) [with MT2 = blaze::DMatDeclSymExpr<blaze::DynamicMatrix<double, false>, false>; bool SO = false; MT = blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >; long unsigned int ...CSAs = {0, 0, 1, 1}; blaze::DisableIf_t<EnforceEvaluation_v<MT, MT2>, blaze::Submatrix<MT, (blaze::AlignmentFlag)0, true, true, CSAs ...>&> = blaze::Submatrix<blaze::SymmetricMatrix<blaze::DynamicMatrix<double, true> >, (blaze::AlignmentFlag)0, true, true, 0, 0, 1, 1>&]’
test.cpp:15:46: required from here
/usr/local/include/blaze/math/expressions/Matrix.h:1174:4: error: static assertion failed: Symmetric matrix type detected
BLAZE_CONSTRAINT_MUST_NOT_BE_SYMMETRIC_MATRIX_TYPE( MT1 );
If R
is declared as columnMajor
, the code compiles.
Comments (4)
-
-
-
assigned issue to
-
assigned issue to
-
- changed status to open
-
- changed status to resolved
Commit cc8016b fixes the compilation error during the assignment of a row-major symmetric matrix to a column-major symmetric submatrix. The fix is immediately available via cloning the Blaze repository and will be officially released in Blaze 3.7.
- Log in to comment
Hi Misha!
Thanks a lot for taking the time to report this defect. This is indeed an oversight on our side. We will fix the issue as quickly as possible. Thanks again,
Best regards,
Klaus!