For now, you can just manually make the same cholmod calls that cholfact 
does, then use the same check that cholfact is currently using for throwing 
a PosDefException, to instead return false (or use the just-computed 
factorization as desired, when it succeeds) - see 
https://github.com/JuliaLang/julia/blob/9ab1519db4ab8c525f84fce542bfc463d9a2b071/base/sparse/cholmod.jl#L1270-L1285

This would likely be faster than the current try-catch implementation of 
isposdef, but involve a bit of repeated code.


On Friday, June 10, 2016 at 9:26:55 PM UTC-7, Tim Holy wrote:
>
> Two other advantages of just biting the bullet and implementing this for 
> PositiveFactorizations: 
> - there is no iteration step; the first time you try to factor it, it 
> works. 
> - when you think about it, the classic approach of adding a diagonal 
> factor is 
> (in my humble opinion) wrong, wrong, wrong. See the discussion linked from 
> the 
> PositiveFactorization README. 
>
> Best, 
> --Tim 
>
> On Friday, June 10, 2016 5:22:03 PM CDT [email protected] <javascript:> 
> wrote: 
> > Dear Viral and Tim, 
> > 
> > Thanks for your prompt responses to my query.  I should have stated more 
> > precisely how I am using positive definiteness testing.  The application 
> is 
> > a classic trust-region method for optimization.  In a trust region 
> method, 
> > the main operation is as follows.  The input is a symmetric (typically 
> > sparse) matrix A and a vector b.  The problem is to compute a certain 
> real 
> > parameter lambda.  One tests if A + lambda*speye(n) is positive 
> definite; 
> > if so, then one solves a linear system with this coefficient matrix, and 
> if 
> > not, one increases lambda and tries again. 
> > 
> > So the problem with using isposdef is that, in the case that A is 
> actually 
> > positive definite, isposdef discards the Cholesky factor, so then my 
> > application would need to compute it again (redundantly) to solve the 
> > system.  In the case of the PostiveFactorizations.jl package, it appears 
> > that the package is aimed at dense rather than sparse matrices. 
> > 
> > So aside from rewriting cholfact, it seems that the only remaining 
> solution 
> > is Viral's suggestion to catch an exception from cholfact.  This raises 
> > another question.  Most C++ textbooks advise against using exceptions 
> for 
> > ordinary control-flow on the grounds that throwing and catching an 
> > exception is a time-consuming operation.  How about in Julia?  Is it 
> > reasonable to use try/throw/catch for ordinary control flow in a 
> scientific 
> > code?  The Julia manual states that exceptions are much slower than if 
> > statements.  But on the other hand, isposdef in cholmod.jl is written in 
> > terms of exceptions! 
> > 
> > Thanks, 
> > Steve 
> > 
> > On Thursday, June 9, 2016 at 10:16:29 PM UTC-4, [email protected] 
> wrote: 
> > > In Matlab to check if a symmetric sparse matrix is positive definite, 
> I 
> > > can say [R,p]=chol(A) and then if p>0 etc.  Is this functionality 
> > > available 
> > > in Julia?  The cholfact standard routine throws an exception if its 
> > > argument is not positive definite rather than returning any helpful 
> > > information. 
> > > 
> > > I looked at the code for cholfact in cholmod.jl in Base; it appears 
> that I 
> > > can write a modified version of cholfact that exposes this 
> functionality. 
> > > But it would be better if the functionality were available in the 
> library 
> > > so that my code is not sensitive to changes in undocumented low-level 
> > > routines. 
> > > 
> > > Thanks, 
> > > Steve Vavasis 
>
>
>

Reply via email to