Skip to content

Commit 4357b5d

Browse files
Use linearity detection, wip
1 parent 6d92f53 commit 4357b5d

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
.DS_Store
2-
/Manifest.toml
2+
Manifest.toml
33
/dev/
44
/docs/build/
55
.vscode

lib/OptimizationPRIMA/Project.toml

+2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ authors = ["Vaibhav Dixit <[email protected]> and contributors"]
44
version = "1.0.0-DEV"
55

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

1012
[compat]
1113
julia = "1"

lib/OptimizationPRIMA/src/OptimizationPRIMA.jl

+30-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module OptimizationPRIMA
22

3-
using PRIMA, Optimization, Optimization.SciMLBase
3+
using PRIMA, Optimization, Optimization.SciMLBase, SparseArrays
4+
import ModelingToolkit, ModelingToolkit.Symbolics
45

56
abstract type PRIMASolvers end
67

@@ -19,6 +20,10 @@ function SciMLBase.__init(prob::SciMLBase.OptimizationProblem, opt::PRIMASolvers
1920
data = Optimization.DEFAULT_DATA;
2021
callback = (args...) -> (false),
2122
progress = false, kwargs...)
23+
if opt isa COBYLA
24+
sys = ModelingToolkit.modelingtoolkitize(prob)
25+
prob = OptimizationProblem(sys, prob.u0, prob.p; lb = prob.lb, ub = prob.ub, cons_sparse = true)
26+
end
2227
return OptimizationCache(prob, opt, data; callback, progress,
2328
kwargs...)
2429
end
@@ -127,11 +132,33 @@ function SciMLBase.__solve(cache::OptimizationCache{
127132

128133
t0 = time()
129134
if cache.opt isa COBYLA
135+
lininds = Int[]
136+
nonlininds = Int[]
137+
symboliclinexpr = []
138+
for i in eachindex(cache.f.cons_expr)
139+
println(cache.f.cons_expr[i])
140+
println(isempty(cache.f.cons_hess_prototype[i]))
141+
if isempty(cache.f.cons_hess_prototype[i])
142+
push!(lininds, i)
143+
symbolicexpr = Symbolics.parse_expr_to_symbolic(cache.f.cons_expr[i], (@__MODULE__,))
144+
println(symbolicexpr)
145+
push!(symboliclinexpr, symbolicexpr)
146+
else
147+
push!(nonlininds, i)
148+
end
149+
end
150+
res1 = zeros(length(cache.f.cons_expr))
151+
nonlincons = (res, θ) -> (cache.f.cons(res1, θ); res .= res1[nonlininds])
152+
println(symboliclinexpr)
153+
A = hcat(res1[lininds]...)
154+
println(A)
155+
b = cache.lcons[lininds]
156+
println(b)
130157
function fwcons(θ, res)
131-
cache.f.cons(res, θ, cache.p)
158+
nonlincons(res, θ)
132159
return _loss(θ)
133160
end
134-
(minx, minf, nf, rc, cstrv) = optfunc(fwcons, cache.u0; kws...)
161+
(minx, minf, nf, rc, cstrv) = optfunc(fwcons, cache.u0; linear_eq = (A, b), nonlinear_ineq = length(nonlininds), kws...)
135162
elseif cache.opt isa LINCOA
136163
(minx, minf, nf, rc, cstrv) = optfunc(_loss, cache.u0; kws...)
137164
else

lib/OptimizationPRIMA/test/runtests.jl

+5
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,9 @@ using Test
1818
@test 10 * sol.objective < l1
1919
@test_throws SciMLBase.IncompatibleOptimizerError Optimization.solve(prob, COBYLA(), maxiters = 1000)
2020

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

0 commit comments

Comments
 (0)