[Cbc] Message printing with CbcSolver

Kish Shen kisshen at cisco.com
Sat Mar 12 22:43:05 EST 2011


Hi,

I have looked at this a little more, and it seems that the messages are 
not printing because of the passing in of the message handler:

 > DerivedHandler* mipMessageHandler = new DerivedHandler;
 > // model->passInMessageHandler(mipMessageHandler);

If I comment out the line that pass the message handler in as above, the 
messages from Cbc are printed. This happens in both the Trunk branch and 
stable 2.4 branch I am using.

My DerivedHanlder is defined as:

class DerivedHandler : public CoinMessageHandler
{
public:
     virtual int print();
};

int DerivedHandler::print()
{
   printf("@@@@@HELLO@@@@\n");
     int id = currentMessage().externalNumber();
     int mtype = (id<3000 ? LogType : (id<6000 ? WrnType : ErrType));
     eclipse_out(mtype, messageBuffer());

     return 0;
}

I added the printf line so that I know when the handler is called.
With the handler passed in, all I get printed is:

@@@@@HELLO@@@@
Coin Cbc and Clp Solver version 2.4, build Mar 12 2011
@@@@@HELLO@@@@
command line - eplexcbcclpsolver -preprocess on -solve -quit (default 
strategy 1)
@@@@@HELLO@@@@
Option for preprocess changed from sos to on
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 4 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 3 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 2 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
@@@@@HELLO@@@@
processed model has 290 rows, 1055 columns (1055 integer) and 2465 elements

When I *don't* pass the handler in, I get a lot more output:

Coin Cbc and Clp Solver version 2.4, build Mar 12 2011
command line - eplexcbcclpsolver -preprocess on -solve -quit (default 
strategy 1)
Option for preprocess changed from sos to on
Continuous objective value is 156083 - 0.00 seconds
Cgl0003I 0 fixed, 0 tightened bounds, 4 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 3 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 2 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cgl0004I processed model has 290 rows, 1055 columns (1055 integer) and 
2465 elements
Cbc0038I Pass   1: suminf.    0.66204 (6) obj. 228065 iterations 86
Cbc0038I Pass   2: suminf.    0.66204 (6) obj. 228065 iterations 0
....
Cbc0035I Maximum depth 12, 3374 variables fixed on reduced cost
Cuts at root node changed objective from 196138 to 394807
Probing was tried 184 times and created 309 cuts of which 44 were active 
after adding rounds of cuts (0.220 seconds)
Gomory was tried 182 times and created 993 cuts of which 48 were active 
after adding rounds of cuts (0.315 seconds)
Knapsack was tried 182 times and created 372 cuts of which 51 were 
active after adding rounds of cuts (0.320 seconds)
Clique was tried 69 times and created 0 cuts of which 0 were active 
after adding rounds of cuts (0.004 seconds)
MixedIntegerRounding2 was tried 182 times and created 193 cuts of which 
6 were active after adding rounds of cuts (0.022 seconds)
FlowCover was tried 69 times and created 0 cuts of which 0 were active 
after adding rounds of cuts (0.005 seconds)
TwoMirCuts was tried 69 times and created 354 cuts of which 0 were 
active after adding rounds of cuts (0.089 seconds)
Result - Finished objective 405935.1799999999 after 78 nodes and 5281 
iterations - took 2.11 seconds (total time 2.11)
Total time 2.12
Segmentation fault

I have cut out most of the printing in the middle, but it looks like 
none of the output from Cbc are sent to the handler, only the messages 
from Cgl at the start are printed (though without the "Cgl*" identifier 
at the start, I do get this identifier when the handler prints messages 
from Clp when a linear problem is solved.

There is also a segmentation fault at the end when I don't pass in the 
handler. Besides commenting out the line as I show, the rest of the code 
should be the same.

Any idea why this is happening, and if there is anyway to work around 
this? I need to use the print handler to redirect the messages to my own 
output stream, so not using a print handler is not really an option.

Thanks and cheers,

Kish

On 11/03/2011 17:55, Kish Shen wrote:
> Hi,
>
> Currently, during the solving of a MIP problem in my code, where CBC is
> called using the CbcMain0/CbcMain1 interface (which invokes CbcSolver, I
> believe), I get no printing of the messages from Cbc.
>
> This is the behaviour I want normally, but recently some of our users
> have asked if they can see solver messages to get some idea of what the
> solver is doing. I have been unable to see any of Cbc's messages.
>
> As far as I can tell, Cbc is not calling my messageHandler -- I don't
> know if this is because I have not passed the handler to the right place.
>
> Here is an outline of the code I use, and if anyone can see what I need
> to do to get the Cbc messages, I would be very grateful:
>
> CbcModel* model = new(...);
>
> CbcMain0(*model);
>
> DerivedHandler* mipMessageHandler = new DerivedHandler;
> model->passInMessageHandler(mipMessageHandler);
>
> model->solver()->setHintParam(OsiDoReducePrint, true, OsiHintTry);
>
> const char* cbc_args[5];
>
>
> cbc_args[0] = "eplexcbcclpsolver";
> cbc_args[1] ="-preprocess"
> cbc_args[2] = "on";
> cbc_args[3] = "-solve";
> cbc_args[4] = "-quit";
> CbcMain1(5, cbc_args,*model,callBack);
>
> [I hope there are no typos in the above; I was not able to cut and paste
> from my VNC window with the code listing to my Windows mailer]
>
> DerivcedHandler is a derived class of CoinMessageHandler that sends the
> message to different streams depending on the externalNumber() of the
> message, and does seem to work (I can see Clp messages when solving a
> linear problem).
>
> An aside: I remember John (Forrest) suggesting the use of
> CbcMain0/CbcMain1 to use the CbcSolver. I just tried to look up the
> documentation for them in Cbc's Doxygen documentation, but was not able
> to find them at all. Does anyone know where I can find the doucmentation?
>
> Thanks in advance for any help!
>
> --Kish Shen
>


-- 
This e-mail may contain confidential and privileged material for the
sole use of the intended recipient. Any review, use, distribution or
disclosure by others is strictly prohibited. If you are not the intended
recipient (or authorized to receive for the recipient), please contact
the sender by reply e-mail and delete all copies of this message.
Cisco Systems Limited (Company Number: 02558939), is registered in
England and Wales with its registered office at 1 Callaghan Square,
Cardiff, South Glamorgan CF10 5BT.



More information about the Cbc mailing list