From b22ee475838c396af30ddc7a48036ad51b957db0 Mon Sep 17 00:00:00 2001 From: odow Date: Sat, 6 Mar 2021 14:35:41 +1300 Subject: [PATCH] Add precompile statements --- src/MathOptInterface.jl | 4 +++ src/Utilities/Utilities.jl | 5 +++ src/Utilities/precompile.jl | 44 ++++++++++++++++++++++++ src/precompile.jl | 68 +++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 src/Utilities/precompile.jl create mode 100644 src/precompile.jl diff --git a/src/MathOptInterface.jl b/src/MathOptInterface.jl index 99bd6291f5..03015f7558 100644 --- a/src/MathOptInterface.jl +++ b/src/MathOptInterface.jl @@ -140,6 +140,10 @@ include("modifications.jl") include("variables.jl") include("nlp.jl") +if VERSION > v"1.4.2" + include("precompile.jl") +end + # submodules include("Utilities/Utilities.jl") # MOI.Utilities include("Test/Test.jl") # MOI.Test diff --git a/src/Utilities/Utilities.jl b/src/Utilities/Utilities.jl index c52d20e5ec..4868cc2589 100644 --- a/src/Utilities/Utilities.jl +++ b/src/Utilities/Utilities.jl @@ -65,4 +65,9 @@ include("universalfallback.jl") include("lazy_iterators.jl") +if VERSION > v"1.4.2" + include("precompile.jl") + _precompile_() +end + end # module diff --git a/src/Utilities/precompile.jl b/src/Utilities/precompile.jl new file mode 100644 index 0000000000..9b0dfc3660 --- /dev/null +++ b/src/Utilities/precompile.jl @@ -0,0 +1,44 @@ +function _precompile_() + ccall(:jl_generating_output, Cint, ()) == 1 || return nothing + T = Float64 + scalar_sets = ( + MOI.LessThan{T}, + MOI.GreaterThan{T}, + MOI.EqualTo{T}, + MOI.Interval{T}, + MOI.Integer, + MOI.ZeroOne, + MOI.Semiinteger{T}, + MOI.Semicontinuous{T}, + ) + scalar_functions = ( + MOI.SingleVariable, + MOI.ScalarAffineFunction{T}, + MOI.ScalarQuadraticFunction{T}, + ) + vector_sets = ( + MOI.Nonnegatives, + MOI.Nonpositives, + MOI.Zeros, + MOI.Reals, + MOI.SecondOrderCone, + MOI.RotatedSecondOrderCone, + MOI.PositiveSemidefiniteConeSquare, + MOI.PositiveSemidefiniteConeTriangle, + ) + vector_functions = ( + MOI.VectorOfVariables, + MOI.VectorAffineFunction{T}, + MOI.VectorQuadraticFunction{T}, + ) + constraints = vcat( + [(F, S) for F in scalar_functions, S in scalar_sets], + [(F, S) for F in vector_functions, S in vector_sets], + ) + MOI.precompile_model(UniversalFallback{Model{T}}, constraints) + MOI.precompile_model( + CachingOptimizer{MOI.AbstractOptimizer,UniversalFallback{Model{T}}}, + constraints, + ) + return +end diff --git a/src/precompile.jl b/src/precompile.jl new file mode 100644 index 0000000000..5c244be87b --- /dev/null +++ b/src/precompile.jl @@ -0,0 +1,68 @@ +function precompile_constraint(model, F, S) + Base.precompile(get, (model, ListOfConstraintIndices{F,S})) + Base.precompile(get, (model, ListOfConstraintAttributesSet{F,S})) + Base.precompile(get, (model, ConstraintSet, ConstraintIndex{F,S})) + Base.precompile(get, (model, ConstraintSet, Vector{ConstraintIndex{F,S}})) + Base.precompile(set, (model, ConstraintSet, ConstraintIndex{F,S}, S)) + + Base.precompile(get, (model, ConstraintFunction, ConstraintIndex{F,S})) + Base.precompile(set, (model, ConstraintFunction, ConstraintIndex{F,S}, F)) + Base.precompile(get, (model, ConstraintFunction, Vector{ConstraintIndex{F,S}})) + + Base.precompile(get, (model, ConstraintDual, ConstraintIndex{F,S})) + Base.precompile(get, (model, ConstraintPrimal, ConstraintIndex{F,S})) + + Base.precompile(get, (model, AbstractConstraintAttribute, ConstraintIndex{F,S})) + Base.precompile(get, (model, AbstractConstraintAttribute, Vector{ConstraintIndex{F,S}})) + + Base.precompile(add_constraint, (model, F, S)) + Base.precompile(add_constraints, (model, Vector{F}, Vector{S})) + Base.precompile(delete, (model, ConstraintIndex{F,S})) + Base.precompile(is_valid, (model, ConstraintIndex{F,S})) + Base.precompile(get, (model, ConstraintName, ConstraintIndex{F,S})) + Base.precompile(set, (model, ConstraintName, ConstraintIndex{F,S}, String)) +end + +function precompile_variables(model) + Base.precompile(delete, (model, VariableIndex)) + Base.precompile(delete, (model, Vector{VariableIndex})) + Base.precompile(get, (model, AbstractVariableAttribute, VariableIndex)) + Base.precompile(get, (model, AbstractVariableAttribute, Vector{VariableIndex})) + Base.precompile(get, (model, VariableName, VariableIndex)) + Base.precompile(set, (model, VariableName, VariableIndex, String)) + Base.precompile(get, (model, VariablePrimalStart, VariableIndex)) + Base.precompile(set, (model, VariablePrimalStart, VariableIndex, Float64)) + Base.precompile(get, (model, VariablePrimalStart, Vector{VariableIndex})) + Base.precompile(set, (model, VariablePrimalStart, Vector{VariableIndex}, Vector{Float64})) + Base.precompile(get, (model, VariablePrimal, VariableIndex)) + Base.precompile(get, (model, VariablePrimal, Vector{VariableIndex})) + Base.precompile(add_constrained_variables, (model, Reals)) +end + +function precompile_model(model, constraints) + Base.precompile(empty!, (model,)) + Base.precompile(is_empty, (model,)) + Base.precompile(get, (model, ListOfConstraints)) + Base.precompile(optimize!, (model,)) + Base.precompile(add_variable, (model,)) + Base.precompile(add_variables, (model, Int)) + for attr in ( + ListOfVariableIndices, + ListOfVariableAttributesSet, + TerminationStatus, + DualStatus, + PrimalStatus, + ObjectiveValue, + Silent, + TimeLimitSec, + NumberOfVariables, + ) + Base.precompile(get, (model, attr)) + end + + precompile_variables(model) + for (F, S) in constraints + precompile_constraint(model, F, S) + end + Base.precompile(Tuple{typeof(add_constrained_variables),model,Reals}) +end