@@ -3,8 +3,6 @@ __precompile__()
33module PiecewiseLinearOpt
44
55import JuMP
6- import MathOptInterface
7- const MOI = MathOptInterface
86using LinearAlgebra
97using Random
108
2624
2725const VarOrAff = Union{JuMP. VariableRef,JuMP. AffExpr}
2826
29- include(joinpath( " methods" , " util.jl" ) )
27+ include(" methods/ util.jl" )
3028
3129export 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" )
3837# ConvexCombination has an SOS2 formulation, so defer this until after the
3938# multivariate formulations are defined
40- include(joinpath( " methods" , " univariate" , " sos2_formulation_base.jl" ) )
39+ include(" methods/ univariate/ sos2_formulation_base.jl" )
4140
4241# Consider the colloqial "log" to refer to the embedding formulation
4342const Logarithmic = LogarithmicEmbedding
4443export Logarithmic
4544
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}
6166 error(" No support for a R^$D -> R^$F piecewise linear function using the $method method." )
6267end
6368
@@ -93,4 +98,42 @@ function piecewiselinear(model::JuMP.Model,
9398 return output_vars
9499end
95100
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+
96139end # module
0 commit comments