Skip to content

Commit f42e602

Browse files
authored
Change Vector to AbstracVector in template type (#4)
* use AbstractVector in template type instead of Vector * add tests for sparse vectors
1 parent a5373c5 commit f42e602

File tree

3 files changed

+133
-129
lines changed

3 files changed

+133
-129
lines changed

src/change_form.jl

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
function change_form(::Type{LPForm{T, AT}}, lp::LPForm) where {T, AT}
2-
return LPForm{T, AT}(
1+
function change_form(::Type{LPForm{T, AT, VT}}, lp::LPForm) where {T, AT, VT}
2+
return LPForm{T, AT, VT}(
33
lp.direction,
44
lp.c,
55
lp.A,
@@ -10,8 +10,8 @@ function change_form(::Type{LPForm{T, AT}}, lp::LPForm) where {T, AT}
1010
)
1111
end
1212

13-
function change_form(::Type{LPForm{T, AT}}, lp::LPStandardForm{T}) where {T, AT}
14-
return LPForm{T, AT}(
13+
function change_form(::Type{LPForm{T, AT, VT}}, lp::LPStandardForm{T}) where {T, AT, VT}
14+
return LPForm{T, AT, VT}(
1515
lp.direction,
1616
lp.c,
1717
lp.A,
@@ -21,8 +21,8 @@ function change_form(::Type{LPForm{T, AT}}, lp::LPStandardForm{T}) where {T, AT}
2121
fill(typemax(T), length(lp.c)),
2222
)
2323
end
24-
function change_form(::Type{LPForm{T, AT}}, lp::LPGeometricForm{T}) where {T, AT}
25-
return LPForm{T, AT}(
24+
function change_form(::Type{LPForm{T, AT, VT}}, lp::LPGeometricForm{T}) where {T, AT, VT}
25+
return LPForm{T, AT, VT}(
2626
lp.direction,
2727
lp.c,
2828
lp.A,
@@ -32,7 +32,7 @@ function change_form(::Type{LPForm{T, AT}}, lp::LPGeometricForm{T}) where {T, AT
3232
fill(typemax(T), length(lp.c)),
3333
)
3434
end
35-
function change_form(::Type{LPForm{T, AT}}, lp::LPSolverForm{T}) where {T, AT}
35+
function change_form(::Type{LPForm{T, AT, VT}}, lp::LPSolverForm{T}) where {T, AT, VT}
3636
c_lb = fill(typemin(T), length(lp.b))
3737
c_ub = fill(typemax(T), length(lp.b))
3838
for i in eachindex(lp.b)
@@ -47,7 +47,7 @@ function change_form(::Type{LPForm{T, AT}}, lp::LPSolverForm{T}) where {T, AT}
4747
error("invalid sign $(lp.senses[i])")
4848
end
4949
end
50-
return LPForm{T, AT}(
50+
return LPForm{T, AT, VT}(
5151
lp.direction,
5252
lp.c,
5353
lp.A,
@@ -58,15 +58,15 @@ function change_form(::Type{LPForm{T, AT}}, lp::LPSolverForm{T}) where {T, AT}
5858
)
5959
end
6060

61-
function change_form(::Type{LPGeometricForm{T, AT}}, lp::LPGeometricForm) where {T, AT}
62-
return LPGeometricForm{T, AT}(
61+
function change_form(::Type{LPGeometricForm{T, AT, VT}}, lp::LPGeometricForm) where {T, AT, VT}
62+
return LPGeometricForm{T, AT, VT}(
6363
lp.direction,
6464
lp.c,
6565
lp.A,
6666
lp.b
6767
)
6868
end
69-
function change_form(::Type{LPGeometricForm{T, AT}}, lp::LPForm{T}) where {T, AT}
69+
function change_form(::Type{LPGeometricForm{T, AT, VT}}, lp::LPForm{T}) where {T, AT, VT}
7070
has_c_upper = Int[]
7171
has_c_lower = Int[]
7272
sizehint!(has_c_upper, length(lp.c_ub))
@@ -104,27 +104,27 @@ function change_form(::Type{LPGeometricForm{T, AT}}, lp::LPForm{T}) where {T, AT
104104
lp.v_ub[has_v_upper],
105105
-lp.v_lb[has_v_lower],
106106
)
107-
return LPGeometricForm{T, AT}(
107+
return LPGeometricForm{T, AT, VT}(
108108
lp.direction,
109109
lp.c,
110110
new_A,
111111
new_b
112112
)
113113
end
114-
function change_form(::Type{LPGeometricForm{T, AT}}, lp::F) where {T, AT, F <: AbstractLPForm{T}}
115-
temp_lp = change_form(LPForm{T, AT}, lp)
116-
return change_form(LPGeometricForm{T, AT}, temp_lp)
114+
function change_form(::Type{LPGeometricForm{T, AT, VT}}, lp::F) where {T, AT, VT, F <: AbstractLPForm{T}}
115+
temp_lp = change_form(LPForm{T, AT, VT}, lp)
116+
return change_form(LPGeometricForm{T, AT, VT}, temp_lp)
117117
end
118118

119-
function change_form(::Type{LPStandardForm{T, AT}}, lp::LPStandardForm) where {T, AT}
119+
function change_form(::Type{LPStandardForm{T, AT, VT}}, lp::LPStandardForm) where {T, AT, VT}
120120
return LPStandardForm(
121121
lp.direction,
122122
lp.c,
123123
lp.A,
124124
lp.b
125125
)
126126
end
127-
function change_form(::Type{LPStandardForm{T, AT}}, lp::LPGeometricForm{T}) where {T, AT}
127+
function change_form(::Type{LPStandardForm{T, AT, VT}}, lp::LPGeometricForm{T}) where {T, AT, VT}
128128
new_A = hcat(
129129
lp.A,
130130
-lp.A,
@@ -135,21 +135,21 @@ function change_form(::Type{LPStandardForm{T, AT}}, lp::LPGeometricForm{T}) wher
135135
-lp.c,
136136
fill(0.0, length(lp.b))
137137
)
138-
return LPStandardForm{T, AT}(
138+
return LPStandardForm{T, AT, VT}(
139139
lp.direction,
140140
new_c,
141141
new_A,
142142
copy(lp.b)
143143
)
144144
end
145-
function change_form(::Type{LPStandardForm{T, AT}}, lp::F) where {T, AT, F <: AbstractLPForm{T}}
146-
temp_lp = change_form(LPForm{T, AT}, lp)
147-
new_lp = change_form(LPGeometricForm{T, AT}, temp_lp)
148-
change_form(LPStandardForm{T, AT}, new_lp)
145+
function change_form(::Type{LPStandardForm{T, AT, VT}}, lp::F) where {T, AT, VT, F <: AbstractLPForm{T}}
146+
temp_lp = change_form(LPForm{T, AT, VT}, lp)
147+
new_lp = change_form(LPGeometricForm{T, AT, VT}, temp_lp)
148+
change_form(LPStandardForm{T, AT, VT}, new_lp)
149149
end
150150

151-
function change_form(::Type{LPSolverForm{T, AT}}, lp::LPSolverForm) where {T, AT}
152-
return LPSolverForm{T, AT}(
151+
function change_form(::Type{LPSolverForm{T, AT, VT}}, lp::LPSolverForm) where {T, AT, VT}
152+
return LPSolverForm{T, AT, VT}(
153153
lp.direction,
154154
lp.c,
155155
lp.A,
@@ -159,7 +159,7 @@ function change_form(::Type{LPSolverForm{T, AT}}, lp::LPSolverForm) where {T, AT
159159
lp.v_ub
160160
)
161161
end
162-
function change_form(::Type{LPSolverForm{T, AT}}, lp::LPForm{T}) where {T, AT}
162+
function change_form(::Type{LPSolverForm{T, AT, VT}}, lp::LPForm{T}) where {T, AT, VT}
163163
new_A = copy(lp.A)
164164
senses = fill(LESS_THAN, length(lp.c_lb))
165165
new_b = fill(NaN, length(lp.c_lb))
@@ -181,7 +181,7 @@ function change_form(::Type{LPSolverForm{T, AT}}, lp::LPForm{T}) where {T, AT}
181181
new_b[i] = lp.c_ub[i]
182182
end
183183
end
184-
return LPSolverForm{T, AT}(
184+
return LPSolverForm{T, AT, VT}(
185185
lp.direction,
186186
lp.c,
187187
new_A,
@@ -191,7 +191,7 @@ function change_form(::Type{LPSolverForm{T, AT}}, lp::LPForm{T}) where {T, AT}
191191
lp.v_ub,
192192
)
193193
end
194-
function change_form(::Type{LPSolverForm{T, AT}}, lp::F) where {T, AT, F <: AbstractLPForm{T}}
195-
temp_lp = change_form(LPForm{T, AT}, lp)
196-
change_form(LPSolverForm{T, AT}, temp_lp)
194+
function change_form(::Type{LPSolverForm{T, AT, VT}}, lp::F) where {T, AT, VT, F <: AbstractLPForm{T}}
195+
temp_lp = change_form(LPForm{T, AT, VT}, lp)
196+
change_form(LPSolverForm{T, AT, VT}, temp_lp)
197197
end

src/matrix_input.jl

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ function MOI.get(model::AbstractLPForm{T}, ::MOI.ConstraintFunction,
4747
end
4848

4949

50-
struct LPStandardForm{T, AT<:AbstractMatrix{T}} <: AbstractLPForm{T}
50+
struct LPStandardForm{T, AT<:AbstractMatrix{T}, VT <: AbstractVector{T}} <: AbstractLPForm{T}
5151
direction::MOI.OptimizationSense
52-
c::Vector{T}
52+
c::VT
5353
A::AT
54-
b::Vector{T}
54+
b::VT
5555
end
5656

5757
function MOI.get(model::LPStandardForm{T}, ::MOI.ListOfConstraints) where T
@@ -91,11 +91,11 @@ function MOI.get(model::LPStandardForm, ::MOI.ConstraintSet,
9191
return MOI.Nonnegatives(MOI.get(model, MOI.NumberOfVariables()))
9292
end
9393

94-
struct LPGeometricForm{T, AT<:AbstractMatrix{T}} <: AbstractLPForm{T}
94+
struct LPGeometricForm{T, AT<:AbstractMatrix{T}, VT <: AbstractVector{T}} <: AbstractLPForm{T}
9595
direction::MOI.OptimizationSense
96-
c::Vector{T}
96+
c::VT
9797
A::AT
98-
b::Vector{T}
98+
b::VT
9999
end
100100

101101
function MOI.get(model::LPGeometricForm{T}, ::MOI.ListOfConstraints) where T
@@ -181,14 +181,14 @@ function MOI.get(model::LPMixedForm, ::MOI.ConstraintSet, ci::VBOUND)
181181
return _bound_set(model.v_lb[ci.value], model.v_ub[ci.value])
182182
end
183183

184-
struct LPForm{T, AT<:AbstractMatrix{T}} <: LPMixedForm{T}#, V<:AbstractVector{T}, M<:AbstractMatrix{T}}
184+
struct LPForm{T, AT<:AbstractMatrix{T}, VT <: AbstractVector{T}} <: LPMixedForm{T} #, V<:AbstractVector{T} #, M<:AbstractMatrix{T}}
185185
direction::MOI.OptimizationSense
186-
c::Vector{T}
186+
c::VT
187187
A::AT
188-
c_lb::Vector{T}
189-
c_ub::Vector{T}
190-
v_lb::Vector{T}
191-
v_ub::Vector{T}
188+
c_lb::VT
189+
c_ub::VT
190+
v_lb::VT
191+
v_ub::VT
192192
end
193193

194194
function _constraint_bound_sense(model::LPForm, i)
@@ -198,14 +198,14 @@ function MOI.get(model::LPForm, ::MOI.ConstraintSet, ci::AFF)
198198
return _bound_set(model.c_lb[ci.value], model.c_ub[ci.value])
199199
end
200200

201-
struct LPSolverForm{T, AT<:AbstractMatrix{T}} <: LPMixedForm{T}
201+
struct LPSolverForm{T, AT<:AbstractMatrix{T}, VT<:AbstractVector{T}} <: LPMixedForm{T}
202202
direction::MOI.OptimizationSense
203-
c::Vector{T}
203+
c::VT
204204
A::AT
205-
b::Vector{T}
205+
b::VT
206206
senses::Vector{ConstraintSense}
207-
v_lb::Vector{T}
208-
v_ub::Vector{T}
207+
v_lb::VT
208+
v_ub::VT
209209
end
210210

211211
function _constraint_bound_sense(model::LPSolverForm, i)

0 commit comments

Comments
 (0)