1
1
module OptimizationPRIMA
2
2
3
- using PRIMA, Optimization, Optimization. SciMLBase
3
+ using PRIMA, Optimization, Optimization. SciMLBase, SparseArrays
4
+ import ModelingToolkit, ModelingToolkit. Symbolics
4
5
5
6
abstract type PRIMASolvers end
6
7
@@ -19,6 +20,10 @@ function SciMLBase.__init(prob::SciMLBase.OptimizationProblem, opt::PRIMASolvers
19
20
data = Optimization. DEFAULT_DATA;
20
21
callback = (args... ) -> (false ),
21
22
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
22
27
return OptimizationCache (prob, opt, data; callback, progress,
23
28
kwargs... )
24
29
end
@@ -127,11 +132,33 @@ function SciMLBase.__solve(cache::OptimizationCache{
127
132
128
133
t0 = time ()
129
134
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)
130
157
function fwcons (θ, res)
131
- cache . f . cons (res, θ, cache . p )
158
+ nonlincons (res, θ)
132
159
return _loss (θ)
133
160
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... )
135
162
elseif cache. opt isa LINCOA
136
163
(minx, minf, nf, rc, cstrv) = optfunc (_loss, cache. u0; kws... )
137
164
else
0 commit comments