[Coin-lpsolver] Problem creation performance
Brady Hunsaker
hunsaker at engr.pitt.edu
Mon Feb 14 08:40:53 EST 2005
François Galea wrote:
> John,
>
> My first experiments with a CoinBuild object for adding the columns to
> the problem are more than satisfying ! :) Thanks for the good (and
> quick) job !
>
> François
>
>
I'd like to second François's observation. Using CoinBuild, I had
row-by-row generation of an instance with about 200,000 rows reduce from
something like 30-60 minutes (I never measured it exactly) to 3-4
seconds. That's about 3 orders of magnitude. Curiously, this was true
even though the Osi interface (OsiCpx) adds each row one at a time. I
guess it had been the single calls to CoinPackedMatrix::appendRow that
were slow.
Thank you, John.
Why do we not make CoinPackedMatrix behave this way by default? That
is, store added rows or columns in a linked list until another method is
called that requires the matrix. This complicates the coding, since it
is basically a caching framework, but would make things transparent for
the user. Is the complexity not worth the benefit? Is there some other
reason I don't see?
Brady
John J Forrest a écrit :
>
>>
>> Apologies for double posting but it is more general than Clp.
>>
>> Francois mentioned that there was a large overhead to using addColumn
>> (i.e. adding one at a time) in Clp. As Clp is using CoinPackedMatrix
>> this probably also applies to other codes using CoinPackedMatrix,
>> including some implementations of Osi. I had realized there was an
>> overhead to addRow but had not realized it is worse for addColumn.
>>
>> My solution is to add a new class to Coin - CoinBuild. The user
>> instantiates an empty CoinBuild object and then performs addRow (or
>> addColumn but not a mixture) in the same was as addRow (or addColumn)
>> for an OsiSolverInterface model. This stores the information in a
>> linked list. Then the user uses model.addRows(object) to get the
>> information to its final destination. There is addRows/addColumns in
>> Clp and addRows/addCols in OsiSolverInterface.
>>
>> Doing this reduced the time for adding 10,000 rows from 0.53 seconds
>> to 0.04 and for adding 10,000 columns from 5.71 seconds to 0.03.
>>
>> (Francois - see Clp/Samples/addColumns.cpp for sample code).
>>
>> The reason for posting this to Coin-discuss was to tell people it was
>> available and to ask if other people had noticed the performance hit.
>> Also to see if my solution is adequate.
>>
>> John Forrest
>>
>>
>>
>> *François Galea <Francois.Galea at prism.uvsq.fr>*
>> Sent by: coin-lpsolver-bounces at list.coin-or.org
>>
>> 02/04/2005 03:15 AM
>>
>>
>> To
>> coin-lpsolver at list.coin-or.org
>> cc
>>
>> Subject
>> [Coin-lpsolver] Problem creation performance
>>
>>
>>
>>
>>
>>
>>
>>
>> Hi !
>>
>> I have a question concerning the Clp library API.
>>
>> I need to generate different LPs (my previous question about QPs has no
>> relation with this problem), whose size is about 2500 rows, 2500 columns
>> and 250000 non-zeros. The model is such that it's easier for me to
>> create an empty problem object using the ClpSimplex() constructor :
>>
>> ClpSimplex * simplex = new ClpSimplex();
>>
>> then I populate it column-wise, by first performing a series of calls
>> like this:
>>
>> simplex->addRows( rcnt, lb, ub, rowstarts, NULL, NULL );
>>
>> then I add the columns by a series of this kind of calls :
>>
>> simplex->addColumns( 1, &lb, &ub, &objcoef, colstarts, ind, val );
>>
>> This leads to a major problem, that the creation of the problem is much
>> slower than its resolution. Maybe Clp is more performant when creating
>> simplex objects row-wise than column-wise, but I really need to create
>> my problem objects this way.
>>
>> Most of the examples I found in the Clp documentation create ClpSimplex
>> objects by reading MPS files, and the only one I found that creates an
>> object from scratch provides the whole simplex matrix at once, which is
>> okay when you can easily find the size of the problem before creating
>> the object, but it not okay for me.
>>
>> Could I get a link to a more complete documentation than the one I found
>> in the Clp website, which only mentions the addRows and addColumns
>> methods once ? Or can anybody tell me why I get such a low model
>> creation speed, and how to make things faster ?
>>
>> Thanks for the help,
>>
>> François Galea
>>
>> _______________________________________________
>> Coin-lpsolver mailing list
>> Coin-lpsolver at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/coin-lpsolver
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Coin-lpsolver mailing list
>> Coin-lpsolver at list.coin-or.org
>> http://list.coin-or.org/mailman/listinfo/coin-lpsolver
>
>
> _______________________________________________
> Coin-lpsolver mailing list
> Coin-lpsolver at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/coin-lpsolver
--
Brady Hunsaker
Assistant Professor
Industrial Engineering
University of Pittsburgh
http://www.engr.pitt.edu/hunsaker/
More information about the Clp
mailing list