diff --git a/sddp.jl/sddp-market.lua b/sddp.jl/sddp-market.lua index 5e706eb..2b225f5 100644 --- a/sddp.jl/sddp-market.lua +++ b/sddp.jl/sddp-market.lua @@ -122,7 +122,8 @@ end local function cvar_scenario(exp, lambda, alpha) local preexp = exp:aggregate_blocks(BY_SUM()) - return (1-lambda) * preexp:aggregate_scenarios(BY_AVERAGE()) + lambda * preexp:aggregate_scenarios(BY_CVAR_L(alpha)) + return (1-lambda) * preexp:aggregate_scenarios(BY_AVERAGE()) + + lambda * preexp:aggregate_scenarios(BY_CVAR_L(alpha)) end -- load collections @@ -140,38 +141,44 @@ cinte1():save_and_load("cinte1-psrio"); -- discount_rate():save_and_load("discount_rate-psrio"); -- create dashboard tabs -local tab_marginal_costs = Tab("Spot Price"); -tab_marginal_costs:set_icon("dollar-sign"); +local dashboard_marginal_costs = Dashboard("Spot Price"); +dashboard_marginal_costs:set_icon("dollar-sign"); -local tab_netrev_captured = Tab("Normalized Net Revenue"); -tab_netrev_captured:set_icon("dollar-sign"); +local dashboard_netrev_captured = Dashboard("Normalized Net Revenue"); +dashboard_netrev_captured:set_icon("dollar-sign"); -local tab_costs = Tab("Costs"); -tab_costs:set_icon("dollar-sign"); +local dashboard_costs = Dashboard("Costs"); +dashboard_costs:set_icon("dollar-sign"); -local tab_generation = Tab("Generation"); -tab_generation:set_icon("zap"); +local dashboard_generation = Dashboard("Generation"); +dashboard_generation:set_icon("zap"); -local tab_revenue = Tab("Revenue"); -tab_revenue:set_icon("activity"); +local dashboard_revenue = Dashboard("Revenue"); +dashboard_revenue:set_icon("activity"); -local tab_netrev = Tab("Net Revenue"); -tab_netrev:set_icon("activity"); +local dashboard_netrev = Dashboard("Net Revenue"); +dashboard_netrev:set_icon("activity"); -local tab_rskrev = Tab("Risk Net Revenue"); -tab_rskrev:set_icon("activity"); +local dashboard_rskrev = Dashboard("Risk Net Revenue"); +dashboard_rskrev:set_icon("activity"); -local tab_volume = Tab("Stored Energy (System)"); -tab_volume:set_icon("battery-charging"); +local dashboard_volume = Dashboard("Stored Energy (System)"); +dashboard_volume:set_icon("battery-charging"); -local tab_volume_ind = Tab("Agents"); -tab_volume_ind:set_icon("minus"); +local dashboard_volume_ind = Dashboard("Stored Energy (Agents)"); +dashboard_volume_ind:set_icon("battery-charging"); -local tab_spill = Tab("Spilled Energy (System)"); -tab_spill:set_icon("trash-2"); +local dashboard_spill = Dashboard("Spilled Energy (System)"); +dashboard_spill:set_icon("trash-2"); -local tab_spill_ind = Tab("Agents"); -tab_spill_ind:set_icon("minus"); +local dashboard_spill_ind = Dashboard("Spilled Energy (Agents)"); +dashboard_spill_ind:set_icon("trash-2"); + +local dashboard_bid = Dashboard("bid (Sys)"); +dashboard_bid:set_icon("trash-2"); + +local dashboard_bid_ind = Dashboard("bid (Agents)"); +dashboard_bid_ind:set_icon("trash-2"); -- load demand local demand = generic:load("iter_init/demand"):rename_agents({"Demand"}); @@ -219,12 +226,15 @@ local all_cmgdem = {}; local all_eneemb = {}; local all_enever2 = {}; +local all_bid_frac = {}; local chart_avg_volume = Chart("Average stored energy all"); local chart_avg_volume_ind = Chart("Average stored energy agents"); local chart_avg_spill = Chart("Average spilled energy all"); local chart_avg_spill_ind = Chart("Average spilled energy agents"); local chart_avg_spot = Chart("Average spot price - iterations"); +local chart_avg_bid = Chart("Average bid all"); +local chart_avg_bid_ind = Chart("Average bid ag"); local chart_avg_gerter = Chart("Average generation thermal - iterations"); local chart_avg_gerhid = Chart("Average generation hydro - iterations"); @@ -272,7 +282,7 @@ for i = 1, #iterations do local defcit = system:load(iteration .. "/defcit"):aggregate_scenarios(BY_AVERAGE()):rename_agents({"Deficit"}); local chart = get_percentiles_chart(cmgdem, iteration); - tab_marginal_costs:push(chart); + dashboard_marginal_costs:push(chart); chart_avg_spot:add_line( cmgdem:aggregate_scenarios(BY_AVERAGE()):add_prefix("i " .. tostring(i-2) .. " - "), {color=interp_colors[2][i]}); @@ -294,8 +304,10 @@ for i = 1, #iterations do local rskgnd = {}; local eneemb = {}; local enever2 = {}; + local bid_quant = {}; local bid_accepted = {}; local bid_price = {}; + local bid_frac = {}; local revcon = {}; local coscon = {}; local netcon = {}; @@ -327,7 +339,12 @@ for i = 1, #iterations do table.insert(eneemb, _eneemb:aggregate_blocks(BY_LAST_VALUE()):aggregate_agents(BY_SUM(), index)); local _enever2 = hydro:load(iteration .. "/" .. directory .. "/enever2"); table.insert(enever2, _enever2:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); + + local _bid_qt = generic:load(iteration .. "/bid_quantity_" .. index); local _bid_ac = generic:load(iteration .. "/bid_accepted_" .. index); + local _bid_fc = (_bid_ac ) / (_bid_qt + 0.00001); + table.insert(bid_frac, _bid_fc:aggregate_blocks(BY_AVERAGE()):aggregate_agents(BY_SUM(), index)); + table.insert(bid_quant, _bid_qt:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); table.insert(bid_accepted, _bid_ac:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); local _bid_pr = generic:load(iteration .. "/bid_price_" .. index); table.insert(bid_price, _bid_pr:aggregate_blocks(BY_AVERAGE()):aggregate_agents(BY_SUM(), index)); @@ -355,10 +372,10 @@ for i = 1, #iterations do -- revenue: P*Q - pi*Q + pi*g - c*g local contractsys_pq = system:load("contractsys_pq_" .. tostring(index)); - table.insert(revcon, contractsys_pq:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); local contractsys_q = system:load("contractsys_q_" .. tostring(index)); - table.insert(coscon, (contractsys_q*cmgdem):aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); local contract_net = (contractsys_pq - contractsys_q*cmgdem); + table.insert(revcon, contractsys_pq:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); + table.insert(coscon, (contractsys_q*cmgdem):aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); table.insert(netcon, contract_net:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index)); local contract_rsk = contract_net:aggregate_blocks(BY_SUM()):aggregate_agents(BY_SUM(), index); @@ -368,7 +385,7 @@ for i = 1, #iterations do end local _alpha = all_alpha[index] if _alpha == nil then - _alpha = 1 + _alpha = 1.0 end table.insert(rskcon, cvar_scenario(contract_rsk, _lambda, _alpha)); @@ -448,13 +465,15 @@ for i = 1, #iterations do -- local cat_bid_accepted = concatenate(bid_accepted):save_and_load("bid_accepted-" .. iteration); -- local cat_bid_price = concatenate(bid_price):save_and_load("bid_price-" .. iteration); + local cat_bid_frac = concatenate(bid_frac); + local chart = Chart("Generation: " .. iteration); chart:add_area_stacking(cat_gerter:aggregate_scenarios(BY_AVERAGE()), {color="red"}); chart:add_area_stacking(cat_gerhid:aggregate_scenarios(BY_AVERAGE()), {color="blue"}); chart:add_area_stacking(cat_gergnd:aggregate_scenarios(BY_AVERAGE()), {color="green"}); chart:add_line(demand:aggregate_scenarios(BY_AVERAGE()):aggregate_blocks(BY_SUM()), {color="purple"}); chart:add_area_stacking(defcit:aggregate_scenarios(BY_AVERAGE()):aggregate_blocks(BY_SUM()), {color="black"}); - tab_generation:push(chart); + dashboard_generation:push(chart); local chart = Chart("Revenue: " .. iteration); chart:add_area_stacking(cat_revter:aggregate_scenarios(BY_AVERAGE()), {color="red"}); @@ -463,7 +482,7 @@ for i = 1, #iterations do chart:add_area_stacking(cat_revcon:aggregate_scenarios(BY_AVERAGE()), {color="purple"}); chart:add_area_stacking((defcit * cmgdem):aggregate_scenarios(BY_AVERAGE()):aggregate_blocks(BY_SUM()), {color="black"}); chart:add_line((demand * cmgdem):aggregate_scenarios(BY_AVERAGE()):aggregate_blocks(BY_SUM()), {color="pink"}); - tab_revenue:push(chart); + dashboard_revenue:push(chart); local chart = Chart("Cost: " .. iteration); chart:add_area_stacking(cat_coster:aggregate_scenarios(BY_AVERAGE()), {color="red"}); @@ -472,7 +491,7 @@ for i = 1, #iterations do chart:add_area_stacking(cat_coscon:aggregate_scenarios(BY_AVERAGE()), {color="purple"}); -- TODO read deficit cost -- chart:add_area_stacking((defcit * defcos):aggregate_scenarios(BY_AVERAGE()), {color="black"}); - tab_costs:push(chart); + dashboard_costs:push(chart); local chart = Chart("Net Revenue (per tech): " .. iteration); chart:add_area_stacking(cat_netter:aggregate_scenarios(BY_AVERAGE()), {color="red"}); @@ -481,7 +500,7 @@ for i = 1, #iterations do chart:add_area_stacking(cat_netcon:aggregate_scenarios(BY_AVERAGE()), {color="purple"}); -- chart:add_area_stacking((defcit * cmgdem):aggregate_scenarios(BY_AVERAGE()), {color="black"}); -- chart:add_line((demand * cmgdem):aggregate_scenarios(BY_AVERAGE()), {color="purple"}); - tab_netrev:push(chart); + dashboard_netrev:push(chart); -- these already have 1 single scenario local chart = Chart("Risk Adjusted Net Revenue (per tech): " .. iteration); @@ -489,20 +508,20 @@ for i = 1, #iterations do chart:add_area_stacking(cat_rskhid, {color="blue"}); chart:add_area_stacking(cat_rskgnd, {color="green"}); chart:add_area_stacking(cat_rskcon, {color="purple"}); - tab_rskrev:push(chart); + dashboard_rskrev:push(chart); -- TODO add loop here local chart = Chart("Net Revenue: " .. iteration); chart:add_area_stacking(cat_nettot:aggregate_scenarios(BY_AVERAGE()), {color=medium_colors[1+1]}); - tab_netrev:push(chart); + dashboard_netrev:push(chart); -- local chart = Chart("Normalized Net Revenue: " .. iteration); -- chart:add_area_stacking(cat_nettot_captured:aggregate_scenarios(BY_AVERAGE()), {color=medium_colors[1+1]}); - -- tab_netrev:push(chart); + -- dashboard_netrev:push(chart); local chart = Chart("Risk Adjusted Net Revenue: " .. iteration); chart:add_area_stacking(cat_rsktot, {color=medium_colors[i+1]}); - tab_rskrev:push(chart); + dashboard_rskrev:push(chart); load_all_collection(i, all_gerter, cat_gerter:aggregate_scenarios(BY_AVERAGE())); load_all_collection(i, all_gerhid, cat_gerhid:aggregate_scenarios(BY_AVERAGE())); @@ -536,21 +555,28 @@ for i = 1, #iterations do load_all_collection(i, all_eneemb, cat_eneemb:aggregate_scenarios(BY_AVERAGE())); load_all_collection(i, all_enever2, cat_enever2:aggregate_scenarios(BY_AVERAGE())); + load_all_collection(i, all_bid_frac, cat_bid_frac:aggregate_scenarios(BY_AVERAGE())); table.insert(all_defcit, defcit:aggregate_blocks(BY_SUM()):aggregate_scenarios(BY_AVERAGE())); table.insert(all_cmgdem, cmgdem:aggregate_blocks(BY_AVERAGE()):aggregate_scenarios(BY_AVERAGE())); local chart = get_percentiles_chart(cat_eneemb:aggregate_agents(BY_SUM(), "All"), "Stored Energy: " .. iteration); - tab_volume:push(chart); + dashboard_volume:push(chart); local chart = get_percentiles_chart(cat_enever2:aggregate_agents(BY_SUM(), "All"), "Spilled Energy: " .. iteration); - tab_spill:push(chart); + dashboard_spill:push(chart); + + local chart = get_percentiles_chart(cat_bid_frac:aggregate_agents(BY_AVERAGE(), "All"), "Bid accepted (%): " .. iteration); + dashboard_bid:push(chart); chart_avg_spill:add_line(cat_enever2:aggregate_agents(BY_SUM(), "i " .. tostring(i-2) .. " - ") :aggregate_scenarios(BY_AVERAGE()), {color=interp_colors[1][i]}); chart_avg_volume:add_line(cat_eneemb:aggregate_agents(BY_SUM(), "i " .. tostring(i-2) .. " - ") :aggregate_scenarios(BY_AVERAGE()), {color=interp_colors[1][i]}); + chart_avg_bid:add_line(cat_bid_frac:aggregate_agents(BY_AVERAGE(), "i " .. tostring(i-2) .. " - ") + :aggregate_scenarios(BY_AVERAGE()), {color=interp_colors[1][i]}); + for a = 1,cat_enever2:agents_size() do chart_avg_spill_ind:add_line( cat_enever2:select_agent(a):aggregate_scenarios(BY_AVERAGE()) @@ -558,6 +584,9 @@ for i = 1, #iterations do chart_avg_volume_ind:add_line( cat_eneemb:select_agent(a):aggregate_scenarios(BY_AVERAGE()) :add_prefix("i " .. tostring(i-2) .. " - "), {color=interp_colors[a][i]}); + chart_avg_bid_ind:add_line( + cat_bid_frac:select_agent(a):aggregate_scenarios(BY_AVERAGE()) + :add_prefix("i " .. tostring(i-2) .. " - "), {color=interp_colors[a][i]}); chart_avg_gerter:add_line( cat_gerter:select_agent(a):aggregate_scenarios(BY_AVERAGE()) @@ -605,9 +634,11 @@ for i = 1, #iterations do local chart = get_percentiles_chart(cat_eneemb, "Stored Energy: " .. iteration); - tab_volume_ind:push(chart); + dashboard_volume_ind:push(chart); local chart = get_percentiles_chart(cat_enever2, "Spilled Energy: " .. iteration); - tab_spill_ind:push(chart); + dashboard_spill_ind:push(chart); + local chart = get_percentiles_chart(cat_bid_frac, "Bid frac: " .. iteration); + dashboard_bid_ind:push(chart); end local cmgdem = aggregate_and_concatenate_as_stages(all_cmgdem, BY_AVERAGE()):save_cache(); @@ -615,7 +646,7 @@ local defcit = aggregate_and_concatenate_as_stages(all_defcit, BY_SUM()):save_ca local chart = Chart("Aggregated Load Marginal Cost"); chart:add_column_stacking(cmgdem); -tab_marginal_costs:push(chart); +dashboard_marginal_costs:push(chart); local chart = Chart("Aggregated Generation"); for _, v in pairs(all_gerter) do @@ -628,7 +659,7 @@ for _, v in pairs(all_gergnd) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color="green"}); end chart:add_column_stacking(defcit, {color="black"}); -tab_generation:push(chart); +dashboard_generation:push(chart); local chart = Chart("Aggregated Cost"); for _, v in pairs(all_coster) do @@ -644,7 +675,7 @@ for _, v in pairs(all_coscon) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color="purple"}); end -- chart:add_column_stacking(defcit * cmgdem), {color="black"}); -tab_costs:push(chart); +dashboard_costs:push(chart); local chart = Chart("Aggregated Revenue"); for _, v in pairs(all_revter) do @@ -660,7 +691,7 @@ for _, v in pairs(all_revcon) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color="purple"}); end -- chart:add_column_stacking(defcit * cmgdem, {color="black"}); -tab_revenue:push(chart); +dashboard_revenue:push(chart); local chart = Chart("Aggregated Net Revenue (per tech)"); for _, v in pairs(all_netter) do @@ -676,19 +707,19 @@ for _, v in pairs(all_netcon) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color="purple"}); end -- chart:add_column_stacking((defcit * cmgdem), {color="black"}); -tab_netrev:push(chart); +dashboard_netrev:push(chart); local chart = Chart("Aggregated Net Revenue"); for i, v in pairs(all_nettot) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color=medium_colors[i]}); end -tab_netrev:push(chart); +dashboard_netrev:push(chart); local chart = Chart("Normalized Aggregated Net Revenue"); for i, v in pairs(all_nettot_captured) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color=medium_colors[i]}); end -tab_netrev_captured:push(chart); +dashboard_netrev_captured:push(chart); local chart = Chart("Aggregated Risk Adjusted Net Revenue (per tech)"); for _, v in pairs(all_rskter) do @@ -704,55 +735,67 @@ for _, v in pairs(all_rskcon) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color="purple"}); end -- chart:add_column_stacking((defcit * cmgdem), {color="black"}); -tab_rskrev:push(chart); +dashboard_rskrev:push(chart); local chart = Chart("Aggregated Risk Adjusted Net Revenue"); for i, v in pairs(all_rsktot) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color=medium_colors[i]}); end -tab_rskrev:push(chart); +dashboard_rskrev:push(chart); local chart = Chart("Average stored energy"); for _, v in pairs(all_eneemb) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_AVERAGE()), {color="blue"}); end -tab_volume_ind:push(chart); +dashboard_volume_ind:push(chart); local chart = Chart("Total spilled energy"); for _, v in pairs(all_enever2) do chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_SUM()), {color="blue"}); end -tab_spill_ind:push(chart); +dashboard_spill_ind:push(chart); + +local chart = Chart("Bid"); +for _, v in pairs(all_bid_frac) do + chart:add_column_stacking(aggregate_and_concatenate_as_stages(v, BY_AVERAGE()), {color="blue"}); +end +dashboard_bid_ind:push(chart); + -- local chart = Chart("Revenue"); -- chart:add_line(concatenate_stages(aggregated_generation):set_stage_type(0) * concatenate_stages(aggregated_load_marginal_cost):set_stage_type(0)); --- tab_revenue:push(chart); - -tab_spill_ind:push(chart_avg_spill_ind); -tab_volume_ind:push(chart_avg_volume_ind); -tab_spill:push(chart_avg_spill); -tab_volume:push(chart_avg_volume); -tab_marginal_costs:push(chart_avg_spot); - -tab_generation:push(chart_avg_gerter); -tab_generation:push(chart_avg_gerhid); -tab_generation:push(chart_avg_gergnd); - -tab_costs:push(chart_avg_cos); -tab_revenue:push(chart_avg_rev); -tab_netrev:push(chart_avg_net); -tab_rskrev:push(chart_avg_rsk); - -local dashboard = Dashboard(); -dashboard:push(tab_generation); -dashboard:push(tab_marginal_costs); -dashboard:push(tab_netrev_captured); -dashboard:push(tab_costs); -dashboard:push(tab_revenue); -dashboard:push(tab_netrev); -dashboard:push(tab_rskrev); -dashboard:push(tab_volume); -tab_volume:push(tab_volume_ind); -dashboard:push(tab_spill); -tab_spill:push(tab_spill_ind); -dashboard:save("dashboard_market"); \ No newline at end of file +-- dashboard_revenue:push(chart); + +dashboard_bid_ind:push(chart_avg_bid_ind); +dashboard_bid:push(chart_avg_bid); + +dashboard_spill_ind:push(chart_avg_spill_ind); +dashboard_volume_ind:push(chart_avg_volume_ind); +dashboard_spill:push(chart_avg_spill); +dashboard_volume:push(chart_avg_volume); +dashboard_marginal_costs:push(chart_avg_spot); + +dashboard_generation:push(chart_avg_gerter); +dashboard_generation:push(chart_avg_gerhid); +dashboard_generation:push(chart_avg_gergnd); + +dashboard_costs:push(chart_avg_cos); +dashboard_revenue:push(chart_avg_rev); +dashboard_netrev:push(chart_avg_net); +dashboard_rskrev:push(chart_avg_rsk); + +( + dashboard_generation + + dashboard_marginal_costs + + dashboard_netrev_captured + + dashboard_costs + + dashboard_revenue + + dashboard_netrev + + dashboard_rskrev + + dashboard_volume + + dashboard_volume_ind + + dashboard_spill + + dashboard_spill_ind + + dashboard_bid + + dashboard_bid_ind +):save("dashboard_market"); \ No newline at end of file