diff --git a/src/UnitCommitment.jl b/src/UnitCommitment.jl index 9850099..6370cc5 100644 --- a/src/UnitCommitment.jl +++ b/src/UnitCommitment.jl @@ -10,7 +10,7 @@ include("model/formulations/base/structs.jl") include("model/formulations/ArrCon00/structs.jl") include("model/formulations/DamKucRajAta16/structs.jl") include("model/formulations/MorLatRam13/structs.jl") -include("solution/methods/XaQiWaTh19/structs.jl") +include("solution/methods/XavQiuWanThi19/structs.jl") include("import/egret.jl") include("instance/read.jl") @@ -26,10 +26,10 @@ include("model/formulations/DamKucRajAta16/ramp.jl") include("model/formulations/MorLatRam13/ramp.jl") include("model/jumpext.jl") include("solution/fix.jl") -include("solution/methods/XaQiWaTh19/enforce.jl") -include("solution/methods/XaQiWaTh19/filter.jl") -include("solution/methods/XaQiWaTh19/find.jl") -include("solution/methods/XaQiWaTh19/optimize.jl") +include("solution/methods/XavQiuWanThi19/enforce.jl") +include("solution/methods/XavQiuWanThi19/filter.jl") +include("solution/methods/XavQiuWanThi19/find.jl") +include("solution/methods/XavQiuWanThi19/optimize.jl") include("solution/optimize.jl") include("solution/solution.jl") include("solution/warmstart.jl") diff --git a/src/model/build.jl b/src/model/build.jl index aae1223..10decb3 100644 --- a/src/model/build.jl +++ b/src/model/build.jl @@ -33,8 +33,7 @@ function build_model(; )::JuMP.Model return _build_model( instance, - _GeneratorFormulation(), - _ShiftFactorsFormulation(), + Formulation(), optimizer = optimizer, variable_names = variable_names, ) @@ -42,8 +41,7 @@ end function _build_model( instance::UnitCommitmentInstance, - fg::_GeneratorFormulation, - ft::_TransmissionFormulation; + formulation::Formulation; optimizer = nothing, variable_names::Bool = false, )::JuMP.Model @@ -55,15 +53,15 @@ function _build_model( end model[:obj] = AffExpr() model[:instance] = instance - _setup_transmission(model, ft) + _setup_transmission(model, formulation.transmission) for l in instance.lines - _add_transmission_line!(model, l, ft) + _add_transmission_line!(model, l, formulation.transmission) end for b in instance.buses _add_bus!(model, b) end for g in instance.units - _add_unit!(model, g, fg) + _add_unit!(model, g, formulation) end for ps in instance.price_sensitive_loads _add_price_sensitive_load!(model, ps) diff --git a/src/model/formulations/ArrCon00/ramp.jl b/src/model/formulations/ArrCon00/ramp.jl index 75b7324..078a35e 100644 --- a/src/model/formulations/ArrCon00/ramp.jl +++ b/src/model/formulations/ArrCon00/ramp.jl @@ -5,7 +5,7 @@ function _add_ramp_eqs!( model::JuMP.Model, g::Unit, - formulation::_ArrCon00, + formulation::ArrCon00, )::Nothing # TODO: Move upper case constants to model[:instance] RESERVES_WHEN_START_UP = true diff --git a/src/model/formulations/ArrCon00/structs.jl b/src/model/formulations/ArrCon00/structs.jl index 3af3414..4fef3c6 100644 --- a/src/model/formulations/ArrCon00/structs.jl +++ b/src/model/formulations/ArrCon00/structs.jl @@ -9,4 +9,4 @@ Formulation described in: to an electricity spot market. IEEE Transactions on power systems, 15(3), 1098-1104. """ -mutable struct _ArrCon00 <: _RampingFormulation end +struct ArrCon00 <: RampingFormulation end diff --git a/src/model/formulations/DamKucRajAta16/ramp.jl b/src/model/formulations/DamKucRajAta16/ramp.jl index 64a851e..3eb4ae1 100644 --- a/src/model/formulations/DamKucRajAta16/ramp.jl +++ b/src/model/formulations/DamKucRajAta16/ramp.jl @@ -5,7 +5,7 @@ function _add_ramp_eqs!( model::JuMP.Model, g::Unit, - formulation::_DamKucRajAta16, + formulation::DamKucRajAta16, )::Nothing # TODO: Move upper case constants to model[:instance] RESERVES_WHEN_START_UP = true @@ -31,15 +31,15 @@ function _add_ramp_eqs!( time_invariant = (t > 1) ? (abs(g.min_power[t] - g.min_power[t-1]) < 1e-7) : true - if t > 1 && !time_invariant - warning( - "Ramping according to Damcı-Kurt et al. (2016) requires " * - "time-invariant minimum power. This does not hold for " * - "generator $(gn): min_power[$t] = $(g.min_power[t]); " * - "min_power[$(t-1)] = $(g.min_power[t-1]). Reverting to " * - "Arroyo and Conejo (2000) formulation for this generator.", - ) - end + # if t > 1 && !time_invariant + # @warn( + # "Ramping according to Damcı-Kurt et al. (2016) requires " * + # "time-invariant minimum power. This does not hold for " * + # "generator $(gn): min_power[$t] = $(g.min_power[t]); " * + # "min_power[$(t-1)] = $(g.min_power[t-1]). Reverting to " * + # "Arroyo and Conejo (2000) formulation for this generator.", + # ) + # end max_prod_this_period = prod_above[gn, t] + ( diff --git a/src/model/formulations/DamKucRajAta16/structs.jl b/src/model/formulations/DamKucRajAta16/structs.jl index 1777691..571928d 100644 --- a/src/model/formulations/DamKucRajAta16/structs.jl +++ b/src/model/formulations/DamKucRajAta16/structs.jl @@ -8,4 +8,4 @@ Formulation described in: Damcı-Kurt, P., Küçükyavuz, S., Rajan, D., & Atamtürk, A. (2016). A polyhedral study of production ramping. Mathematical Programming, 158(1), 175-205. """ -mutable struct _DamKucRajAta16 <: _RampingFormulation end +struct DamKucRajAta16 <: RampingFormulation end diff --git a/src/model/formulations/MorLatRam13/ramp.jl b/src/model/formulations/MorLatRam13/ramp.jl index 61f1ed6..d0d9a84 100644 --- a/src/model/formulations/MorLatRam13/ramp.jl +++ b/src/model/formulations/MorLatRam13/ramp.jl @@ -5,7 +5,7 @@ function _add_ramp_eqs!( model::JuMP.Model, g::Unit, - formulation::_MorLatRam13, + formulation::MorLatRam13, )::Nothing # TODO: Move upper case constants to model[:instance] RESERVES_WHEN_START_UP = true diff --git a/src/model/formulations/MorLatRam13/structs.jl b/src/model/formulations/MorLatRam13/structs.jl index 36e43c2..fceddcd 100644 --- a/src/model/formulations/MorLatRam13/structs.jl +++ b/src/model/formulations/MorLatRam13/structs.jl @@ -9,4 +9,4 @@ Formulation described in: MILP formulation for the thermal unit commitment problem. IEEE Transactions on Power Systems, 28(4), 4897-4908. """ -mutable struct _MorLatRam13 <: _RampingFormulation end +struct MorLatRam13 <: RampingFormulation end diff --git a/src/model/formulations/base/line.jl b/src/model/formulations/base/line.jl index 6501982..6398c8d 100644 --- a/src/model/formulations/base/line.jl +++ b/src/model/formulations/base/line.jl @@ -5,7 +5,7 @@ function _add_transmission_line!( model::JuMP.Model, lm::TransmissionLine, - f::_TransmissionFormulation, + f::ShiftFactorsFormulation, )::Nothing overflow = _init(model, :overflow) for t in 1:model[:instance].time @@ -21,7 +21,7 @@ end function _setup_transmission( model::JuMP.Model, - formulation::_TransmissionFormulation, + formulation::ShiftFactorsFormulation, )::Nothing instance = model[:instance] isf = formulation.precomputed_isf diff --git a/src/model/formulations/base/structs.jl b/src/model/formulations/base/structs.jl index 00b9302..3d92c69 100644 --- a/src/model/formulations/base/structs.jl +++ b/src/model/formulations/base/structs.jl @@ -2,21 +2,23 @@ # Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. # Released under the modified BSD license. See COPYING.md for more details. -abstract type _RampingFormulation end -abstract type _TransmissionFormulation end +abstract type TransmissionFormulation end +abstract type RampingFormulation end -struct _GeneratorFormulation - ramping::_RampingFormulation +struct Formulation + ramping::RampingFormulation + transmission::TransmissionFormulation - function _GeneratorFormulation( - ramping::_RampingFormulation = _MorLatRam13(), + function Formulation(; + ramping::RampingFormulation = MorLatRam13(), + transmission::TransmissionFormulation = ShiftFactorsFormulation(), ) - return new(ramping) + return new(ramping, transmission) end end """ - mutable struct _ShiftFactorsFormulation <: _TransmissionFormulation + struct ShiftFactorsFormulation <: TransmissionFormulation isf_cutoff::Float64 lodf_cutoff::Float64 precomputed_isf::Union{Nothing,Matrix{Float64}} @@ -40,13 +42,13 @@ Arguments the cutoff that should be applied to the LODF matrix. Entries with magnitude smaller than this value will be set to zero. """ -mutable struct _ShiftFactorsFormulation <: _TransmissionFormulation +struct ShiftFactorsFormulation <: TransmissionFormulation isf_cutoff::Float64 lodf_cutoff::Float64 precomputed_isf::Union{Nothing,Matrix{Float64}} precomputed_lodf::Union{Nothing,Matrix{Float64}} - function _ShiftFactorsFormulation(; + function ShiftFactorsFormulation(; isf_cutoff = 0.005, lodf_cutoff = 0.001, precomputed_isf = nothing, diff --git a/src/model/formulations/base/unit.jl b/src/model/formulations/base/unit.jl index 2dfd49c..16a1f06 100644 --- a/src/model/formulations/base/unit.jl +++ b/src/model/formulations/base/unit.jl @@ -2,7 +2,7 @@ # Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. # Released under the modified BSD license. See COPYING.md for more details. -function _add_unit!(model::JuMP.Model, g::Unit, f::_GeneratorFormulation) +function _add_unit!(model::JuMP.Model, g::Unit, f::Formulation) if !all(g.must_run) && any(g.must_run) error("Partially must-run units are not currently supported") end @@ -32,7 +32,7 @@ _is_initially_on(g::Unit)::Float64 = (g.initial_status > 0 ? 1.0 : 0.0) function _add_production_vars!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing prod_above = _init(model, :prod_above) segprod = _init(model, :segprod) @@ -48,7 +48,7 @@ end function _add_production_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing eq_prod_above_def = _init(model, :eq_prod_above_def) eq_prod_limit = _init(model, :eq_prod_limit) @@ -94,7 +94,7 @@ end function _add_reserve_vars!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing reserve = _init(model, :reserve) for t in 1:model[:instance].time @@ -110,7 +110,7 @@ end function _add_reserve_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing reserve = model[:reserve] for t in 1:model[:instance].time @@ -122,7 +122,7 @@ end function _add_startup_shutdown_vars!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing startup = _init(model, :startup) for t in 1:model[:instance].time @@ -136,7 +136,7 @@ end function _add_startup_shutdown_limit_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing eq_shutdown_limit = _init(model, :eq_shutdown_limit) eq_startup_limit = _init(model, :eq_startup_limit) @@ -175,7 +175,7 @@ end function _add_startup_shutdown_costs_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing eq_startup_choose = _init(model, :eq_startup_choose) eq_startup_restrict = _init(model, :eq_startup_restrict) @@ -222,7 +222,7 @@ end function _add_status_vars!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing is_on = _init(model, :is_on) switch_on = _init(model, :switch_on) @@ -244,7 +244,7 @@ end function _add_status_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing eq_binary_link = _init(model, :eq_binary_link) eq_switch_on_off = _init(model, :eq_switch_on_off) @@ -280,7 +280,7 @@ end function _add_ramp_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::RampingFormulation, )::Nothing prod_above = model[:prod_above] reserve = model[:reserve] @@ -326,7 +326,7 @@ end function _add_min_uptime_downtime_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing is_on = model[:is_on] switch_off = model[:switch_off] @@ -373,7 +373,7 @@ end function _add_net_injection_eqs!( model::JuMP.Model, g::Unit, - formulation::_GeneratorFormulation, + formulation::Formulation, )::Nothing expr_net_injection = model[:expr_net_injection] for t in 1:model[:instance].time diff --git a/src/solution/methods/XaQiWaTh19/enforce.jl b/src/solution/methods/XavQiuWanThi19/enforce.jl similarity index 100% rename from src/solution/methods/XaQiWaTh19/enforce.jl rename to src/solution/methods/XavQiuWanThi19/enforce.jl diff --git a/src/solution/methods/XaQiWaTh19/filter.jl b/src/solution/methods/XavQiuWanThi19/filter.jl similarity index 100% rename from src/solution/methods/XaQiWaTh19/filter.jl rename to src/solution/methods/XavQiuWanThi19/filter.jl diff --git a/src/solution/methods/XaQiWaTh19/find.jl b/src/solution/methods/XavQiuWanThi19/find.jl similarity index 100% rename from src/solution/methods/XaQiWaTh19/find.jl rename to src/solution/methods/XavQiuWanThi19/find.jl diff --git a/src/solution/methods/XaQiWaTh19/optimize.jl b/src/solution/methods/XavQiuWanThi19/optimize.jl similarity index 76% rename from src/solution/methods/XaQiWaTh19/optimize.jl rename to src/solution/methods/XavQiuWanThi19/optimize.jl index cf196c0..7361fe3 100644 --- a/src/solution/methods/XaQiWaTh19/optimize.jl +++ b/src/solution/methods/XavQiuWanThi19/optimize.jl @@ -2,17 +2,7 @@ # Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved. # Released under the modified BSD license. See COPYING.md for more details. -""" - optimize!(model::JuMP.Model, method::_XaQiWaTh19)::Nothing - -Solve the given unit commitment model, enforcing transmission and N-1 -security constraints lazily, according to the algorithm described in: - - Xavier, A. S., Qiu, F., Wang, F., & Thimmapuram, P. R. (2019). Transmission - constraint filtering in large-scale security-constrained unit commitment. - IEEE Transactions on Power Systems, 34(3), 2457-2460. -""" -function optimize!(model::JuMP.Model, method::_XaQiWaTh19)::Nothing +function optimize!(model::JuMP.Model, method::XavQiuWanThi19)::Nothing function set_gap(gap) try JuMP.set_optimizer_attribute(model, "MIPGap", gap) @@ -21,7 +11,6 @@ function optimize!(model::JuMP.Model, method::_XaQiWaTh19)::Nothing @warn "Could not change MIP gap tolerance" end end - instance = model[:instance] initial_time = time() large_gap = false has_transmission = (length(model[:isf]) > 0) diff --git a/src/solution/methods/XaQiWaTh19/structs.jl b/src/solution/methods/XavQiuWanThi19/structs.jl similarity index 95% rename from src/solution/methods/XaQiWaTh19/structs.jl rename to src/solution/methods/XavQiuWanThi19/structs.jl index 15f688b..7667359 100644 --- a/src/solution/methods/XaQiWaTh19/structs.jl +++ b/src/solution/methods/XavQiuWanThi19/structs.jl @@ -5,7 +5,7 @@ import DataStructures: PriorityQueue """ - struct _XaQiWaTh19 <: SolutionMethod + struct XavQiuWanThi19 <: SolutionMethod time_limit::Float64 gap_limit::Float64 two_phase_gap::Bool @@ -19,7 +19,8 @@ Lazy constraint solution method described in: constraint filtering in large-scale security-constrained unit commitment. IEEE Transactions on Power Systems, 34(3), 2457-2460. -## Fields +Fields +------ - `time_limit`: the time limit over the entire optimization procedure. @@ -36,14 +37,14 @@ Lazy constraint solution method described in: formulation per time period. """ -struct _XaQiWaTh19 +struct XavQiuWanThi19 time_limit::Float64 gap_limit::Float64 two_phase_gap::Bool max_violations_per_line::Int max_violations_per_period::Int - function _XaQiWaTh19(; + function XavQiuWanThi19(; time_limit::Float64 = 86400.0, gap_limit::Float64 = 1e-3, two_phase_gap::Bool = true, diff --git a/src/solution/optimize.jl b/src/solution/optimize.jl index ef0e2f7..9a21590 100644 --- a/src/solution/optimize.jl +++ b/src/solution/optimize.jl @@ -10,5 +10,5 @@ advanced methods to accelerate the solution process and to enforce transmission and N-1 security constraints. """ function optimize!(model::JuMP.Model)::Nothing - return UnitCommitment.optimize!(model, _XaQiWaTh19()) + return UnitCommitment.optimize!(model, XavQiuWanThi19()) end diff --git a/src/utils/log.jl b/src/utils/log.jl index e3daf87..b69a7d5 100644 --- a/src/utils/log.jl +++ b/src/utils/log.jl @@ -49,6 +49,9 @@ function handle_message( if level >= logger.screen_log_level printstyled(time_string, color = color) println(message) + flush(stdout) + flush(stderr) + Base.Libc.flush_cstdio() end if logger.file !== nothing && level >= logger.io_log_level write(logger.file, time_string)