Skip to content
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

Support sparsity #41

Closed
wants to merge 6 commits into from
Closed

Support sparsity #41

wants to merge 6 commits into from

Conversation

akshay326
Copy link
Collaborator

in light of #31

@akshay326
Copy link
Collaborator Author

tested differentiating simple LP - https://github.com/AKS1996/jump-gsoc-2020/blob/master/DiffOpt_time_benchmarking.ipynb

just adding support as basic SparseArrays reduced memory usage to a quarter

BenchmarkTools.Trial: 
  memory estimate:  38.50 MiB
  allocs estimate:  229521
  --------------
  minimum time:     78.738 ms (2.75% GC)
  median time:      83.476 ms (5.46% GC)
  mean time:        84.282 ms (4.85% GC)
  maximum time:     94.965 ms (2.16% GC)
  --------------
  samples:          60
  evals/sample:     1

src/MOI_wrapper.jl Outdated Show resolved Hide resolved
src/MOI_wrapper.jl Outdated Show resolved Hide resolved
Q = [
# reshaping vectors to matrix
b = b[:, :]
c = c[:, :]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why do we need these two lines?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

reindex/convert SparseVector to SparseMatrix. turns out SparseVector's give error on multiplication

src/MOI_wrapper.jl Outdated Show resolved Hide resolved
src/MOI_wrapper.jl Outdated Show resolved Hide resolved
@@ -529,7 +531,7 @@ For more info, refer https://github.com/matbesancon/MathOptSetDistances.jl
Find gradient of projection of vectors in `v` on product of `cones`.
For more info, refer https://github.com/matbesancon/MathOptSetDistances.jl
"""
Dπ(cones, v) = MOSD.projection_gradient_on_set(MOSD.DefaultDistance(), v, cones)
Dπ(cones, v) = sparse(MOSD.projection_gradient_on_set(MOSD.DefaultDistance(), v, cones))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure if we force sparsity here or where Dπ is used

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep. i just wanted to test how much we can improve on benchmarking. projections aren't that sparse, and ideally MOSD should return sparse values

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

forcing sparsity of the type if the projection itself isn't sparse will result in poor performance

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, removing it from here


RHS = dQ * πz
if norm(RHS) <= 1e-4
dz = zeros(Float64, size(RHS))
dz = sparse(0.0I, size(RHS[:, :]))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need this [:,:] ?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yep, again RHS turns out to be a SparseVector

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed it

@akshay326
Copy link
Collaborator Author

i know i've added [:, :] too may times. i'll try to see where is it redundant

spzeros(n,n) dA' dc;
-dA spzeros(m,m) db;
-dc' -db' spzeros(1,1)
])
Copy link
Collaborator

@matbesancon matbesancon Sep 2, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this part is doing a copy for nothing

if:

[
    a  b  c
    a  b  c
]

creates an already sparse matrix, then sparse(result) will do a copy for nothing. If the result is not sparse, a dense array is built out of the sparse arrays, which is then re-converted to sparse.
It would be better to create an empty dQ with spzeros(n+m+1, n+m+1) and then fill the non-diagonal blocks
with
dQ[n+1:n+1+m,1:n] .= -dA
etc.

Same thing above for the creation of Q

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh. thanks for pointing out. never realized this redundant sparse-dense-sparse conversion

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the spzeros(1,1) can be replaced by just 0

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

@akshay326 akshay326 closed this Nov 5, 2020
@akshay326 akshay326 deleted the support_sparsity branch November 5, 2020 11:13
@matbesancon
Copy link
Collaborator

@Aks1996 why close this one?

@akshay326
Copy link
Collaborator Author

there's a lot of code that's outdated (removed coz of SCS or moved to MatOI). it'll be suitable to add sparsity support to MatOI too. Once DiffOpt builds w/o errors, I'll do memory benchmarking and open separate PRs to support sparsity

@akshay326
Copy link
Collaborator Author

if you want, we can open this one too

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants