<!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>