spine-tools / SpineOpt.jl

A highly adaptable modelling framework for multi-energy systems
https://www.tools-for-energy-system-modelling.org/
GNU General Public License v3.0
56 stars 13 forks source link

MethodError: no method matching isnan(::SpineInterface.Map{Symbol, Int64}) #790

Open tarskul opened 11 months ago

tarskul commented 11 months ago

I'm wondering whether the following is a bug or whether I'm misunderstanding a feature.

I'm trying to run a stochastic structure for a specific part of the energy system. In particular I'm using the relation ship between a stochastic structure and a unit for units_on. I then use the labels of the scenarios to get different values for the initial number of units that are on.

But when I try to give a map value for the initial units on I get this error MethodError: no method matching isnan(::SpineInterface.Map{Symbol, Int64})

My specific steps are (starting from a deterministic UC model of the simple system):

tarskul commented 11 months ago

@Tasqu says: Seems like stochastic data for the initial values is not supported, at least using the initial_units_on parameter 🤔 You can try fixing the initial values via fix_units_on for the time slices you want, but for that you need to give the specific timestamps.

In any case, I'm not sure if the stochastic framework supports that. I can't quite recall how the stochastic indices are handled for "historic time slices". I remember experimenting with that at some point, and implementing a system where the stochastic indices for the historic time slices are assumed to repeat the structure of the rolling window, but I'm not sure if that was the final version (because it was needlessly complicated). I think it just assumes that the "root" stochastic scenario applies for all historic time slices instead.

tarskul commented 11 months ago

@Tasqu says: This, though, is pretty clearly a bug:

MethodError: no method matching isnan(::SpineInterface.Map{Symbol, Int64})

Seems like we haven't implemented a isnan method in SpineInterface.

tarskul commented 11 months ago

The full traceback:

julia> # Running julia run_spineopt.jl http://127.0.0.1:41125 http://127.0.0.1:38221
2-element Vector{String}:
 "http://127.0.0.1:41125"
 "http://127.0.0.1:38221"

Execution started at 2023-11-07T09:24:43.968
Preparing SpineOpt for REDACTED
Initializing data structure from db... 18.668077 seconds (21.56 M allocations: 1.360 GiB, 3.78% gc time, 97.89% compilation time)
Preprocessing data structure... 12.288935 seconds (11.30 M allocations: 745.305 MiB, 3.30% gc time, 99.66% compilation time)
Checking data structure...  2.645580 seconds (1.90 M allocations: 125.437 MiB, 2.91% gc time, 99.43% compilation time)
Running SpineOpt...
Creating temporal structure...  5.906370 seconds (4.42 M allocations: 293.975 MiB, 2.69% gc time, 99.43% compilation time)
Creating stochastic structure...  5.894676 seconds (4.66 M allocations: 300.266 MiB, 2.93% gc time, 99.54% compilation time)
Adding variables...
- [variable_units_available]  5.264829 seconds (4.14 M allocations: 269.879 MiB, 3.05% gc time, 99.43% compilation time)
ERROR: LoadError: MethodError: no method matching _show_call(::IOBuffer, ::SpineInterface.Call, ::Nothing, ::SpineInterface.ParameterValue{SpineInterface.TimeSeries{Any}})

Closest candidates are:
  _show_call(::IO, ::SpineInterface.Call, ::Nothing, ::Nothing)
   @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/base.jl:83
  _show_call(::IO, ::SpineInterface.Call, ::Nothing, ::Function)
   @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/base.jl:84
  _show_call(::IO, ::SpineInterface.Call, ::Tuple{Symbol, NamedTuple}, ::SpineInterface.ParameterValue)
   @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/base.jl:92

Stacktrace:
  [1] show(io::IOBuffer, call::SpineInterface.Call)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/base.jl:82
  [2] print(io::IOBuffer, x::SpineInterface.Call)
    @ Base ./strings/io.jl:35
  [3] print_to_string(::String, ::Vararg{Any})
    @ Base ./strings/io.jl:144
  [4] string
    @ ./strings/io.jl:185 [inlined]
  [5] realize(call::SpineInterface.Call, callback::SpineInterface._VariableFixValueUpdate)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/api/core.jl:652
  [6] fix(var::JuMP.VariableRef, call::SpineInterface.Call)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/update_model.jl:175
  [7] add_variable!(m::JuMP.Model, name::Symbol, indices::typeof(units_on_indices); bin::typeof(SpineOpt.units_on_bin), int::typeof(SpineOpt.units_on_int), lb::SpineOpt.Constant, ub::Nothing, initial_value::SpineInterface.Parameter, fix_value::SpineInterface.Parameter, internal_fix_value::Nothing, replacement_value::typeof(SpineOpt.units_on_replacement_value), non_anticipativity_time::SpineInterface.Parameter, non_anticipativity_margin::SpineInterface.Parameter)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/variables/variable_common.jl:81
  [8] add_variable_units_on!(m::JuMP.Model)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/variables/variable_units_on.jl:80
  [9] macro expansion
    @ ./timing.jl:273 [inlined]
 [10] macro expansion
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/util/misc.jl:51 [inlined]
 [11] _add_variables!(m::JuMP.Model; add_user_variables::SpineOpt.var"#62#72", log_level::Int64)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:126
 [12] macro expansion
    @ ./timing.jl:273 [inlined]
 [13] macro expansion
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/util/misc.jl:51 [inlined]
 [14] init_model!(m::JuMP.Model; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:76
 [15] init_model!
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:73 [inlined]
 [16] rerun_spineopt_standard!(m::JuMP.Model, url_out::String; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:37
 [17] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Any, NTuple{9, Symbol}, NamedTuple{(:add_user_variables, :add_constraints, :log_level, :optimize, :update_names, :alternative, :write_as_roll, :resume_file_path, :alternative_objective), Tuple{SpineOpt.var"#62#72", SpineOpt.var"#63#73", Int64, Bool, Bool, String, Int64, Nothing, SpineOpt.var"#92#98"}}})
    @ Base ./essentials.jl:821
 [18] rerun_spineopt(url_out::String; mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing, use_direct_model::Bool)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:274
 [19] _run_spineopt(url_in::String, url_out::String; upgrade::Bool, mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_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 ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:187
 [20] _run_spineopt
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:167 [inlined]
 [21] #run_spineopt#55
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:98 [inlined]
 [22] run_spineopt(url_in::String, url_out::String)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:79
 [23] top-level scope
    @ ~/.spinetoolbox/work/run_spineopt__0a2886aa13374fbf865a848ac5519aa3__toolbox/run_spineopt.jl:3
 [24] include(fname::String)
    @ Base.MainInclude ./client.jl:478
 [25] top-level scope
    @ none:1
in expression starting at 
[stochastic_UC.json](https://github.com/spine-tools/SpineOpt.jl/files/13277493/stochastic_UC.json)
/home/tarskul/.spinetoolbox/work/run_spineopt__0a2886aa13374fbf865a848ac5519aa3__toolbox/run_spineopt.jl:3

caused by: MethodError: no method matching isnan(::SpineInterface.Map{Symbol, Int64})

Closest candidates are:
  isnan(::Complex)
   @ Base complex.jl:150
  isnan(::ForwardDiff.Dual)
   @ ForwardDiff ~/miniconda3/envs/spineusr/share/julia/packages/ForwardDiff/PcZ48/src/dual.jl:386
  isnan(::DualNumbers.Dual)
   @ DualNumbers ~/miniconda3/envs/spineusr/share/julia/packages/DualNumbers/5knFX/src/dual.jl:52
  ...

Stacktrace:
  [1] call_composed(fs::Tuple{typeof(isnan)}, x::Tuple{SpineInterface.Map{Symbol, Int64}}, kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Base ./operators.jl:1035
  [2] call_composed
    @ ./operators.jl:1034 [inlined]
  [3] (::ComposedFunction{typeof(!), typeof(isnan)})(x::SpineInterface.Map{Symbol, Int64}; kw::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Base ./operators.jl:1031
  [4] (::ComposedFunction{typeof(!), typeof(isnan)})(x::SpineInterface.Map{Symbol, Int64})
    @ Base ./operators.jl:1031
  [5] iterate(::Base.Iterators.Filter{ComposedFunction{typeof(!), typeof(isnan)}, Vector{Any}})
    @ Base.Iterators ./iterators.jl:514
  [6] mean(f::typeof(identity), itr::Base.Iterators.Filter{ComposedFunction{typeof(!), typeof(isnan)}, Vector{Any}})
    @ Statistics ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/Statistics/src/Statistics.jl:62
  [7] mean
    @ ~/packages/julias/julia-1.9/share/julia/stdlib/v1.9/Statistics/src/Statistics.jl:44 [inlined]
  [8] _get_time_series_value(pv::SpineInterface.ParameterValue{SpineInterface.TimeSeries{Any}}, t::SpineInterface.TimeSlice, callback::Function)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/api/core.jl:293
  [9] _get_value
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/api/core.jl:274 [inlined]
 [10] #_#226
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/api/core.jl:229 [inlined]
 [11] _do_realize(pv::SpineInterface.ParameterValue{SpineInterface.TimeSeries{Any}}, call::SpineInterface.Call, callback::Function)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/util.jl:159
 [12] _do_realize(call::SpineInterface.Call, callback::Function)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/util.jl:157
 [13] realize(call::SpineInterface.Call, callback::SpineInterface._VariableFixValueUpdate)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/api/core.jl:650
 [14] fix(var::JuMP.VariableRef, call::SpineInterface.Call)
    @ SpineInterface ~/miniconda3/envs/spineusr/share/julia/packages/SpineInterface/oFpDM/src/update_model.jl:175
 [15] add_variable!(m::JuMP.Model, name::Symbol, indices::typeof(units_on_indices); bin::typeof(SpineOpt.units_on_bin), int::typeof(SpineOpt.units_on_int), lb::SpineOpt.Constant, ub::Nothing, initial_value::SpineInterface.Parameter, fix_value::SpineInterface.Parameter, internal_fix_value::Nothing, replacement_value::typeof(SpineOpt.units_on_replacement_value), non_anticipativity_time::SpineInterface.Parameter, non_anticipativity_margin::SpineInterface.Parameter)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/variables/variable_common.jl:81
 [16] add_variable_units_on!(m::JuMP.Model)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/variables/variable_units_on.jl:80
 [17] macro expansion
    @ ./timing.jl:273 [inlined]
 [18] macro expansion
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/util/misc.jl:51 [inlined]
 [19] _add_variables!(m::JuMP.Model; add_user_variables::SpineOpt.var"#62#72", log_level::Int64)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:126
 [20] macro expansion
    @ ./timing.jl:273 [inlined]
 [21] macro expansion
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/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 ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:76
 [23] init_model!
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:73 [inlined]
 [24] rerun_spineopt_standard!(m::JuMP.Model, url_out::String; add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt_standard.jl:37
 [25] invokelatest(::Any, ::Any, ::Vararg{Any}; kwargs::Base.Pairs{Symbol, Any, NTuple{9, Symbol}, NamedTuple{(:add_user_variables, :add_constraints, :log_level, :optimize, :update_names, :alternative, :write_as_roll, :resume_file_path, :alternative_objective), Tuple{SpineOpt.var"#62#72", SpineOpt.var"#63#73", Int64, Bool, Bool, String, Int64, Nothing, SpineOpt.var"#92#98"}}})
    @ Base ./essentials.jl:821
 [26] rerun_spineopt(url_out::String; mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_constraints::Function, alternative_objective::Function, log_level::Int64, optimize::Bool, update_names::Bool, alternative::String, write_as_roll::Int64, resume_file_path::Nothing, use_direct_model::Bool)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:274
 [27] _run_spineopt(url_in::String, url_out::String; upgrade::Bool, mip_solver::Nothing, lp_solver::Nothing, add_user_variables::Function, add_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 ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:187
 [28] _run_spineopt
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:167 [inlined]
 [29] #run_spineopt#55
    @ ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:98 [inlined]
 [30] run_spineopt(url_in::String, url_out::String)
    @ SpineOpt ~/miniconda3/envs/spineusr/share/julia/packages/SpineOpt/ifkx1/src/run_spineopt.jl:79
 [31] top-level scope
    @ ~/.spinetoolbox/work/run_spineopt__0a2886aa13374fbf865a848ac5519aa3__toolbox/run_spineopt.jl:3
 [32] include(fname::String)
    @ Base.MainInclude ./client.jl:478
 [33] top-level scope
    @ none:1
tarskul commented 11 months ago

stochastic_UC.json