Skip to content

Commit 6ebae68

Browse files
Add new NLPModelMeta constructor (#471)
* Add meta constructor Co-authored-by: Tangi Migot <tangi.migot@gmail.com>
1 parent 1534231 commit 6ebae68

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

src/nlp/meta.jl

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ Some of their components may be infinite to indicate that the corresponding boun
2626
2727
---
2828
29-
NLPModelMeta(nvar; kwargs...)
29+
NLPModelMeta(nvar::Integer; kwargs...)
30+
NLPModelMeta(meta::AbstractNLPModelMeta; kwargs...)
3031
3132
Create an `NLPModelMeta` with `nvar` variables.
33+
Alternatively, create an `NLPModelMeta` copy from another `AbstractNLPModelMeta`.
3234
The following keyword arguments are accepted:
3335
- `x0`: initial guess
3436
- `lvar`: vector of lower bounds
@@ -214,9 +216,56 @@ function NLPModelMeta{T, S}(
214216
)
215217
end
216218

217-
NLPModelMeta(nvar; x0::S = zeros(nvar), kwargs...) where {S} =
219+
NLPModelMeta(nvar::Int; x0::S = zeros(nvar), kwargs...) where {S} =
218220
NLPModelMeta{eltype(S), S}(nvar, x0 = x0; kwargs...)
219221

222+
function NLPModelMeta(
223+
meta::AbstractNLPModelMeta{T, S};
224+
nvar::Int = meta.nvar,
225+
x0::S = meta.x0,
226+
lvar::S = meta.lvar,
227+
uvar::S = meta.uvar,
228+
nlvb = meta.nlvb,
229+
nlvo = meta.nlvo,
230+
nlvc = meta.nlvc,
231+
ncon = meta.ncon,
232+
y0::S = meta.y0,
233+
lcon::S = meta.lcon,
234+
ucon::S = meta.ucon,
235+
nnzo = meta.nnzo,
236+
nnzj = meta.nnzj,
237+
lin_nnzj = meta.lin_nnzj,
238+
nln_nnzj = meta.nln_nnzj,
239+
nnzh = meta.nnzh,
240+
lin = meta.lin,
241+
minimize = meta.minimize,
242+
islp = meta.islp,
243+
name = meta.name,
244+
) where {T, S}
245+
NLPModelMeta{T, S}(
246+
nvar,
247+
x0 = x0,
248+
lvar = lvar,
249+
uvar = uvar,
250+
nlvb = nlvb,
251+
nlvo = nlvo,
252+
nlvc = nlvc,
253+
ncon = ncon,
254+
y0 = y0,
255+
lcon = lcon,
256+
ucon = ucon,
257+
nnzo = nnzo,
258+
nnzj = nnzj,
259+
lin_nnzj = lin_nnzj,
260+
nln_nnzj = nln_nnzj,
261+
nnzh = nnzh,
262+
lin = lin,
263+
minimize = minimize,
264+
islp = islp,
265+
name = name,
266+
)
267+
end
268+
220269
"""
221270
reset_data!(nlp)
222271

test/nlp/meta.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
11
@testset "A problem with zero variables doesn't make sense." begin
22
@test_throws ErrorException NLPModelMeta(0)
33
end
4+
5+
@testset "Meta copier." begin
6+
nlp = SimpleNLPModel()
7+
8+
# Check simple copy
9+
meta = NLPModelMeta(nlp.meta)
10+
for field in fieldnames(typeof(nlp.meta))
11+
@test getfield(nlp.meta, field) == getfield(meta, field)
12+
end
13+
14+
modif = Dict(:nnzh => 1, :x0 => [2.0; 2.0; 0.0], :nvar => 3, :lvar => zeros(3), :uvar => [1.0; 1.0; 0.0])
15+
meta = NLPModelMeta(nlp.meta; modif...)
16+
17+
for field in setdiff(fieldnames(typeof(nlp.meta)), union(keys(modif),[:ifix]))
18+
@test getfield(nlp.meta, field) == getfield(meta, field)
19+
end
20+
for field in keys(modif)
21+
@test getfield(meta, field) == modif[field]
22+
end
23+
@test meta.ifix == [3]
24+
end

0 commit comments

Comments
 (0)