Skip to content

Commit

Permalink
WIP reducing SOS allocations
Browse files Browse the repository at this point in the history
  • Loading branch information
chriscoey committed Aug 22, 2018
1 parent 8668f73 commit 6d8449e
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 42 deletions.
6 changes: 3 additions & 3 deletions examples/namedpoly/namedpoly.jl
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,14 @@ function build_namedpoly!(alf::Alfonso.AlfonsoOpt, polyname::Symbol, d::Int)
return Alfonso.load_data!(alf, A, b, c, cone)
end

# alf = Alfonso.AlfonsoOpt(maxiter=100, verbose=false)
alf = Alfonso.AlfonsoOpt(maxiter=100, verbose=true)

# select the named polynomial to minimize and the SOS degree (to be squared)
# build_namedpoly!(alf, :butcher, 2)
# build_namedpoly!(alf, :caprasse, 4)
# build_namedpoly!(alf, :goldsteinprice, 7)
# build_namedpoly!(alf, :heart, 2)
# build_namedpoly!(alf, :lotkavolterra, 3)
build_namedpoly!(alf, :lotkavolterra, 3)
# build_namedpoly!(alf, :magnetism7, 2)
# build_namedpoly!(alf, :motzkin, 7)
# build_namedpoly!(alf, :reactiondiffusion, 4)
Expand All @@ -89,4 +89,4 @@ end
# build_namedpoly!(alf, :schwefel, 3)

# solve it
# @time Alfonso.solve!(alf)
@time Alfonso.solve!(alf)
12 changes: 6 additions & 6 deletions src/primitivecones.jl
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ loadpnt_prm!(prm::SumOfSquaresCone, pnt) = (prm.pnt = pnt)

function incone_prm(prm::SumOfSquaresCone)
# TODO each of the following choleskys can be done in parallel
prm.ippnt .= prm.ip'*Diagonal(prm.pnt)*prm.ip
F = cholesky!(Symmetric(prm.ippnt), check=false) # TODO use structure cholesky of P'DP to speed up chol?
@time prm.ippnt .= prm.ip'*Diagonal(prm.pnt)*prm.ip
@time F = cholesky!(Symmetric(prm.ippnt), check=false) # TODO use structure cholesky of P'DP to speed up chol? maybe LDLT type decomp precomputed, change diag
if !issuccess(F)
return false
end
prm.Vp .= F.L\prm.ip' # TODO do in-place
prm.VtVp .= prm.Vp'*prm.Vp
prm.gtmp .= -diag(prm.VtVp)
prm.Htmp .= prm.VtVp.^2
@time ldiv!(prm.Vp, F.L, prm.ip')
@time mul!(prm.VtVp, prm.Vp', prm.Vp)
@time prm.gtmp .= diag(prm.VtVp) .* -1.0
@time prm.Htmp .= prm.VtVp.^2

for j in 1:length(prm.ipwt)
prm.ipwtpnt[j] .= prm.ipwt[j]'*Diagonal(prm.pnt)*prm.ipwt[j]
Expand Down
66 changes: 33 additions & 33 deletions test/nativeexamples.jl
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@

@testset "large dense lp example (dense methods)" begin
alf = Alfonso.AlfonsoOpt(verbose=verbflag)
build_lp!(alf, 500, 1000, use_data=true)
@time Alfonso.solve!(alf)
@test Alfonso.get_status(alf) == :Optimal
@test Alfonso.get_pobj(alf) 2055.807 atol=1e-4 rtol=1e-4
@test Alfonso.get_dobj(alf) 2055.807 atol=1e-4 rtol=1e-4
end

@testset "large sparse lp example (sparse methods)" begin
alf = Alfonso.AlfonsoOpt(verbose=verbflag)
build_lp!(alf, 500, 1000, dense=false)
@time Alfonso.solve!(alf)
@test Alfonso.get_status(alf) == :Optimal
@test Alfonso.get_pobj(alf) Alfonso.get_dobj(alf) atol=1e-4 rtol=1e-4
end

@testset "small dense lp example (dense vs sparse methods)" begin
# dense methods
d_alf = Alfonso.AlfonsoOpt(verbose=verbflag)
build_lp!(d_alf, 50, 100, dense=true, tosparse=false)
@time Alfonso.solve!(d_alf)
@test Alfonso.get_status(d_alf) == :Optimal

# sparse methods
s_alf = Alfonso.AlfonsoOpt(verbose=verbflag)
build_lp!(s_alf, 50, 100, dense=true, tosparse=true)
@time Alfonso.solve!(s_alf)
@test Alfonso.get_status(s_alf) == :Optimal

@test Alfonso.get_pobj(d_alf) Alfonso.get_pobj(s_alf) atol=1e-4 rtol=1e-4
@test Alfonso.get_dobj(d_alf) Alfonso.get_dobj(s_alf) atol=1e-4 rtol=1e-4
end
# @testset "large dense lp example (dense methods)" begin
# alf = Alfonso.AlfonsoOpt(verbose=verbflag)
# build_lp!(alf, 500, 1000, use_data=true)
# @time Alfonso.solve!(alf)
# @test Alfonso.get_status(alf) == :Optimal
# @test Alfonso.get_pobj(alf) ≈ 2055.807 atol=1e-4 rtol=1e-4
# @test Alfonso.get_dobj(alf) ≈ 2055.807 atol=1e-4 rtol=1e-4
# end
#
# @testset "large sparse lp example (sparse methods)" begin
# alf = Alfonso.AlfonsoOpt(verbose=verbflag)
# build_lp!(alf, 500, 1000, dense=false)
# @time Alfonso.solve!(alf)
# @test Alfonso.get_status(alf) == :Optimal
# @test Alfonso.get_pobj(alf) ≈ Alfonso.get_dobj(alf) atol=1e-4 rtol=1e-4
# end
#
# @testset "small dense lp example (dense vs sparse methods)" begin
# # dense methods
# d_alf = Alfonso.AlfonsoOpt(verbose=verbflag)
# build_lp!(d_alf, 50, 100, dense=true, tosparse=false)
# @time Alfonso.solve!(d_alf)
# @test Alfonso.get_status(d_alf) == :Optimal
#
# # sparse methods
# s_alf = Alfonso.AlfonsoOpt(verbose=verbflag)
# build_lp!(s_alf, 50, 100, dense=true, tosparse=true)
# @time Alfonso.solve!(s_alf)
# @test Alfonso.get_status(s_alf) == :Optimal
#
# @test Alfonso.get_pobj(d_alf) ≈ Alfonso.get_pobj(s_alf) atol=1e-4 rtol=1e-4
# @test Alfonso.get_dobj(d_alf) ≈ Alfonso.get_dobj(s_alf) atol=1e-4 rtol=1e-4
# end

# @testset "poly envelope example" begin
# alf = Alfonso.AlfonsoOpt(verbose=verbflag)
Expand Down

0 comments on commit 6d8449e

Please sign in to comment.