DGtal icon indicating copy to clipboard operation
DGtal copied to clipboard

testLinearStructure (dec) fails with recent Boost versions.

Open rolanddenis opened this issue 7 years ago • 6 comments

When compiling testLinearStructure using Boost version 1.63.0 or 1.64.0, it fails with the following message:

New Block [testing 3d operators]
  [dec | primal 0-cells <-> dual 3-cells (2) | primal 1-cells <-> dual 2-cells (5) | primal 2-cells <-> dual 1-cells (4) | primal 3-cells <-> dual 0-cells (1)]
  New Block [base operators]
    d0
[primal 0-form => primal 1-form (2 => 5)]
-1  1
 0  1
 0  1
-1  0
-1  0
    d2p
[dual 2-form => dual 3-form (5 => 2)]
-1  0  0 -1 -1
 1  1  1  0  0
    [ERR] Fatal Error - assertion (Eigen::MatrixXd(d0.myContainer) == d0_th) failed in void test_manual_operators_3d(): /scratch/denis/DGtal/tests/dec/testLinearStructure.cpp(391)
Abandon (core dumped)

The related code https://github.com/DGtal-team/DGtal/blob/master/tests/dec/testLinearStructure.cpp#L391 suggests that the primal 0-form should instead be:

d0_th <<
    -1, 0,
    -1, 0,
    -1, 1,
     0, 1,
     0, 1;

It is indeed the case when using Boost 1.58.0.

Tested with GNU 5.4.1, 6.2.0 and 7.1.1, with Eigen 3.3.3 and 3.3.4.

rolanddenis avatar Jun 20 '17 09:06 rolanddenis

Looks ok with the last boost 1.75. Should we keep this issue open?

dcoeurjo avatar Apr 05 '21 17:04 dcoeurjo

Still fails on my side with GCC 10.2.0, Eigen 3.3.9 and Boost 1.75.0 ... Does it work on your side ?

rolanddenis avatar Apr 06 '21 07:04 rolanddenis

Ok so the problem does not come from boost 1.75 itself, maybe a combo GCC10+boost1.75. (clang+boost1.75 is fine).

dcoeurjo avatar Apr 06 '21 07:04 dcoeurjo

Fails also with LLVM 10.0.0, Boost 1.75.0 and Eigen 3.3.9 (Ubuntu), strange...

rolanddenis avatar Apr 06 '21 08:04 rolanddenis

I cannot test on Boost 1.58.0 anymore but looking at code of DiscreteExteriorCalcul shows that it depends on Boost for boost::array and boost::unordered_map. Naively replacing boost::unordered_map by std::map to define myProperties leads to another, but still invalid, result. Using std::unordered_map leads to a correct result for this specific comparison but another one fails just after.

It behaves like something is implementation dependent...

rolanddenis avatar Apr 06 '21 14:04 rolanddenis

In DiscreteExteriorCalculus::updateIndexes, index associated to each cell depends on the read order of myCellProperties. In DiscreteExteriorCalculus::derivative, this index is used as column index to fill the resulting sparse array, thus invalidating comparison in testLinearStructure with hard coded expected result.

rolanddenis avatar Apr 06 '21 15:04 rolanddenis