Skip to content

Commit 761a5f8

Browse files
Merge pull request #2 from rte-antares-rpackage/main
Main
2 parents cdeec19 + eccb074 commit 761a5f8

8 files changed

+157
-28
lines changed

NAMESPACE

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Generated by roxygen2: do not edit by hand
22

33
export(Grid_Matrix)
4+
export(changeHydroManagement)
45
export(constraint_generator)
56
export(getPumpEfficiency)
67
export(getSimulationNames)
@@ -25,6 +26,7 @@ export(runWaterValuesSimulation)
2526
export(runWaterValuesSimulationMultiStock)
2627
export(shiny_water_values)
2728
export(to_Antares_Format)
29+
export(to_Antares_Format_bis)
2830
export(waterValuesViz)
2931
import(data.table)
3032
import(shiny)

R/constraints_functions.R

+4-3
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,8 @@ generate_rhs_bc <- function(constraint_value,coeff,opts){
150150

151151
sb_file <- antaresRead::readIniFile(file.path(opts$studyPath, "settings", "scenariobuilder.dat"))
152152

153-
assertthat::assert_that(names(sb_file)==c("Default Ruleset"),
154-
msg="There should be only Default Ruleset in scenario builder.")
153+
assertthat::assert_that(length(names(sb_file))==1,
154+
msg="There should be only ruleset in scenario builder.")
155155

156156
sbuilder <- antaresEditObject::scenarioBuilder(
157157
areas = area_thermal_cluster,
@@ -176,7 +176,8 @@ generate_rhs_bc <- function(constraint_value,coeff,opts){
176176

177177
new_sb <- unlist(list(values_sb))
178178
names(new_sb) <- names_sb
179-
sb_file$`Default Ruleset` <- append(sb_file$`Default Ruleset`,new_sb)
179+
name_ruleset <- names(sb_file)[[1]]
180+
sb_file[[name_ruleset]] <- append(sb_file[[name_ruleset]],new_sb)
180181

181182
antaresEditObject::writeIni(listData = sb_file,
182183
pathIni = file.path(opts$studyPath, "settings", "scenariobuilder.dat"),

R/functions.R

+111-11
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,18 @@ get_weekly_cost <- function(district, opts=antaresRead::simOptions(),mcyears,exp
237237
ov_cost=sum(.data$`OV. COST`)) %>%
238238
dplyr::rename("timeId"="week")
239239
} else {
240-
assertthat::assert_that(!is.null(fictive_areas))
241-
cost <- antaresRead::readAntares(areas = fictive_areas, mcYears = mcyears,
242-
timeStep = "hourly", opts = opts, select=c("OV. COST"))
243-
cost$week <- (cost$timeId-1)%/%168+1
244-
cost <- dplyr::summarise(dplyr::group_by(cost,.data$week,.data$mcYear),
245-
ov_cost=sum(.data$`OV. COST`)) %>%
246-
dplyr::rename("timeId"="week") %>%
247-
dplyr::mutate(cost_xpansion=0)
240+
if (is.null(fictive_areas)){
241+
cost <- data.frame(tidyr::expand_grid(mcYear=mcyears,timeId=1:52))%>%
242+
dplyr::mutate(ov_cost=0,cost_xpansion=0)
243+
} else {
244+
cost <- antaresRead::readAntares(areas = fictive_areas, mcYears = mcyears,
245+
timeStep = "hourly", opts = opts, select=c("OV. COST"))
246+
cost$week <- (cost$timeId-1)%/%168+1
247+
cost <- dplyr::summarise(dplyr::group_by(cost,.data$week,.data$mcYear),
248+
ov_cost=sum(.data$`OV. COST`)) %>%
249+
dplyr::rename("timeId"="week") %>%
250+
dplyr::mutate(cost_xpansion=0)
251+
}
248252

249253
for (week in 1:52){
250254
for (scenario in mcyears){
@@ -389,6 +393,101 @@ to_Antares_Format <- function(data,constant=T){
389393
return(reshaped_matrix)
390394
}
391395

396+
#' Convert water values to Antares format
397+
#'
398+
#' This function converts water values generated by \code{Grid_Matrix}
399+
#' to the format expected by Antares: a 365*101 matrix, where
400+
#' the rows are the 365 days of the year and the columns are round percentage values
401+
#' ranging from 0 to 100 assessing the reservoir level.
402+
#' Since \code{Grid_Matrix} output weekly values for an
403+
#' arbitrary number of reservoir levels, interpolation is performed on both scales
404+
#' in order to fit the desired format.
405+
#'
406+
#' @param data A data.table generated by \code{Grid_Matrix}
407+
#'
408+
#' @return A 365*101 numeric matrix
409+
#' @export
410+
to_Antares_Format_bis <- function(data){
411+
412+
vb <- convert_to_percent(data)
413+
414+
for (i in 1:nrow(vb)){
415+
vb[i,4] <- ifelse(vb[i,2]!=0,2*vb[i,3]-vb[i-1,4],0)
416+
}
417+
418+
res <- vb %>%
419+
dplyr::ungroup() %>%
420+
as.data.table()
421+
422+
423+
# reshape
424+
value_nodes_matrix <- dcast(
425+
data = res,
426+
formula = weeks ~ states_round_percent,
427+
value.var = "vu"
428+
)
429+
430+
value_nodes_matrix$weeks <- NULL
431+
432+
value_nodes_matrix_0 <- value_nodes_matrix[52,]
433+
434+
reshaped_matrix <- value_nodes_matrix[rep(seq_len(nrow(value_nodes_matrix)), each = 7), ]
435+
436+
reshaped_matrix <- rbind(value_nodes_matrix_0,reshaped_matrix)
437+
438+
return(reshaped_matrix)
439+
}
440+
441+
convert_to_percent <- function(data){
442+
capa <- max(data$states)
443+
res <- tidyr::expand_grid(
444+
states_round_percent = 0:100, weeks = unique(data$weeks)
445+
)
446+
447+
res <- res %>%
448+
dplyr::mutate(state_ref = .data$states_round_percent * capa/100) %>%
449+
dplyr::left_join(data,by=c("weeks")) %>%
450+
dplyr::select(c("weeks","states","value_node","state_ref",
451+
"states_round_percent","level_low","level_high",
452+
"penalty_low","penalty_high"))
453+
454+
top <- res %>%
455+
dplyr::filter(.data$states >= .data$state_ref) %>%
456+
dplyr::group_by(.data$weeks,.data$state_ref) %>%
457+
dplyr::filter(.data$states==min(.data$states)) %>%
458+
dplyr::select(c("weeks","state_ref","states","value_node",
459+
"states_round_percent","level_low","level_high",
460+
"penalty_low","penalty_high"))
461+
462+
bottom <- res %>%
463+
dplyr::filter(.data$states <= .data$state_ref) %>%
464+
dplyr::group_by(.data$weeks,.data$state_ref) %>%
465+
dplyr::filter(.data$states==max(.data$states)) %>%
466+
dplyr::select(c("weeks","state_ref","states","value_node","states_round_percent"))
467+
468+
vb <- dplyr::left_join(bottom,top,by=c("weeks","state_ref","states_round_percent"),
469+
suffix=c("_min","_max")) %>%
470+
dplyr::mutate(vb = (.data$value_node_max-.data$value_node_min)/(
471+
.data$states_max-.data$states_min)*(.data$state_ref-.data$states_min)+.data$value_node_min,
472+
vb = dplyr::if_else(.data$states_min==.data$states_max,.data$value_node_min,.data$vb)) %>%
473+
dplyr::arrange(.data$weeks, .data$state_ref) %>%
474+
dplyr::group_by(.data$weeks) %>%
475+
dplyr::mutate(value_node_dif=.data$vb-dplyr::lag(.data$vb),# Delta of Bellman values
476+
states_dif=.data$state_ref-dplyr::lag(.data$state_ref), # Delta of states
477+
mu=.data$value_node_dif /.data$states_dif, # Ratio
478+
mu=round(.data$mu,2),
479+
vu=0) %>%
480+
dplyr::mutate(level_low=.data$level_low/capa*100,
481+
level_high=.data$level_high/capa*100) %>%
482+
dplyr::mutate(mu=dplyr::case_when(.data$states_round_percent>.data$level_high ~ .data$mu - .data$penalty_high,
483+
.data$states_round_percent<=.data$level_low ~ .data$mu + .data$penalty_low,
484+
TRUE ~ .data$mu)) %>%
485+
dplyr::select(c("weeks","state_ref","mu","vu","states_round_percent"))
486+
487+
return(vb)
488+
}
489+
490+
392491
#' Add fictive production and fictive load to avoid infeasabilities with binding constraints
393492
#'
394493
#' @param area A valid Antares area.
@@ -579,10 +678,11 @@ restoreScenarioBuilder <- function(opts, fictive_area){
579678

580679
sb_file <- antaresRead::readIniFile(file.path(opts$studyPath, "settings", "scenariobuilder.dat"))
581680

582-
assertthat::assert_that(names(sb_file)==c("Default Ruleset"),
583-
msg="There should be only Default Ruleset in scenario builder.")
681+
assertthat::assert_that(length(names(sb_file))==1,
682+
msg="There should be only one ruleset in scenario builder.")
584683

585-
sb_file$`Default Ruleset` <- sb_file$`Default Ruleset`[!grepl(fictive_area,names(sb_file$`Default Ruleset`))]
684+
name_ruleset <- names(sb_file)[[1]]
685+
sb_file[[name_ruleset]] <- sb_file[[name_ruleset]][!grepl(fictive_area,names(sb_file$`Default Ruleset`))]
586686

587687
antaresEditObject::writeIni(listData = sb_file,
588688
pathIni = file.path(opts$studyPath, "settings", "scenariobuilder.dat"),

R/get_Reward.R

+6-2
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ get_Reward <- function(simulation_values = NULL,simulation_names=NULL, pattern =
126126
reward <- dplyr::filter(reward,.data$control==0) %>%
127127
dplyr::select("mcYear","timeId","reward") %>%
128128
dplyr::right_join(reward,by=c("mcYear","timeId"),suffix=c("_0","")) %>%
129-
dplyr::mutate(reward=.data$reward_0-.data$reward) %>%
129+
# dplyr::mutate(reward=.data$reward_0-.data$reward) %>%
130+
dplyr::mutate(reward=-.data$reward) %>%
130131
dplyr::select(-c("reward_0","simulation","sim"))
131132
reward <- as.data.table(reward)
132133

@@ -174,6 +175,7 @@ get_Reward <- function(simulation_values = NULL,simulation_names=NULL, pattern =
174175
district_balance)
175176
}
176177
res <- reward_offset(o,res, u,mcyears,district_name,fictive_areas=fictive_areas, expansion=expansion)
178+
res <- dplyr::mutate(res,simulation=o$name)
177179
res
178180
},
179181
o = opts_o,
@@ -183,14 +185,15 @@ get_Reward <- function(simulation_values = NULL,simulation_names=NULL, pattern =
183185

184186

185187
reward <- rbindlist(reward) #merge the all simulations tables together
188+
local_reward <- reward
186189

187190
# Getting the minimum reward for each year, each week and each control (u)
188191
reward <- reward %>%
189192
dplyr::group_by(.data$mcYear,.data$week,.data$u) %>% dplyr::summarise(reward=min(.data$reward),.groups="drop")
190193
#Subtracting the reward corresponding to control 0 for each year and each week
191194
reward <- dplyr::filter(reward,.data$u==0) %>% dplyr::select("mcYear","week","reward") %>%
192195
dplyr::right_join(reward,by=c("mcYear","week"),suffix=c("_0","")) %>%
193-
dplyr::mutate(reward=.data$reward-.data$reward_0) %>%
196+
# dplyr::mutate(reward=.data$reward-.data$reward_0) %>%
194197
dplyr::rename("timeId"="week","control"="u") %>%
195198
dplyr::select(-c("reward_0"))
196199
reward <- as.data.table(reward)
@@ -199,6 +202,7 @@ get_Reward <- function(simulation_values = NULL,simulation_names=NULL, pattern =
199202
# Prepare output
200203
output <- list()
201204
output$reward <- reward
205+
output$local_reward <- local_reward
202206
output$simulation_names <- simulation_names
203207
output$simulation_values <- possible_controls
204208
}

R/hydro_storage_functions.R

+1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ getPumpEfficiency <- function(area, force = FALSE, opts = antaresRead::simOption
156156
#' @param opts List of simulation parameters returned by the function
157157
#' \code{antaresRead::setSimulationPath}
158158
#' @param area Antares area
159+
#' @export
159160
changeHydroManagement <- function(watervalues=F,heuristic=T,opts,area){
160161
hydro_ini <- antaresRead::readIniFile(file.path(opts$inputPath, "hydro", "hydro.ini"))
161162
assertthat::assert_that(area %in% names(hydro_ini$reservoir),msg = "No reservoir managment for this area, check Antares study")

R/runWaterValuesSimulation.R

+9-11
Original file line numberDiff line numberDiff line change
@@ -458,18 +458,16 @@ runWaterValuesSimulationMultiStock <- function(list_areas,
458458
generate_constraints(coeff=coeff,name_constraint=paste0(binding_constraint,"_",area),
459459
efficiency=list_efficiency[area],opts=opts,area = area)
460460

461-
}
461+
opts <- antaresEditObject::createDistrict(
462+
name = paste0("district_balance_",area),
463+
apply_filter = "add-all",
464+
remove_area = fictive_areas,
465+
output = TRUE,
466+
overwrite = TRUE,
467+
opts = opts
468+
)
462469

463-
opts <- antaresEditObject::createDistrict(
464-
name = "water values district",
465-
caption = "water values district",
466-
comments = "Used for calculate water values",
467-
apply_filter = "add-all",
468-
remove_area = remove_area,
469-
output = TRUE,
470-
overwrite = TRUE,
471-
opts = opts
472-
)
470+
}
473471

474472
# Start the simulations
475473

R/shiny_post_process.R

+1-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ postProcessServer <- function(id, opts, watervalues, area) {
167167

168168
shiny::observeEvent(input$to_antares, {
169169
results <- final_result()
170-
reshaped_values <- to_Antares_Format(results)
170+
reshaped_values <- to_Antares_Format_bis(results)
171171
antaresEditObject::writeWaterValues(area = area(),
172172
data = reshaped_values)
173173
shinyWidgets::show_alert(title = "Implement water values in Antares",

man/to_Antares_Format_bis.Rd

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)