Skip to content

Commit

Permalink
Use linearity detection, wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Vaibhavdixit02 committed Oct 19, 2023
1 parent 6d92f53 commit 4357b5d
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 4 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.DS_Store
/Manifest.toml
Manifest.toml
/dev/
/docs/build/
.vscode
2 changes: 2 additions & 0 deletions lib/OptimizationPRIMA/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ authors = ["Vaibhav Dixit <[email protected]> and contributors"]
version = "1.0.0-DEV"

[deps]
ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78"
Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba"
PRIMA = "0a7d04aa-8ac2-47b3-b7a7-9dbd6ad661ed"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"

[compat]
julia = "1"
Expand Down
33 changes: 30 additions & 3 deletions lib/OptimizationPRIMA/src/OptimizationPRIMA.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module OptimizationPRIMA

using PRIMA, Optimization, Optimization.SciMLBase
using PRIMA, Optimization, Optimization.SciMLBase, SparseArrays
import ModelingToolkit, ModelingToolkit.Symbolics

abstract type PRIMASolvers end

Expand All @@ -19,6 +20,10 @@ function SciMLBase.__init(prob::SciMLBase.OptimizationProblem, opt::PRIMASolvers
data = Optimization.DEFAULT_DATA;
callback = (args...) -> (false),
progress = false, kwargs...)
if opt isa COBYLA
sys = ModelingToolkit.modelingtoolkitize(prob)
prob = OptimizationProblem(sys, prob.u0, prob.p; lb = prob.lb, ub = prob.ub, cons_sparse = true)
end
return OptimizationCache(prob, opt, data; callback, progress,
kwargs...)
end
Expand Down Expand Up @@ -127,11 +132,33 @@ function SciMLBase.__solve(cache::OptimizationCache{

t0 = time()
if cache.opt isa COBYLA
lininds = Int[]
nonlininds = Int[]
symboliclinexpr = []
for i in eachindex(cache.f.cons_expr)
println(cache.f.cons_expr[i])
println(isempty(cache.f.cons_hess_prototype[i]))
if isempty(cache.f.cons_hess_prototype[i])
push!(lininds, i)
symbolicexpr = Symbolics.parse_expr_to_symbolic(cache.f.cons_expr[i], (@__MODULE__,))
println(symbolicexpr)
push!(symboliclinexpr, symbolicexpr)
else
push!(nonlininds, i)
end
end
res1 = zeros(length(cache.f.cons_expr))
nonlincons = (res, θ) -> (cache.f.cons(res1, θ); res .= res1[nonlininds])
println(symboliclinexpr)
A = hcat(res1[lininds]...)
println(A)
b = cache.lcons[lininds]
println(b)
function fwcons(θ, res)
cache.f.cons(res, θ, cache.p)
nonlincons(res, θ)
return _loss(θ)
end
(minx, minf, nf, rc, cstrv) = optfunc(fwcons, cache.u0; kws...)
(minx, minf, nf, rc, cstrv) = optfunc(fwcons, cache.u0; linear_eq = (A, b), nonlinear_ineq = length(nonlininds), kws...)
elseif cache.opt isa LINCOA
(minx, minf, nf, rc, cstrv) = optfunc(_loss, cache.u0; kws...)
else
Expand Down
5 changes: 5 additions & 0 deletions lib/OptimizationPRIMA/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,9 @@ using Test
@test 10 * sol.objective < l1
@test_throws SciMLBase.IncompatibleOptimizerError Optimization.solve(prob, COBYLA(), maxiters = 1000)

function con2_c(res, x, p)
res .= [x[1] + x[2], x[2] * sin(x[1]) - x[1]]
end
optprob = OptimizationFunction(rosenbrock, cons = con2_c)
prob = OptimizationProblem(, x0, _p, lcons = [-Inf, -Inf], ucons = [Inf, Inf])
end

0 comments on commit 4357b5d

Please sign in to comment.