-
Notifications
You must be signed in to change notification settings - Fork 98
[Bridges] Fix computing Q=U'U in QuadtoSOCBridge when Q has 0 eigenvalue #2931
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
|
I don't think the eivenvalue decomposition is wrong, just potentially expensive and, as a result, surprising to users. |
|
The alternative here is that we're going to error. I don't know if people solve problems with super large Q matrices? And need to use this bridge, and worry about performance? |
|
The suggestion from #1971 is to add LDLFactorizations as a package extension. |
| # triangular, but nothing says that it has to be. | ||
| E = LinearAlgebra.eigen(LinearAlgebra.Symmetric(Matrix(Q))) | ||
| if !all(isreal, E.values) || minimum(E.values) < 0 | ||
| error("Matrix is not PSD") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe give the minimal eigenvalue
|
Using eigenvalues as a fallback sounds like a good idea, maybe we should allow a small tolerance. Historically, we have allowed MathOptInterface.jl/src/Bridges/Constraint/bridges/SquareBridge.jl Lines 110 to 123 in 05cb226
We can use a very tight tolerance and only loosen it upon request. Maybe starting with 0 is good but it should be easy to find example of reasonable PSD matrices having negative eigenvalues like -1e-15
|
Closes #1971
There aren't many good options here.
My trivial test case is
(x + y)^2 / 2.The permissive options all fail:
LDLFactorizations.jl works:
but it requires us to add a GPL dependency.
This PR implements an option I don't think we've previously considered: do something that isn't upper triangular...
Am I missing something obviously wrong?