Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/load_inputs/process_data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ function process_data(data::AbstractDict{Symbol,Any})
haskey(data, :demand) && check_and_convert_demand!(data)
haskey(data, :constraints) && check_and_convert_constraints!(data)
haskey(data, :rhs_policy) && check_and_convert_rhs_policy!(data)
haskey(data, :policy_lower_bound) && check_and_convert_policy_lower_bound!(data)
haskey(data, :price_unmet_policy) && check_and_convert_price_unmet_policy!(data)
return data
end
Expand Down Expand Up @@ -68,7 +69,6 @@ function convert_inf_string_to_value(data::AbstractDict{Symbol,Any}, key::Symbol
end

function check_and_convert_inf!(data::AbstractDict{Symbol,Any})
convert_inf_string_to_value(data, :max_capacity)
convert_inf_string_to_value(data, :max_capacity)
return nothing
end
Expand Down Expand Up @@ -100,6 +100,20 @@ function check_and_convert_rhs_policy!(data::AbstractDict{Symbol,Any})
return nothing
end

function check_and_convert_policy_lower_bound!(data::AbstractDict{Symbol,Any})
policy_lower_bound = Dict{DataType,Float64}()
constraints = constraint_types()
for (k, v) in data[:policy_lower_bound]
if v== false
continue # Skip if the value is false
end
new_k = constraints[Symbol(k)]
policy_lower_bound[new_k] = v
end
data[:policy_lower_bound] = policy_lower_bound
return nothing
end

function check_and_convert_price_unmet_policy!(data::AbstractDict{Symbol,Any})
price_unmet_policy = Dict{DataType,Float64}()
constraints = constraint_types()
Expand Down
38 changes: 25 additions & 13 deletions src/model/networks/node.jl
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
macro AbstractNodeBaseAttributes()
node_defaults = node_default_data()
esc(quote
demand::Vector{Float64} = Vector{Float64}()
demand::Vector{Float64} = $node_defaults[:demand]
min_nsd::Vector{Float64} = $node_defaults[:min_nsd]
max_nsd::Vector{Float64} = $node_defaults[:max_nsd]
max_supply::Vector{Float64} = $node_defaults[:max_supply]
non_served_demand::JuMPVariable = Matrix{VariableRef}(undef, 0, 0)
policy_budgeting_vars::Dict = Dict()
policy_slack_vars::Dict = Dict()
price::Vector{Float64} = Vector{Float64}()
price::Vector{Float64} = $node_defaults[:price]
price_nsd::Vector{Float64} = $node_defaults[:price_nsd]
price_supply::Vector{Float64} = $node_defaults[:price_supply]
price_unmet_policy::Dict{DataType,Float64} = Dict{DataType,Float64}()
rhs_policy::Dict{DataType,Float64} = Dict{DataType,Float64}()
price_unmet_policy::Dict{DataType,Float64} = $node_defaults[:price_unmet_policy]
rhs_policy::Dict{DataType,Float64} = $node_defaults[:rhs_policy]
policy_lower_bound::Dict{DataType,Float64} = $node_defaults[:policy_lower_bound]
supply_flow::JuMPVariable = Matrix{VariableRef}(undef, 0, 0)
end)
end
Expand Down Expand Up @@ -41,6 +42,7 @@ end
- price_supply::Vector{Float64}: Supply costs by segment
- price_unmet_policy::Dict{DataType,Float64}: Mapping of policy types to penalty costs
- rhs_policy::Dict{DataType,Float64}: Mapping of policy types to right-hand side values
- policy_lower_bound::Dict{DataType,Float64}: Mapping of policy types to lower-bound values
- supply_flow::Union{JuMPVariable,Matrix{Float64}}: JuMP variables or matrix representing supply flows

Note: Base attributes are inherited from AbstractVertex via @AbstractVertexBaseAttributes macro.
Expand All @@ -62,17 +64,20 @@ function make_node(data::AbstractDict{Symbol,Any}, time_data::TimeData, commodit
delete!(filtered_data, key)
end
end
node_defaults = node_default_data()
_node = Node{commodity}(;
id = id,
timedata = time_data,
demand = get(data, :demand, Vector{Float64}()),
max_nsd = get(data, :max_nsd, [0.0]),
max_supply = get(data, :max_supply, [0.0]),
price = get(data, :price, Vector{Float64}()),
price_nsd = get(data, :price_nsd, [0.0]),
price_supply = get(data, :price_supply, [0.0]),
price_unmet_policy = get(data, :price_unmet_policy, Dict{DataType,Float64}()),
rhs_policy = get(data, :rhs_policy, Dict{DataType,Float64}())
demand = get(data, :demand, node_defaults[:demand]),
min_nsd = get(data, :min_nsd, node_defaults[:min_nsd]),
max_nsd = get(data, :max_nsd, node_defaults[:max_nsd]),
max_supply = get(data, :max_supply, node_defaults[:max_supply]),
price = get(data, :price, node_defaults[:price]),
price_nsd = get(data, :price_nsd, node_defaults[:price_nsd]),
price_supply = get(data, :price_supply, node_defaults[:price_supply]),
price_unmet_policy = get(data, :price_unmet_policy, node_defaults[:price_unmet_policy]),
rhs_policy = get(data, :rhs_policy, node_defaults[:rhs_policy]),
policy_lower_bound = get(data, :policy_lower_bound, node_defaults[:policy_lower_bound])
# filtered_data...
)

Expand Down Expand Up @@ -110,6 +115,8 @@ price_unmet_policy(n::Node) = n.price_unmet_policy;
price_unmet_policy(n::Node, c::DataType) = price_unmet_policy(n)[c];
rhs_policy(n::Node) = n.rhs_policy;
rhs_policy(n::Node, c::DataType) = rhs_policy(n)[c];
policy_lower_bound(n::Node) = n.policy_lower_bound;
policy_lower_bound(n::Node, c::DataType) = policy_lower_bound(n)[c];
segments_non_served_demand(n::Node) = 1:length(n.max_nsd);
supply_flow(n::Node) = n.supply_flow;
supply_flow(n::Node, s::Int64, t::Int64) = supply_flow(n)[s, t];
Expand All @@ -132,6 +139,11 @@ function add_linking_variables!(n::Node, model::Model)
[w in subperiod_indices(n)],
base_name = "v" * string(ct_type) * "_Budget_$(id(n))_period$(period_index(n))"
)

# Default if no policy_lower_bound is not adding any lower bound
if haskey(n.policy_lower_bound, ct_type)
set_lower_bound.(n.policy_budgeting_vars[Symbol(string(ct_type) * "_Budget")], n.policy_lower_bound[ct_type])
end
end
end

Expand Down Expand Up @@ -233,7 +245,7 @@ end

function make(commodity::Type{<:Commodity}, input_data::AbstractDict{Symbol,Any}, system)

input_data = recursive_merge(clear_dict(node_default_data()), input_data)
input_data = recursive_merge(node_default_data(), input_data)
defaults = node_default_data()

@process_data(data, input_data, [(input_data, key)])
Expand Down
2 changes: 1 addition & 1 deletion src/model/scaling.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ function scaling!(system::System)
end

function attributes_to_scale(n::Node)
return [:demand, :max_supply, :price, :price_nsd, :price_supply, :price_unmet_policy, :rhs_policy]
return [:demand, :max_supply, :price, :price_nsd, :price_supply, :price_unmet_policy, :rhs_policy, :policy_lower_bound]
end

function attributes_to_scale(e::Edge)
Expand Down
1 change: 1 addition & 0 deletions src/utilities/default_data.jl
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ function node_default_data()
:max_supply => [0.0],
:price_unmet_policy => Dict{Symbol,Any}(),
:rhs_policy => Dict{Symbol,Any}(),
:policy_lower_bound => Dict{Symbol,Any}(:CO2CapConstraint => 0.0, :CO2StorageConstraint => 0.0),
)
end

Expand Down