@@ -3,8 +3,6 @@ __precompile__()
3
3
module PiecewiseLinearOpt
4
4
5
5
import JuMP
6
- import MathOptInterface
7
- const MOI = MathOptInterface
8
6
using LinearAlgebra
9
7
using Random
10
8
26
24
27
25
const VarOrAff = Union{JuMP. VariableRef,JuMP. AffExpr}
28
26
29
- include (joinpath ( " methods" , " util.jl" ) )
27
+ include (" methods/ util.jl" )
30
28
31
29
export Incremental, LogarithmicEmbedding, LogarithmicIndependentBranching, NativeSOS2, ZigZagBinary, ZigZagInteger
32
- include (joinpath (" methods" , " univariate" , " incremental.jl" ))
33
- include (joinpath (" methods" , " univariate" , " logarithmic_embedding.jl" ))
34
- include (joinpath (" methods" , " univariate" , " logarithmic_independent_branching.jl" ))
35
- include (joinpath (" methods" , " univariate" , " native_sos2.jl" ))
36
- include (joinpath (" methods" , " univariate" , " zig_zag_binary.jl" ))
37
- include (joinpath (" methods" , " univariate" , " zig_zag_integer.jl" ))
30
+ include (" methods/univariate/incremental.jl" )
31
+
32
+ include (" methods/univariate/logarithmic_embedding.jl" )
33
+ include (" methods/univariate/logarithmic_independent_branching.jl" )
34
+ include (" methods/univariate/native_sos2.jl" )
35
+ include (" methods/univariate/zig_zag_binary.jl" )
36
+ include (" methods/univariate/zig_zag_integer.jl" )
38
37
# ConvexCombination has an SOS2 formulation, so defer this until after the
39
38
# multivariate formulations are defined
40
- include (joinpath ( " methods" , " univariate" , " sos2_formulation_base.jl" ) )
39
+ include (" methods/ univariate/ sos2_formulation_base.jl" )
41
40
42
41
# Consider the colloqial "log" to refer to the embedding formulation
43
42
const Logarithmic = LogarithmicEmbedding
44
43
export Logarithmic
45
44
46
- export K1, NineStencil, OptimalIndendentBranching, OptimalTriangleSelection, SixStencil, UnionJack
47
- include (joinpath (" methods" , " bivariate" , " k1.jl" ))
48
- include (joinpath (" methods" , " bivariate" , " nine_stencil.jl" ))
49
- include (joinpath (" methods" , " bivariate" , " optimal_independent_branching.jl" ))
50
- include (joinpath (" methods" , " bivariate" , " optimal_triangle_selection.jl" ))
51
- include (joinpath (" methods" , " bivariate" , " six_stencil.jl" ))
52
- include (joinpath (" methods" , " bivariate" , " union_jack.jl" ))
53
- include (joinpath (" methods" , " bivariate" , " common.jl" ))
54
-
55
- export ConvexCombination, DisaggregatedLogarithmic, MultipleChoice, OptimalIndependentBranching, OptimalTriangleSelection
56
- include (joinpath (" methods" , " multivariate" , " convex_combination.jl" ))
57
- include (joinpath (" methods" , " multivariate" , " disaggregated_logarithmic.jl" ))
58
- include (joinpath (" methods" , " multivariate" , " multiple_choice.jl" ))
59
-
60
- function formulate_pwl! (model:: JuMP.Model , input_vals:: Vector{NTuple{D,VarOrAff}} , output_vals:: Vector{NTuple{F,VarOrAff}} , pwl:: PWLFunction , method:: Method , direction:: DIRECTION ) where {D,F}
45
+ export K1, NineStencil, OptimalIndependentBranching, OptimalTriangleSelection, SixStencil, UnionJack
46
+ include (" methods/bivariate/k1.jl" )
47
+ include (" methods/bivariate/nine_stencil.jl" )
48
+ include (" methods/bivariate/optimal_independent_branching.jl" )
49
+ include (" methods/bivariate/optimal_triangle_selection.jl" )
50
+ include (" methods/bivariate/six_stencil.jl" )
51
+ include (" methods/bivariate/union_jack.jl" )
52
+ include (" methods/bivariate/common.jl" )
53
+
54
+ export ConvexCombination, DisaggregatedLogarithmic, MultipleChoice
55
+ include (" methods/multivariate/convex_combination.jl" )
56
+ include (" methods/multivariate/disaggregated_logarithmic.jl" )
57
+ include (" methods/multivariate/multiple_choice.jl" )
58
+
59
+ function formulate_pwl! (
60
+ model:: JuMP.Model ,
61
+ input_vals:: Vector{NTuple{D,VarOrAff}} ,
62
+ output_vals:: Vector{NTuple{F,VarOrAff}} ,
63
+ pwl:: PWLFunction ,
64
+ method:: Method ,
65
+ direction:: DIRECTION ) where {D,F}
61
66
error (" No support for a R^$D -> R^$F piecewise linear function using the $method method." )
62
67
end
63
68
@@ -93,4 +98,42 @@ function piecewiselinear(model::JuMP.Model,
93
98
return output_vars
94
99
end
95
100
101
+ function piecewiselinear (
102
+ model:: JuMP.Model ,
103
+ input_var:: VarOrAff ,
104
+ pwl:: PWLFunction{1,1,SegmentPointRep{1,1}} ;
105
+ method:: Method = _default_method (Val (1 )),
106
+ direction:: DIRECTION = Graph,
107
+ output_var:: Union{Nothing, VarOrAff} = nothing
108
+ )
109
+ return piecewiselinear (
110
+ model,
111
+ (input_var,),
112
+ pwl;
113
+ method = method,
114
+ direction = direction,
115
+ output_vars = isnothing (output_var) ? nothing : (output_var,)
116
+ )[1 ]
117
+ end
118
+
119
+ function piecewiselinear (
120
+ model:: JuMP.Model ,
121
+ input_var_x:: VarOrAff ,
122
+ input_var_y:: VarOrAff ,
123
+ pwl:: PWLFunction{2,1,SegmentPointRep{2,1}} ;
124
+ method:: Method = _default_method (Val (2 )),
125
+ direction:: DIRECTION = Graph,
126
+ output_var:: Union{Nothing, VarOrAff} = nothing
127
+ )
128
+ return piecewiselinear (
129
+ model,
130
+ (input_var_x, input_var_y),
131
+ pwl;
132
+ method = method,
133
+ direction = direction,
134
+ output_vars = isnothing (output_var) ? nothing : (output_var,)
135
+ )[1 ]
136
+ end
137
+
138
+
96
139
end # module
0 commit comments