SpineOpt.jl icon indicating copy to clipboard operation
SpineOpt.jl copied to clipboard

Representative days setting

Open RowanPeng opened this issue 1 year ago • 3 comments

Hello!

The original representative model I built could run successfully, but when I added more representative days in Spine. I've encountered an error for which I do not know how to address. See the error message pasted below:

The relevant files (nodes & resistance layers, init file, and included pair list) are here.

ERROR: LoadError: KeyError: key (unit = 1_CCGT_Exist_Peterhead, stochastic_scenario = realization, t = 2014-12-31T23:00~>2015-01-01T00:00) not found
Stacktrace:
  [1] getindex
    @ .\dict.jl:484 [inlined]
  [2] getindex
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:79 [inlined]
  [3] #1723
    @ .\none:0 [inlined]
  [4] iterate
    @ .\generator.jl:47 [inlined]
  [5] iterate(it::Base.Iterators.Drop{Base.Generator{Vector{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}}, SpineOpt.var"#1723#1728"{Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}}}})
    @ Base.Iterators .\iterators.jl:809
  [6] expr_sum(iter::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}}, SpineOpt.var"#1723#1728"{Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}}}; init::Int64)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:116
  [7] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\MutableArithmetics\h0wjj\src\rewrite.jl:322 [inlined]
  [8] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\JuMP\ptoff\src\macros.jl:986 [inlined]
  [9] #1720
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\constraints\constraint_min_down_time.jl:29 [inlined]
 [10] (::SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}})(::NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}})
    @ SpineOpt .\none:0
 [11] iterate
    @ .\generator.jl:47 [inlined]
 [12] _all(f::Base.var"#372#374", itr::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}}}, SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}}}, #unused#::Colon)
    @ Base .\reduce.jl:1292
 [13] all
    @ .\reduce.jl:1278 [inlined]
 [14] Dict(kv::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}}}, SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}}})
    @ Base .\dict.jl:111
 [15] add_constraint_min_down_time!(m::JuMP.Model)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\constraints\constraint_min_down_time.jl:28
 [16] macro expansion
    @ .\timing.jl:273 [inlined]
 [17] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:51 [inlined]
 [18] _add_constraints!(m::JuMP.Model; add_constraints::Function, log_level::Int64)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:237
 [19] _add_constraints!
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:156 [inlined]
 [20] macro expansion
    @ .\timing.jl:273 [inlined]
 [21] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:51 [inlined]
 [22] init_model!(m::JuMP.Model; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:102
 [23] rerun_spineopt!(m::JuMP.Model, ::Nothing, ::Nothing, url_out::String; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, update_constraints::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:44
 [24] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Any, NTuple{10, Symbol}, NamedTuple{(:add_user_variables, :add_constraints, :update_constraints, :log_level, :optimize, :update_names, :alternative, :write_as_roll, :resume_file_path, :alternative_objective), Tuple{SpineOpt.var"#50#62", SpineOpt.var"#51#63", SpineOpt.var"#52#64", Int64, Bool, Bool, String, Int64, Nothing, SpineOpt.var"#90#98"}}})
    @ Base .\essentials.jl:818
 [25] rerun_spineopt(url_out::String; mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_constraints::Function, update_constraints::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing, use_direct_model::Bool, alternative_objective::SpineOpt.var"#90#98")
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:281
 [26] _run_spineopt(url_in::String, url_out::String; upgrade::Bool, mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_constraints::Function, update_constraints::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, use_direct_model::Bool, filters::Dict{String, String}, resume_file_path::Nothing)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:194
 [27] _run_spineopt
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:173 [inlined]
 [28] #run_spineopt#43
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:102 [inlined]
 [29] run_spineopt(url_in::String, url_out::String)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:82
 [30] top-level scope
    @ C:\Users\Jeremy Peng\.spinetoolbox\work\run_spineopt__803bb40c8d434aa7ad147c7261806849__toolbox\run_spineopt.jl:3
 [31] include(fname::String)
    @ Base.MainInclude .\client.jl:478
 [32] top-level scope
    @ none:1
in expression starting at C:\Users\Jeremy Peng\.spinetoolbox\work\run_spineopt__803bb40c8d434aa7ad147c7261806849__toolbox\run_spineopt.jl:3

caused by: KeyError: key (unit = 1_CCGT_Exist_Peterhead, stochastic_scenario = realization, t = 2014-12-31T23:00~>2015-01-01T00:00) not found
Stacktrace:
  [1] getindex
    @ .\dict.jl:484 [inlined]
  [2] getindex
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:79 [inlined]
  [3] #1723
    @ .\none:0 [inlined]
  [4] iterate
    @ .\generator.jl:47 [inlined]
  [5] iterate(it::Base.Iterators.Drop{Base.Generator{Vector{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}}, SpineOpt.var"#1723#1728"{Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}}}})
    @ Base.Iterators .\iterators.jl:809
  [6] expr_sum(iter::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}}, SpineOpt.var"#1723#1728"{Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}}}; init::Int64)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:116
  [7] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\MutableArithmetics\h0wjj\src\rewrite.jl:322 [inlined]
  [8] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\JuMP\ptoff\src\macros.jl:986 [inlined]
  [9] #1720
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\constraints\constraint_min_down_time.jl:29 [inlined]
 [10] (::SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}})(::NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}})
    @ SpineOpt .\none:0
 [11] iterate
    @ .\generator.jl:47 [inlined]
 [12] grow_to!(dest::Dict{NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}}, JuMP.ConstraintRef{JuMP.Model, MathOptInterface.ConstraintIndex{MathOptInterface.ScalarAffineFunction{Float64}, MathOptInterface.GreaterThan{Float64}}, JuMP.ScalarShape}}, itr::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}}}, SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}}}, st::Int64)
    @ Base .\dict.jl:142
 [13] grow_to!(dest::Dict{Any, Any}, itr::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}}}, SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}}})
    @ Base .\dict.jl:125
 [14] dict_with_eltype
    @ .\abstractdict.jl:590 [inlined]
 [15] Dict(kv::Base.Generator{Vector{NamedTuple{(:unit, :stochastic_path, :t), Tuple{SpineInterface.Object, Vector{SpineInterface.Object}, SpineInterface.TimeSlice}}}, SpineOpt.var"#1720#1725"{JuMP.Model, SpineInterface._StartRef, Dict{Any, Any}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{NamedTuple{(:unit, :stochastic_scenario, :t), Tuple{SpineInterface.Object, SpineInterface.Object, SpineInterface.TimeSlice}}, JuMP.VariableRef}, Dict{Any, Any}}})
    @ Base .\dict.jl:109
 [16] add_constraint_min_down_time!(m::JuMP.Model)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\constraints\constraint_min_down_time.jl:28
 [17] macro expansion
    @ .\timing.jl:273 [inlined]
 [18] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:51 [inlined]
 [19] _add_constraints!(m::JuMP.Model; add_constraints::Function, log_level::Int64)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:237
 [20] _add_constraints!
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:156 [inlined]
 [21] macro expansion
    @ .\timing.jl:273 [inlined]
 [22] macro expansion
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\util\misc.jl:51 [inlined]
 [23] init_model!(m::JuMP.Model; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:102
 [24] rerun_spineopt!(m::JuMP.Model, ::Nothing, ::Nothing, url_out::String; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, update_constraints::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt_standard.jl:44
 [25] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Any, NTuple{10, Symbol}, NamedTuple{(:add_user_variables, :add_constraints, :update_constraints, :log_level, :optimize, :update_names, :alternative, :write_as_roll, :resume_file_path, :alternative_objective), Tuple{SpineOpt.var"#50#62", SpineOpt.var"#51#63", SpineOpt.var"#52#64", Int64, Bool, Bool, String, Int64, Nothing, SpineOpt.var"#90#98"}}})
    @ Base .\essentials.jl:818
 [26] rerun_spineopt(url_out::String; mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_constraints::Function, update_constraints::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing, use_direct_model::Bool, alternative_objective::SpineOpt.var"#90#98")
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:281
 [27] _run_spineopt(url_in::String, url_out::String; upgrade::Bool, mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_constraints::Function, update_constraints::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, use_direct_model::Bool, filters::Dict{String, String}, resume_file_path::Nothing)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:194
 [28] _run_spineopt
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:173 [inlined]
 [29] #run_spineopt#43
    @ C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:102 [inlined]
 [30] run_spineopt(url_in::String, url_out::String)
    @ SpineOpt C:\Users\Jeremy Peng\.julia\packages\SpineOpt\Flpc7\src\run_spineopt.jl:82
 [31] top-level scope
    @ C:\Users\Jeremy Peng\.spinetoolbox\work\run_spineopt__803bb40c8d434aa7ad147c7261806849__toolbox\run_spineopt.jl:3
 [32] include(fname::String)
    @ Base.MainInclude .\client.jl:478
 [33] top-level scope
    @ none:1

Thanks in advance for any help or explanation.

Best,

Peng

RowanPeng avatar Jul 29 '23 10:07 RowanPeng

Thank you for your time. This issue has been solved. It seems I selected the first day of my model duration, which resulted in this error.

Many thanks,

Peng

RowanPeng avatar Jul 29 '23 13:07 RowanPeng

Hi @RowanPeng thanks for opening this issue. I think you have discovered a bug here, that should be resolved. Problem seems to be related to history of representative days, if they coincide with the first day of the optimization window. Typically, each representative day will "see" the representative day that precedes the original representative day in the full timeseries. However, in case the first day of the optimization window is a representative day, we need to make sure that is history is properly represented (in this case, the day prior to the start of the optimization - or we could link it back to the representative day of the very last day of the optimization)

mihlema avatar Jul 31 '23 17:07 mihlema

@mihlema Can you please reword the title of this issue so it's clear what someone needs to do to implement it?

clizbe avatar Jan 22 '24 16:01 clizbe