We could consider not to throw in cholfact but only when the factorization 
is applied. This is what we do for LU and BunchKaufman.

On Saturday, June 11, 2016 at 5:02:55 PM UTC-4, Tony Kelman wrote:
>
> 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 vav...@uwaterloo.ca 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, vav...@uwaterloo.ca 
>> 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