<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=us-ascii">
<META content="MSHTML 6.00.2900.2873" name=GENERATOR></HEAD>
<BODY>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2>I've used both and don't have a strong preference
either way. </FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2>In the past, valgrind has a tendency to seg-fault randomly,
and sometimes it gives back false positives - or, at least, I have searched high
and low and cannot find the reason for a memcheck warning/error. Purify has
never given me a false positive - I think its an excellent product. Quantify
(part of the Rational Purify Plus suite) is also an excellent product for
profiling. I have not found anything that comes even close to
Quantify.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2>Purify includes a nice GUI with some interactive features,
which also makes it slightly better than valgrind. Purify/Quantify also
integrate nicely with Visual Studio. That being said, Purify/Quantify costs $$
and valgrind is free.</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2>Matt</FONT></SPAN></DIV>
<DIV dir=ltr align=left><SPAN class=608441017-24052006><FONT face=Arial
color=#0000ff size=2></FONT></SPAN> </DIV><BR>
<BLOCKQUOTE
style="PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #0000ff 2px solid; MARGIN-RIGHT: 0px">
<DIV class=OutlookMessageHeader lang=en-us dir=ltr align=left>
<HR tabIndex=-1>
<FONT face=Tahoma size=2><B>From:</B> coin-discuss-bounces@list.coin-or.org
[mailto:coin-discuss-bounces@list.coin-or.org] <B>On Behalf Of </B>Leo
Lopes<BR><B>Sent:</B> Wednesday, May 24, 2006 12:19 PM<BR><B>To:</B>
Discussions about open source software for Operations
Research<BR><B>Subject:</B> (offtopic: Purify and Valgrind) Re: [Coin-discuss]
Purify UMRCoinFactorization::pivotOneOtherRow<BR></FONT><BR></DIV>
<DIV></DIV>I've used valgrind before, sparingly, but never purify. Do you guys
have experience with both? Comments on one versus the
other?<BR><BR>TIA,<BR>Leo.<BR><BR>
<DIV><SPAN class=gmail_quote>On 5/23/06, <B class=gmail_sendername>John J
Forrest</B> <<A href="mailto:jjforre@us.ibm.com">jjforre@us.ibm.com</A>>
wrote:</SPAN>
<BLOCKQUOTE class=gmail_quote
style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">
<DIV><BR><FONT face=sans-serif size=2>That one is OK. There used to be
a define of ZEROFAULT if -g but it seems to have vanished.</FONT>
<BR><BR><FONT face=sans-serif size=2>Just define ZEROFAULT and Purify should
be happy.</FONT> <BR><BR><FONT face=sans-serif size=2>John</FONT>
<BR><BR><BR>
<TABLE width="100%">
<TBODY>
<TR vAlign=top>
<TD width="40%"><FONT face=sans-serif size=1><B>"Matthew Galati"
<<A onclick="return top.js.OpenExtLink(window,event,this)"
href="mailto:Matthew.Galati@sas.com"
target=_blank>Matthew.Galati@sas.com</A>></B> </FONT><BR><FONT
face=sans-serif size=1>Sent by: <A
onclick="return top.js.OpenExtLink(window,event,this)"
href="mailto:coin-discuss-bounces@list.coin-or.org"
target=_blank>coin-discuss-bounces@list.coin-or.org</A></FONT>
<P><FONT face=sans-serif size=1>05/24/2006 03:32 AM</FONT>
<TABLE border=1>
<TBODY>
<TR vAlign=top>
<TD bgColor=white>
<DIV align=center><FONT face=sans-serif size=1>Please respond
to<BR>Discussions about open source software for Operations
Research <<A
onclick="return top.js.OpenExtLink(window,event,this)"
href="mailto:coin-discuss@list.coin-or.org"
target=_blank>coin-discuss@list.coin-or.org</A>></FONT></DIV></TD></TR></TBODY></TABLE><BR></P></TD>
<TD width="59%">
<TABLE width="100%">
<TBODY>
<TR vAlign=top>
<TD>
<DIV align=right><FONT face=sans-serif size=1>To</FONT></DIV></TD>
<TD><FONT face=sans-serif size=1>"Discussions about open source
software for Operations Research" <<A
onclick="return top.js.OpenExtLink(window,event,this)"
href="mailto:coin-discuss@list.coin-or.org"
target=_blank>coin-discuss@list.coin-or.org</A>></FONT>
</TD></TR>
<TR vAlign=top>
<TD>
<DIV align=right><FONT face=sans-serif size=1>cc</FONT></DIV></TD>
<TD><BR></TD></TR>
<TR vAlign=top>
<TD>
<DIV align=right><FONT face=sans-serif
size=1>Subject</FONT></DIV></TD>
<TD><FONT face=sans-serif size=1>[Coin-discuss] Purify UMR
CoinFactorization::pivotOneOtherRow</FONT></TD></TR></TBODY></TABLE><BR>
<TABLE>
<TBODY>
<TR vAlign=top>
<TD><BR></TD>
<TD><BR></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE></DIV>
<DIV><SPAN class=e id=q_10b6521763e27a5e_1><BR><BR><BR><TT><FONT size=2>I
recall CLP ignoring some UMR's in past postings. This one comes up a lot -
is it safe?<BR><BR>Matt<BR><BR><BR><BR>[I] Starting Purify'd
C:\cygwin\home\magala\sasopt\cbuild\exemilpNET03\exemilp\Debug\exemilp.exe
at 05/23/2006 21:27:41<BR>[I] Starting main<BR>[W] UMR: Uninitialized memory
read in CoinFactorization::pivotOneOtherRow(int,int) {47
occurrences}<BR> Reading 4 bytes from 0x038fda50
(4 bytes at 0x038fda50 uninitialized)<BR> Address
0x038fda50 is 11000 bytes into a 234016 byte block at 0x038faf58<BR>
Address 0x038fda50 points to a C++ new block in heap
0x00390000<BR> Thread ID: 0xb4c<BR>
Error location<BR>
CoinFactorization::pivotOneOtherRow(int,int)
[c:\cygwin\home\magala\coin\coin\coinfactorization1.cpp:1949]<BR>
if ( i + 1 < endColumn ) {<BR>
#endif<BR>
nextIRow = indexRowU_[i +
1];<BR> =>
nextValue = elementU_[i + 1];<BR>
#ifdef ZEROFAULT<BR>
}<BR>
#endif<BR>
CoinFactorization::factorSparse(void)
[c:\cygwin\home\magala\coin\coin\coinfactorization2.cpp:322]<BR>
break;<BR>
}<BR>
} else {<BR>
=> if (
!pivotOneOtherRow ( pivotRow, pivotColumn ) ) {<BR>
status = -99;<BR>
count=biggerDimension_+1;<BR>
break;<BR>
CoinFactorization::factor(void)
[c:\cygwin\home\magala\coin\coin\coinfactorization1.cpp:980]<BR>
CoinFactorization::factor (
)<BR>
{<BR>
//sparse<BR> =>
status_ = factorSparse ( );<BR>
switch ( status_ ) {<BR>
case 0:
//finished<BR>
totalElements_ = 0;<BR>
ClpFactorization::factorize(ClpSimplex *,int,bool)
[c:\cygwin\home\magala\coin\clp\clpfactorization.cpp:361]<BR>
preProcess ( 2
);<BR>
else<BR>
preProcess ( 3 ); // no row copy<BR>
=> factor ( );<BR>
if (status_==-99)
{<BR>
// get more memory<BR>
areaFactor(2.0*areaFactor());<BR>
ClpSimplex::internalFactorize(int)
[c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:1395]<BR>
exit(0);<BR>
k++;<BR>
}<BR>
=> int status =
factorization_->factorize(this, solveType,valuesPass);<BR>
if (status) {<BR>
handler_->message(CLP_SIMPLEX_BADFACTOR,messages_)<BR>
<<status<BR>
ClpSimplexDual::statusOfProblemInDual(int&,int,double
*,ClpDataSave&,int)
[c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:3292]<BR>
dualRowPivot_->saveWeights(this,1);<BR>
if (type) {<BR>
// is factorization
okay?<BR> =>
if (internalFactorize(1)) {<BR>
// no - restore previous basis<BR>
unflagVariables = false;<BR>
assert (type==1);<BR>
ClpSimplexDual::gutsOfDual(int,double
*&,int,ClpDataSave&)
[c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:388]<BR>
}<BR>
// may factorize,
checks if problem finished<BR>
statusOfProblemInDual(lastCleaned,factorType,saveDuals,data,<BR>
=>
ifValuesPass);<BR>
// If values pass then do easy ones on first time<BR>
if
(ifValuesPass&&<BR>
progress_->lastIterationNumber(0)<0&&saveDuals)
{<BR> ClpSimplexDual::dual(int,int)
[c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:452]<BR>
int
initialStatus=problemStatus_;<BR>
<BR>
if (!returnCode)<BR> =>
gutsOfDual(ifValuesPass,saveDuals,initialStatus,data);<BR>
if
(problemStatus_==10)<BR>
startFinishOptions |= 1;<BR>
finishSolve(startFinishOptions);<BR>
ClpSimplex::dual(int,int)
[c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:4408]<BR>
<BR>
As far as I can see this is
perfectly safe.<BR>
*/<BR> => int
returnCode = ((ClpSimplexDual *) this)->dual(ifValuesPass,
startFinishOptions);<BR>
if
((specialOptions_&2048)!=0&&problemStatus_==10&&!numberPrimalInfeasibilities_<BR>
&&sumDualInfeasibilities_<1000.0*dualTolerance_&&perturbation_>=100)<BR>
problemStatus_=0; // ignore<BR>
OsiClpSolverInterface::resolve(void)
[c:\cygwin\home\magala\coin\osi\osiclp\osiclpsolverinterface.cpp:475]<BR>
}<BR>
} else {<BR>
if((specialOptions_&1)==0) {<BR>
=>
modelPtr_->dual(0,startFinishOptions);<BR>
} else {<BR>
crunch();<BR>
}<BR> Allocation
location<BR> new(UINT)
[f:\vs70builds\3077\vc\crtbld\crt\src\newop.cpp:10]<BR>
<>=(UINT)
[f:\vs70builds\3077\vc\crtbld\crt\src\newaop.cpp:7]<BR>
CoinFactorization::getAreas(int,int,int,int)
[c:\cygwin\home\magala\coin\coin\coinfactorization1.cpp:616]<BR>
lengthAreaU_ =
(CoinBigIndex) (areaFactor_*lengthAreaU_);<BR>
lengthAreaL_ =
(CoinBigIndex) (areaFactor_*lengthAreaL_);<BR>
}<BR>
=> elementU_ = new double [ lengthAreaU_
];<BR>
indexRowU_ = new int [ lengthAreaU_ ];<BR>
indexColumnU_ = new int [ lengthAreaU_
];<BR>
elementL_ = new double [ lengthAreaL_ ];<BR>
ClpFactorization::factorize(ClpSimplex *,int,bool)
[c:\cygwin\home\magala\coin\clp\clpfactorization.cpp:315]<BR>
#else<BR>
getAreas (
numberRows,<BR>
numberRowBasic+numberColumnBasic,
numberElements,<BR> =>
2 * numberElements );<BR>
#endif<BR>
//fill<BR>
// Fill in counts so
we can skip part of preProcess<BR>
ClpSimplex::internalFactorize(int)
[c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:1395]<BR>
exit(0);<BR>
k++;<BR>
}<BR>
=> int status =
factorization_->factorize(this, solveType,valuesPass);<BR>
if (status) {<BR>
handler_->message(CLP_SIMPLEX_BADFACTOR,messages_)<BR>
<<status<BR>
ClpSimplexDual::statusOfProblemInDual(int&,int,double
*,ClpDataSave&,int)
[c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:3292]<BR>
dualRowPivot_->saveWeights(this,1);<BR>
if (type) {<BR>
// is factorization
okay?<BR> =>
if (internalFactorize(1)) {<BR>
// no - restore previous basis<BR>
unflagVariables = false;<BR>
assert (type==1);<BR>
ClpSimplexDual::gutsOfDual(int,double
*&,int,ClpDataSave&)
[c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:388]<BR>
}<BR>
// may factorize,
checks if problem finished<BR>
statusOfProblemInDual(lastCleaned,factorType,saveDuals,data,<BR>
=>
ifValuesPass);<BR>
// If values pass then do easy ones on first time<BR>
if
(ifValuesPass&&<BR>
progress_->lastIterationNumber(0)<0&&saveDuals)
{<BR> ClpSimplexDual::dual(int,int)
[c:\cygwin\home\magala\coin\clp\clpsimplexdual.cpp:452]<BR>
int
initialStatus=problemStatus_;<BR>
<BR>
if (!returnCode)<BR> =>
gutsOfDual(ifValuesPass,saveDuals,initialStatus,data);<BR>
if
(problemStatus_==10)<BR>
startFinishOptions |= 1;<BR>
finishSolve(startFinishOptions);<BR>
ClpSimplex::dual(int,int)
[c:\cygwin\home\magala\coin\clp\clpsimplex.cpp:4408]<BR>
<BR>
As far as I can see this is
perfectly safe.<BR>
*/<BR> => int
returnCode = ((ClpSimplexDual *) this)->dual(ifValuesPass,
startFinishOptions);<BR>
if
((specialOptions_&2048)!=0&&problemStatus_==10&&!numberPrimalInfeasibilities_<BR>
&&sumDualInfeasibilities_<1000.0*dualTolerance_&&perturbation_>=100)<BR>
problemStatus_=0; // ignore<BR>
OsiClpSolverInterface::resolve(void)
[c:\cygwin\home\magala\coin\osi\osiclp\osiclpsolverinterface.cpp:475]<BR>
}<BR>
} else {<BR>
if((specialOptions_&1)==0) {<BR>
=>
modelPtr_->dual(0,startFinishOptions);<BR>
} else {<BR>
crunch();<BR>
}<BR><BR><BR><BR><BR>_______________________________________________<BR>Coin-discuss
mailing list<BR><A onclick="return top.js.OpenExtLink(window,event,this)"
href="mailto:Coin-discuss@list.coin-or.org"
target=_blank>Coin-discuss@list.coin-or.org</A><BR><A
onclick="return top.js.OpenExtLink(window,event,this)"
href="http://list.coin-or.org/mailman/listinfo/coin-discuss"
target=_blank>http://list.coin-or.org/mailman/listinfo/coin-discuss</A><BR></FONT></TT><BR></SPAN></DIV><BR>_______________________________________________<BR>Coin-discuss
mailing list<BR><A onclick="return top.js.OpenExtLink(window,event,this)"
href="mailto:Coin-discuss@list.coin-or.org">Coin-discuss@list.coin-or.org
</A><BR><A onclick="return top.js.OpenExtLink(window,event,this)"
href="http://list.coin-or.org/mailman/listinfo/coin-discuss"
target=_blank>http://list.coin-or.org/mailman/listinfo/coin-discuss</A><BR><BR><BR></BLOCKQUOTE></DIV><BR><BR
clear=all><BR>--
<BR>========================================================================<BR>Leonardo
B.
Lopes <A
href="mailto:leo@sie.arizona.edu">leo@sie.arizona.edu</A><BR>Assistant
Professor (520)621-2342<BR>SIE
- University of Arizona <A
href="http://www.sie.arizona.edu/faculty/leolopes">http://www.sie.arizona.edu/faculty/leolopes</A><BR></BLOCKQUOTE></BODY></HTML>