Hi everyone,<br><br>I have attached (and pasted below) a small program that demonstrates a problem that I've encountered with CoinStructuredModel:<br><br>The demonstration works as follows:<br>* Read a block structured LP from an MPS file<br>
* Loop over the blocks; print their dimensions and number of entries<br>* Retrieve a reference to a **nonzero** block via CoinStructuredModel::coinBlock<br>* Request a pointer to the blocks entries via CoinModel::elements<br>
* Surprisingly, the call results in a null pointer.<br><br>If anyone has a moment in which to compile and run this small example, I would be very grateful for any suggestions. Although I am sure that I've done something silly, I have no good leads at this point! Perhaps I am missing a crucial call to a consolidation method?<br>
<br>Many thanks in advance,<br><br>Siamak<br><br><reproduce_error.cpp><br>#include "CoinStructuredModel.hpp"<br>#include <iostream><br><br>/*<br>This program reproduces what appears to be an error in CoinStructuredModel.<br>
Any comments would be greatly appreciated.<br>*/<br><br>int main(int, char * [])<br>{<br> using namespace std;<br><br> //<br> // Loads a problem with 4x4 blocks; 7 are nonzero<br> //<br> CoinStructuredModel structuredModel("4x4blocks.mps", true);<br>
<br> cout << "blocks: " << structuredModel.numberRowBlocks() << " x " << structuredModel.numberColumnBlocks() << endl;<br> cout << "entries: " << structuredModel.numberRows() << " x " << structuredModel.numberColumns() << endl;<br>
<br> //<br> // Displays block attributes: <br> // Note that block (0, 0), in particular, is nonzero<br> //<br> for (int i = 0; i != structuredModel.numberRowBlocks(); ++i)<br> {<br> for (int j = 0; j != structuredModel.numberColumnBlocks(); ++j)<br>
{<br> int index = structuredModel.blockIndex(i, j);<br> if(index >= 0)<br> {<br> CoinModel const& block = *structuredModel.coinBlock(index);<br> cout << "index of block (" << i << ", " << j << ")... " << index << ": ";<br>
cout << block.numberRows() << " x " << block.numberColumns();<br> cout << " (" << block.numberElements() << " entries)" << endl;<br>
}<br> }<br> }<br><br> //<br> // Here, we "know" that block (0, 0) is nonzero...<br> //<br> const int id = structuredModel.blockIndex(0, 0);<br> CoinModel block = *structuredModel.coinBlock(id);<br>
<br> //<br> // ... yet we are unable to retrieve its entries via elements()<br> //<br> cout << "Entries for block " << id << "... " << endl;<br> CoinModelTriple const* triple = block.elements();<br>
assert(triple != 0); // This assertion fails!<br><br> return 0;<br>}<br></reproduce_error.cpp><br><br><4x4blocks.mps><br>NAME 3commodi<br>ROWS<br> E R0001<br> E R0002<br> E R0003<br> E R0004<br>
E R0005<br> E R0006<br> E R0007<br> E R0008<br> E R0009<br> E R0010<br> E R0011<br> E R0012<br> E R0013<br> E R0014<br> E R0015<br> E R0016<br> E R0017<br> E R0018<br> E R0019<br> E R0020<br> E R0021<br>
E R0022<br> E R0023<br> E R0024<br> L R0025<br> L R0026<br> L R0027<br> L R0028<br> L R0029<br> L R0030<br> L R0031<br> L R0032<br> L R0033<br> L R0034<br> L R0035<br> N R0036<br>COLUMNS<br> C0001 R0001 1<br>
C0001 R0006 -1<br> C0001 R0025 1<br> C0001 R0034 3<br> C0001 R0035 18<br> C0001 R0036 3<br> C0002 R0001 1<br> C0002 R0004 -1<br> C0002 R0026 1<br>
C0002 R0034 10<br> C0002 R0035 2<br> C0002 R0036 10<br> C0003 R0002 1<br> C0003 R0004 -1<br> C0003 R0027 1<br> C0003 R0034 2<br> C0003 R0035 7<br>
C0003 R0036 2<br> C0004 R0003 1<br> C0004 R0004 -1<br> C0004 R0028 1<br> C0004 R0034 6<br> C0004 R0035 8<br> C0004 R0036 6<br> C0005 R0003 1<br>
C0005 R0008 -1<br> C0005 R0029 1<br> C0005 R0034 10<br> C0005 R0035 7<br> C0005 R0036 10<br> C0006 R0004 1<br> C0006 R0005 -1<br> C0006 R0030 1<br>
C0006 R0034 5<br> C0006 R0035 6<br> C0006 R0036 5<br> C0007 R0005 1<br> C0007 R0006 -1<br> C0007 R0031 1<br> C0007 R0034 7<br> C0007 R0035 6<br>
C0007 R0036 7<br> C0008 R0005 1<br> C0008 R0007 -1<br> C0008 R0032 1<br> C0008 R0034 5<br> C0008 R0035 4<br> C0008 R0036 5<br> C0009 R0005 1<br>
C0009 R0008 -1<br> C0009 R0033 1<br> C0009 R0034 8<br> C0009 R0035 1<br> C0009 R0036 8<br> C0010 R0009 1<br> C0010 R0014 -1<br> C0010 R0025 1<br>
C0010 R0034 2<br> C0010 R0035 2<br> C0010 R0036 2<br> C0011 R0009 1<br> C0011 R0012 -1<br> C0011 R0026 1<br> C0011 R0034 7<br> C0011 R0035 6<br>
C0011 R0036 7<br> C0012 R0010 1<br> C0012 R0012 -1<br> C0012 R0027 1<br> C0012 R0034 3<br> C0012 R0035 8<br> C0012 R0036 3<br> C0013 R0011 1<br>
C0013 R0012 -1<br> C0013 R0028 1<br> C0013 R0034 1<br> C0013 R0035 3<br> C0013 R0036 1<br> C0014 R0011 1<br> C0014 R0016 -1<br> C0014 R0029 1<br>
C0014 R0034 5<br> C0014 R0035 2<br> C0014 R0036 5<br> C0015 R0012 1<br> C0015 R0013 -1<br> C0015 R0030 1<br> C0015 R0034 3<br> C0015 R0035 1<br>
C0015 R0036 3<br> C0016 R0013 1<br> C0016 R0014 -1<br> C0016 R0031 1<br> C0016 R0034 4<br> C0016 R0035 2<br> C0016 R0036 4<br> C0017 R0013 1<br>
C0017 R0015 -1<br> C0017 R0032 1<br> C0017 R0034 3<br> C0017 R0035 2<br> C0017 R0036 3<br> C0018 R0013 1<br> C0018 R0016 -1<br> C0018 R0033 1<br>
C0018 R0034 6<br> C0018 R0035 2<br> C0018 R0036 6<br> C0019 R0017 1<br> C0019 R0022 -1<br> C0019 R0025 1<br> C0019 R0034 3<br> C0019 R0035 5<br>
C0019 R0036 3<br> C0020 R0017 1<br> C0020 R0020 -1<br> C0020 R0026 1<br> C0020 R0034 3<br> C0020 R0035 3<br> C0020 R0036 3<br> C0021 R0018 1<br>
C0021 R0020 -1<br> C0021 R0027 1<br> C0021 R0034 4<br> C0021 R0035 7<br> C0021 R0036 4<br> C0022 R0019 1<br> C0022 R0020 -1<br> C0022 R0028 1<br>
C0022 R0034 2<br> C0022 R0035 4<br> C0022 R0036 2<br> C0023 R0019 1<br> C0023 R0024 -1<br> C0023 R0029 1<br> C0023 R0034 3<br> C0023 R0035 22<br>
C0023 R0036 3<br> C0024 R0020 1<br> C0024 R0021 -1<br> C0024 R0030 1<br> C0024 R0034 8<br> C0024 R0035 5<br> C0024 R0036 8<br> C0025 R0021 1<br>
C0025 R0022 -1<br> C0025 R0031 1<br> C0025 R0034 6<br> C0025 R0035 3<br> C0025 R0036 6<br> C0026 R0021 1<br> C0026 R0023 -1<br> C0026 R0032 1<br>
C0026 R0034 2<br> C0026 R0035 6<br> C0026 R0036 2<br> C0027 R0021 1<br> C0027 R0024 -1<br> C0027 R0033 1<br> C0027 R0034 8<br> C0027 R0035 2<br>
C0027 R0036 8<br>RHS<br> B R0001 18<br> B R0006 -18<br> B R0010 20<br> B R0015 -20<br> B R0019 25<br> B R0024 -25<br> B R0025 30<br>
B R0026 20<br> B R0027 50<br> B R0028 20<br> B R0029 20<br> B R0030 50<br> B R0031 20<br> B R0032 20<br> B R0033 20<br>
B R0034 100000000<br> B R0035 100000000<br>ENDATA<br></4x4blocks.mps><br><br>