From d7530a168268ed3d9854fcc40d24ca30aee0c29f Mon Sep 17 00:00:00 2001 From: Lauren Clisby Date: Wed, 18 Oct 2023 11:30:55 +0200 Subject: [PATCH] Changed naming convention and removed old CSVs --- src/input_tables.jl | 22 +- src/io.jl | 44 ++-- test/inputs/assets.csv | 8 - test/inputs/profiles.csv | 218 ------------------ .../tiny/{nodes-data.csv => assets-data.csv} | 0 ...nodes-profiles.csv => assets-profiles.csv} | 0 ...bad-nodes-data.csv => bad-assets-data.csv} | 0 test/inputs/tiny/edges-data.csv | 7 - test/inputs/tiny/flows-data.csv | 7 + ...{edges-profiles.csv => flows-profiles.csv} | 0 test/inputs/weights.csv | 5 - test/runtests.jl | 10 +- 12 files changed, 45 insertions(+), 276 deletions(-) delete mode 100644 test/inputs/assets.csv delete mode 100644 test/inputs/profiles.csv rename test/inputs/tiny/{nodes-data.csv => assets-data.csv} (100%) rename test/inputs/tiny/{nodes-profiles.csv => assets-profiles.csv} (100%) rename test/inputs/tiny/{bad-nodes-data.csv => bad-assets-data.csv} (100%) delete mode 100644 test/inputs/tiny/edges-data.csv create mode 100644 test/inputs/tiny/flows-data.csv rename test/inputs/tiny/{edges-profiles.csv => flows-profiles.csv} (100%) delete mode 100644 test/inputs/weights.csv diff --git a/src/input_tables.jl b/src/input_tables.jl index b0eae0cf..d608d1c6 100644 --- a/src/input_tables.jl +++ b/src/input_tables.jl @@ -1,6 +1,6 @@ -struct NodeData - id::Int # Node ID - name::String # Name of node (geographical?) +struct AssetData + id::Int # Asset ID + name::String # Name of Asset (geographical?) type::String # Producer/Consumer - maybe an enum? active::Bool # Active or decomissioned investable::Bool # Whether able to invest @@ -11,11 +11,11 @@ struct NodeData peak_demand::Float64 # MW end -struct EdgeData - id::Int # Edge ID +struct FlowData + id::Int # Flow ID carrier::String # (Optional?) Energy carrier - from_node_id::Int # Node ID - to_node_id::Int # Node ID + from_asset_id::Int # Asset ID + to_asset_id::Int # Asset ID active::Bool # Active or decomissioned investable::Bool # Whether able to invest variable_cost::Float64 # kEUR/MWh @@ -24,15 +24,15 @@ struct EdgeData initial_capacity::Float64 # MW end -struct EdgeProfiles - id::Int # Edge ID +struct FlowProfiles + id::Int # Flow ID rep_period_id::Int time_step::Int value::Float64 # p.u. end -struct NodeProfiles - id::Int # Node ID +struct AssetProfiles + id::Int # Asset ID rep_period_id::Int time_step::Int value::Float64 # p.u. diff --git a/src/io.jl b/src/io.jl index 311ad583..61fb8d35 100644 --- a/src/io.jl +++ b/src/io.jl @@ -8,19 +8,19 @@ input files in the `input_folder`. """ function create_parameters_and_sets_from_file(input_folder::AbstractString) # Read data - nodes_data_df = get_df(input_folder, "nodes-data.csv", NodeData; header = 2) - nodes_profiles_df = get_df(input_folder, "nodes-profiles.csv", NodeProfiles; header = 2) - # edges_data_df = get_df(input_folder, "edges-data.csv", EdgeData; header = 2) - # edges_profiles_df = get_df(input_folder, "edges-profiles.csv", EdgeProfiles; header = 2) + assets_data_df = get_df(input_folder, "assets-data.csv", AssetData; header = 2) + assets_profiles_df = get_df(input_folder, "assets-profiles.csv", AssetProfiles; header = 2) + # flows_data_df = get_df(input_folder, "flows-data.csv", FlowData; header = 2) + # flows_profiles_df = get_df(input_folder, "flows-profiles.csv", FlowProfiles; header = 2) rep_period_df = get_df(input_folder, "rep-periods-data.csv", RepPeriodData; header = 2) # Sets and subsets that depend on input data - A = assets = nodes_data_df[nodes_data_df.active.==true, :].name #assets in the energy system that are active - Ap = assets_producer = nodes_data_df[nodes_data_df.type.=="producer", :].name #producer assets in the energy system - Ac = assets_consumer = nodes_data_df[nodes_data_df.type.=="consumer", :].name #consumer assets in the energy system - assets_investment = nodes_data_df[nodes_data_df.investable.==true, :].name #assets with investment method in the energy system - rep_periods = unique(nodes_profiles_df.rep_period_id) #representative periods - time_steps = unique(nodes_profiles_df.time_step) #time steps in the RP (e.g., hours) + A = assets = assets_data_df[assets_data_df.active.==true, :].name #assets in the energy system that are active + Ap = assets_producer = assets_data_df[assets_data_df.type.=="producer", :].name #producer assets in the energy system + Ac = assets_consumer = assets_data_df[assets_data_df.type.=="consumer", :].name #consumer assets in the energy system + assets_investment = assets_data_df[assets_data_df.investable.==true, :].name #assets with investment method in the energy system + rep_periods = unique(assets_profiles_df.rep_period_id) #representative periods + time_steps = unique(assets_profiles_df.time_step) #time steps in the RP (e.g., hours) # Parameters for system rep_weight = Dict((row.id) => row.weight for row in eachrow(rep_period_df)) #representative period weight [h] @@ -28,7 +28,7 @@ function create_parameters_and_sets_from_file(input_folder::AbstractString) # Parameters for assets profile = Dict( (A[row.id], row.rep_period_id, row.time_step) => row.value for - row in eachrow(nodes_profiles_df) + row in eachrow(assets_profiles_df) ) # asset profile [p.u.] # Parameters for producers @@ -36,7 +36,7 @@ function create_parameters_and_sets_from_file(input_folder::AbstractString) investment_cost = Dict{String,Float64}() unit_capacity = Dict{String,Float64}() init_capacity = Dict{String,Float64}() - for row in eachrow(nodes_data_df) + for row in eachrow(assets_data_df) if row.name in Ap variable_cost[row.name] = row.variable_cost investment_cost[row.name] = row.investment_cost @@ -47,7 +47,7 @@ function create_parameters_and_sets_from_file(input_folder::AbstractString) # Parameters for consumers peak_demand = Dict{String,Float64}() - for row in eachrow(nodes_data_df) + for row in eachrow(assets_data_df) if row.name in Ac peak_demand[row.name] = row.peak_demand end @@ -113,19 +113,19 @@ function save_solution_to_file( end """ - graph = create_graph(nodes_path, edges_path) + graph = create_graph(assets_path, flows_path) -Read the nodes and edges data CSVs and create a graph object. +Read the assets and flows data CSVs and create a graph object. """ -function create_graph(nodes_path, edges_path) - nodes_df = CSV.read(nodes_path, DataFrames.DataFrame; header = 2) - edges_df = CSV.read(edges_path, DataFrames.DataFrame; header = 2) +function create_graph(assets_path, flows_path) + assets_df = CSV.read(assets_path, DataFrames.DataFrame; header = 2) + flows_df = CSV.read(flows_path, DataFrames.DataFrame; header = 2) - num_nodes = DataFrames.nrow(nodes_df) + num_assets = DataFrames.nrow(assets_df) - graph = Graphs.DiGraph(num_nodes) - for row in eachrow(edges_df) - Graphs.add_edge!(graph, row.from_node_id, row.to_node_id) + graph = Graphs.DiGraph(num_assets) + for row in eachrow(flows_df) + Graphs.add_edge!(graph, row.from_asset_id, row.to_asset_id) end return graph diff --git a/test/inputs/assets.csv b/test/inputs/assets.csv deleted file mode 100644 index b4c9d492..00000000 --- a/test/inputs/assets.csv +++ /dev/null @@ -1,8 +0,0 @@ -,{producer;consumer},{true;false},{invest;not_allowed},[list of assets],[list of assets],kEUR/MWh,kEUR/MW/year,MW,MW,MW -asset_name,asset_type,is_active,invest_method,input_assets,output_assets,variable_cost,investment_cost,asset_capacity,initial_capacity,consumer_peak_demand -ocgt,producer,true,invest,[],node,0.07,25,100,0,0 -ccgt,producer,true,invest,[],node,0.05,40,400,0,0 -wind,producer,true,invest,[],node,0.001,70,50,0,0 -solar,producer,true,invest,[],node,0,50,10,0,0 -ens,producer,true,not_allowed,[],node,0.180,0,0,0,0 -node,consumer,true,not_allowed,[],[],0,0,0,0,1115 diff --git a/test/inputs/profiles.csv b/test/inputs/profiles.csv deleted file mode 100644 index 8755114b..00000000 --- a/test/inputs/profiles.csv +++ /dev/null @@ -1,218 +0,0 @@ -,,,p.u. -asset_name,rp,k,profile_value -wind,rp1,k01,0.11 -wind,rp1,k02,0.11 -wind,rp1,k03,0.11 -wind,rp1,k04,0.11 -wind,rp1,k05,0.1 -wind,rp1,k06,0.1 -wind,rp1,k07,0.1 -wind,rp1,k08,0.09 -wind,rp1,k09,0.09 -wind,rp1,k10,0.09 -wind,rp1,k11,0.09 -wind,rp1,k12,0.09 -wind,rp1,k13,0.1 -wind,rp1,k14,0.12 -wind,rp1,k15,0.14 -wind,rp1,k16,0.15 -wind,rp1,k17,0.16 -wind,rp1,k18,0.16 -wind,rp1,k19,0.16 -wind,rp1,k20,0.15 -wind,rp1,k21,0.14 -wind,rp1,k22,0.13 -wind,rp1,k23,0.12 -wind,rp1,k24,0.12 -wind,rp2,k01,0.54 -wind,rp2,k02,0.54 -wind,rp2,k03,0.53 -wind,rp2,k04,0.52 -wind,rp2,k05,0.51 -wind,rp2,k06,0.5 -wind,rp2,k07,0.48 -wind,rp2,k08,0.47 -wind,rp2,k09,0.46 -wind,rp2,k10,0.45 -wind,rp2,k11,0.45 -wind,rp2,k12,0.45 -wind,rp2,k13,0.43 -wind,rp2,k14,0.41 -wind,rp2,k15,0.38 -wind,rp2,k16,0.35 -wind,rp2,k17,0.34 -wind,rp2,k18,0.35 -wind,rp2,k19,0.36 -wind,rp2,k20,0.38 -wind,rp2,k21,0.41 -wind,rp2,k22,0.43 -wind,rp2,k23,0.46 -wind,rp2,k24,0.48 -wind,rp3,k01,0.68 -wind,rp3,k02,0.69 -wind,rp3,k03,0.7 -wind,rp3,k04,0.71 -wind,rp3,k05,0.73 -wind,rp3,k06,0.74 -wind,rp3,k07,0.75 -wind,rp3,k08,0.76 -wind,rp3,k09,0.77 -wind,rp3,k10,0.78 -wind,rp3,k11,0.79 -wind,rp3,k12,0.8 -wind,rp3,k13,0.81 -wind,rp3,k14,0.81 -wind,rp3,k15,0.8 -wind,rp3,k16,0.79 -wind,rp3,k17,0.78 -wind,rp3,k18,0.77 -wind,rp3,k19,0.76 -wind,rp3,k20,0.75 -wind,rp3,k21,0.74 -wind,rp3,k22,0.74 -wind,rp3,k23,0.74 -wind,rp3,k24,0.74 -solar,rp1,k01,0.0 -solar,rp1,k02,0.0 -solar,rp1,k03,0.0 -solar,rp1,k04,0.0 -solar,rp1,k05,0.0 -solar,rp1,k06,0.02 -solar,rp1,k07,0.12 -solar,rp1,k08,0.3 -solar,rp1,k09,0.5 -solar,rp1,k10,0.66 -solar,rp1,k11,0.78 -solar,rp1,k12,0.83 -solar,rp1,k13,0.83 -solar,rp1,k14,0.78 -solar,rp1,k15,0.68 -solar,rp1,k16,0.53 -solar,rp1,k17,0.35 -solar,rp1,k18,0.17 -solar,rp1,k19,0.04 -solar,rp1,k20,0.0 -solar,rp1,k21,0.0 -solar,rp1,k22,0.0 -solar,rp1,k23,0.0 -solar,rp1,k24,0.0 -solar,rp2,k01,0.0 -solar,rp2,k02,0.0 -solar,rp2,k03,0.0 -solar,rp2,k04,0.0 -solar,rp2,k05,0.0 -solar,rp2,k06,0.0 -solar,rp2,k07,0.01 -solar,rp2,k08,0.07 -solar,rp2,k09,0.2 -solar,rp2,k10,0.36 -solar,rp2,k11,0.5 -solar,rp2,k12,0.57 -solar,rp2,k13,0.59 -solar,rp2,k14,0.54 -solar,rp2,k15,0.44 -solar,rp2,k16,0.29 -solar,rp2,k17,0.13 -solar,rp2,k18,0.03 -solar,rp2,k19,0.0 -solar,rp2,k20,0.0 -solar,rp2,k21,0.0 -solar,rp2,k22,0.0 -solar,rp2,k23,0.0 -solar,rp2,k24,0.0 -solar,rp3,k01,0.0 -solar,rp3,k02,0.0 -solar,rp3,k03,0.0 -solar,rp3,k04,0.0 -solar,rp3,k05,0.0 -solar,rp3,k06,0.0 -solar,rp3,k07,0.0 -solar,rp3,k08,0.01 -solar,rp3,k09,0.12 -solar,rp3,k10,0.28 -solar,rp3,k11,0.42 -solar,rp3,k12,0.51 -solar,rp3,k13,0.53 -solar,rp3,k14,0.5 -solar,rp3,k15,0.4 -solar,rp3,k16,0.23 -solar,rp3,k17,0.05 -solar,rp3,k18,0.0 -solar,rp3,k19,0.0 -solar,rp3,k20,0.0 -solar,rp3,k21,0.0 -solar,rp3,k22,0.0 -solar,rp3,k23,0.0 -solar,rp3,k24,0.0 -node,rp1,k01,0.852017937 -node,rp1,k02,0.780269058 -node,rp1,k03,0.730044843 -node,rp1,k04,0.698654709 -node,rp1,k05,0.679820628 -node,rp1,k06,0.673542601 -node,rp1,k07,0.698654709 -node,rp1,k08,0.747982063 -node,rp1,k09,0.80896861 -node,rp1,k10,0.857399103 -node,rp1,k11,0.905829596 -node,rp1,k12,0.917488789 -node,rp1,k13,0.913004484 -node,rp1,k14,0.905829596 -node,rp1,k15,0.878923767 -node,rp1,k16,0.865470852 -node,rp1,k17,0.86367713 -node,rp1,k18,0.894170404 -node,rp1,k19,0.980269058 -node,rp1,k20,0.999103139 -node,rp1,k21,1.0 -node,rp1,k22,0.992825112 -node,rp1,k23,0.944394619 -node,rp1,k24,0.928251121 -node,rp2,k01,0.852017937 -node,rp2,k02,0.780269058 -node,rp2,k03,0.730044843 -node,rp2,k04,0.698654709 -node,rp2,k05,0.679820628 -node,rp2,k06,0.673542601 -node,rp2,k07,0.698654709 -node,rp2,k08,0.747982063 -node,rp2,k09,0.80896861 -node,rp2,k10,0.857399103 -node,rp2,k11,0.905829596 -node,rp2,k12,0.917488789 -node,rp2,k13,0.913004484 -node,rp2,k14,0.905829596 -node,rp2,k15,0.878923767 -node,rp2,k16,0.865470852 -node,rp2,k17,0.86367713 -node,rp2,k18,0.894170404 -node,rp2,k19,0.980269058 -node,rp2,k20,0.999103139 -node,rp2,k21,1.0 -node,rp2,k22,0.992825112 -node,rp2,k23,0.944394619 -node,rp2,k24,0.928251121 -node,rp3,k01,0.852017937 -node,rp3,k02,0.780269058 -node,rp3,k03,0.730044843 -node,rp3,k04,0.698654709 -node,rp3,k05,0.679820628 -node,rp3,k06,0.673542601 -node,rp3,k07,0.698654709 -node,rp3,k08,0.747982063 -node,rp3,k09,0.80896861 -node,rp3,k10,0.857399103 -node,rp3,k11,0.905829596 -node,rp3,k12,0.917488789 -node,rp3,k13,0.913004484 -node,rp3,k14,0.905829596 -node,rp3,k15,0.878923767 -node,rp3,k16,0.865470852 -node,rp3,k17,0.86367713 -node,rp3,k18,0.894170404 -node,rp3,k19,0.980269058 -node,rp3,k20,0.999103139 -node,rp3,k21,1.0 -node,rp3,k22,0.992825112 -node,rp3,k23,0.944394619 -node,rp3,k24,0.928251121 diff --git a/test/inputs/tiny/nodes-data.csv b/test/inputs/tiny/assets-data.csv similarity index 100% rename from test/inputs/tiny/nodes-data.csv rename to test/inputs/tiny/assets-data.csv diff --git a/test/inputs/tiny/nodes-profiles.csv b/test/inputs/tiny/assets-profiles.csv similarity index 100% rename from test/inputs/tiny/nodes-profiles.csv rename to test/inputs/tiny/assets-profiles.csv diff --git a/test/inputs/tiny/bad-nodes-data.csv b/test/inputs/tiny/bad-assets-data.csv similarity index 100% rename from test/inputs/tiny/bad-nodes-data.csv rename to test/inputs/tiny/bad-assets-data.csv diff --git a/test/inputs/tiny/edges-data.csv b/test/inputs/tiny/edges-data.csv deleted file mode 100644 index 36dce348..00000000 --- a/test/inputs/tiny/edges-data.csv +++ /dev/null @@ -1,7 +0,0 @@ -,,node_id,node_id,{true;false},{true;false},kEUR/MWh,kEUR/MW/year,MW,MW -id,carrier,from_node_id,to_node_id,active,investable,variable_cost,investment_cost,capacity,initial_capacity -1,electricity,1,6,true,,,,, -2,electricity,2,6,true,,,,, -3,electricity,3,6,true,,,,, -4,electricity,4,6,true,,,,, -5,electricity,5,6,true,,,,, diff --git a/test/inputs/tiny/flows-data.csv b/test/inputs/tiny/flows-data.csv new file mode 100644 index 00000000..8f0182ce --- /dev/null +++ b/test/inputs/tiny/flows-data.csv @@ -0,0 +1,7 @@ +,,asset_id,asset_id,{true;false},{true;false},kEUR/MWh,kEUR/MW/year,MW,MW +id,carrier,from_asset_id,to_asset_id,active,investable,variable_cost,investment_cost,capacity,initial_capacity +1,electricity,1,6,true,,,,, +2,electricity,2,6,true,,,,, +3,electricity,3,6,true,,,,, +4,electricity,4,6,true,,,,, +5,electricity,5,6,true,,,,, diff --git a/test/inputs/tiny/edges-profiles.csv b/test/inputs/tiny/flows-profiles.csv similarity index 100% rename from test/inputs/tiny/edges-profiles.csv rename to test/inputs/tiny/flows-profiles.csv diff --git a/test/inputs/weights.csv b/test/inputs/weights.csv deleted file mode 100644 index a00e98ef..00000000 --- a/test/inputs/weights.csv +++ /dev/null @@ -1,5 +0,0 @@ -,hours -rp,weight -rp1,73.0 -rp2,182.5 -rp3,109.5 diff --git a/test/runtests.jl b/test/runtests.jl index 304e2595..b7a9f1f5 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -11,7 +11,7 @@ const OUTPUT_FOLDER = joinpath(@__DIR__, "outputs") @testset "TulipaEnergyModel.jl" begin dir = joinpath(INPUT_FOLDER, "tiny") parameters, sets = create_parameters_and_sets_from_file(dir) - graph = create_graph(joinpath(dir, "nodes-data.csv"), joinpath(dir, "edges-data.csv")) + graph = create_graph(joinpath(dir, "assets-data.csv"), joinpath(dir, "flows-data.csv")) solution = optimise_investments(graph, parameters, sets) @test solution.objective_value ≈ 269238.43825 atol = 1e-5 save_solution_to_file( @@ -26,7 +26,7 @@ end @testset "Graph structure is correct" begin dir = joinpath(INPUT_FOLDER, "tiny") graph = - create_graph(joinpath(dir, "nodes-data.csv"), joinpath(dir, "edges-data.csv")) + create_graph(joinpath(dir, "assets-data.csv"), joinpath(dir, "flows-data.csv")) @test Graphs.nv(graph) == 6 @test Graphs.ne(graph) == 5 @@ -39,13 +39,13 @@ end # FIXME: test separately @testset "missing columns and incompatible types" begin dir = joinpath(INPUT_FOLDER, "tiny") - df = CSV.read(joinpath(dir, "bad-nodes-data.csv"), DataFrame; header = 2) + df = CSV.read(joinpath(dir, "bad-assets-data.csv"), DataFrame; header = 2) # FIXME: instead of examples, mutate and test col_err, col_type_err = TulipaEnergyModel.validate_df( df, - TulipaEnergyModel.NodeData; - fname = "bad-nodes-data.csv", + TulipaEnergyModel.AssetData; + fname = "bad-assets-data.csv", silent = true, ) @test col_err == [:id]