Mercurial > repos > siwaa > redelac_stics_t
comparison redelacSticsTool.R @ 0:7f8f474a7bd7 draft
"planemo upload for repository https://forgemia.inra.fr/redelac commit 29a2aee3b41d8da4d056600ea5cf4af978c714b9"
| author | siwaa |
|---|---|
| date | Tue, 06 Feb 2024 09:21:00 +0000 |
| parents | |
| children | ed9c49c6c6e1 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:7f8f474a7bd7 |
|---|---|
| 1 library(SticsRFiles) | |
| 2 library(SticsOnR) | |
| 3 library(dplyr) | |
| 4 library(lubridate) | |
| 5 library(parallel) | |
| 6 library(doParallel) | |
| 7 library(doFuture) | |
| 8 library(stringr) | |
| 9 library(readxl) | |
| 10 library(data.table) | |
| 11 library(readr) | |
| 12 library(tidyr) | |
| 13 | |
| 14 sessionInfo() | |
| 15 | |
| 16 args = commandArgs(trailingOnly = TRUE) | |
| 17 | |
| 18 startTime <- Sys.time() | |
| 19 | |
| 20 workspace <- paste0(getwd(), "/WS") | |
| 21 javastics_path <- getwd() | |
| 22 default_config_path <- paste0(javastics_path, "/config") | |
| 23 | |
| 24 txt_path <- paste0(getwd(), "/WS/txt_files") | |
| 25 dir.create(txt_path, recursive = T) | |
| 26 | |
| 27 USMsFile <- "USMs.csv" | |
| 28 TecFile <- "Tec.csv" | |
| 29 IniFile <- "Ini.csv" | |
| 30 StationFile <- "Station.csv" | |
| 31 | |
| 32 redelac <- (args[1] == "optim") | |
| 33 parallel <- (args[2] == "parallel") | |
| 34 print(paste("parallel:", parallel, args[2])) | |
| 35 nbSlots <- as.integer(args[3]) | |
| 36 print(paste("nbslots:", nbSlots)) | |
| 37 scenario <- args[4] | |
| 38 | |
| 39 # USMs file loading | |
| 40 | |
| 41 usms_param <- read_params_table(file.path(workspace, USMsFile)) %>% | |
| 42 select( | |
| 43 usm_name, | |
| 44 datedebut, | |
| 45 datefin, | |
| 46 finit, | |
| 47 nomsol, | |
| 48 fstation, | |
| 49 fclim1, | |
| 50 fclim2, | |
| 51 culturean, | |
| 52 nbplantes, | |
| 53 codesimul, | |
| 54 fplt_1, | |
| 55 ftec_1, | |
| 56 flai_1, | |
| 57 fplt_2, | |
| 58 ftec_2, | |
| 59 flai_2 | |
| 60 ) | |
| 61 | |
| 62 # Tec files loading and generating xml | |
| 63 | |
| 64 tec_param <- read_params_table(file.path(workspace, TecFile)) | |
| 65 columnToRemove <- | |
| 66 names(tec_param[grep("juleclair|nbinfloecl", names(tec_param))]) | |
| 67 columnToKeep <- | |
| 68 names(tec_param)[names(tec_param) %in% columnToRemove == FALSE] | |
| 69 | |
| 70 tec_param <- subset(tec_param, select = columnToKeep) | |
| 71 | |
| 72 gen_tec_xml(param_df = tec_param, out_dir = workspace) | |
| 73 | |
| 74 # Ini files loading and generating xml | |
| 75 | |
| 76 ini_param <- read_params_table(file.path(workspace, IniFile)) | |
| 77 | |
| 78 gen_ini_xml(param_df = ini_param, out_dir = workspace) | |
| 79 | |
| 80 # Station files loading and generating xml | |
| 81 | |
| 82 sta_param <- read_params_table(file.path(workspace, StationFile)) | |
| 83 | |
| 84 gen_sta_xml(param_df = sta_param, out_dir = workspace) | |
| 85 | |
| 86 if (parallel) { | |
| 87 doFuture::registerDoFuture() | |
| 88 future::plan(multisession, workers = nbSlots) | |
| 89 `%dordopar%` <- `%dofuture%` | |
| 90 } else { | |
| 91 `%dordopar%` <- `%do%` | |
| 92 } | |
| 93 | |
| 94 beforeGenXmlTime <- Sys.time() | |
| 95 | |
| 96 #gen_usms_xml(file = file.path(workspace, "usms.xml"), | |
| 97 # param_df = usms_param) | |
| 98 | |
| 99 chunckSize <- 1000 | |
| 100 nbUSMs <- nrow(usms_param) | |
| 101 | |
| 102 ids <- seq(1, nbUSMs, chunckSize) | |
| 103 | |
| 104 foreach (i = ids, | |
| 105 .options.future = list(packages = c("foreach", "SticsRFiles"))) %dordopar% { | |
| 106 gen_usms_xml(file = file.path(workspace, paste0("usms__", i, ".xml")), | |
| 107 param_df = usms_param[i:min(i + chunckSize - 1, nbUSMs),]) | |
| 108 } | |
| 109 | |
| 110 afterGenXmlTime <- Sys.time() | |
| 111 durGenX <- | |
| 112 lubridate::as.duration(lubridate::interval(beforeGenXmlTime, | |
| 113 afterGenXmlTime)) | |
| 114 | |
| 115 beforeGenTxtTime <- Sys.time() | |
| 116 | |
| 117 foreach (i = ids, | |
| 118 .options.future = list(packages = c("foreach", "SticsRFiles"))) %dordopar% { | |
| 119 gen_usms_xml2txt( | |
| 120 javastics = javastics_path, | |
| 121 workspace = workspace, | |
| 122 out_dir = txt_path, | |
| 123 usms_file = paste0("usms__", i, ".xml"), | |
| 124 redelac = redelac, | |
| 125 parallel = parallel, | |
| 126 verbose = FALSE | |
| 127 ) | |
| 128 } | |
| 129 | |
| 130 afterGenTxtTime <- Sys.time() | |
| 131 durGenT <- | |
| 132 lubridate::as.duration(lubridate::interval(beforeGenTxtTime, afterGenTxtTime)) | |
| 133 | |
| 134 afterGenTxtTime <- Sys.time() | |
| 135 durGenT <- | |
| 136 lubridate::as.duration(lubridate::interval(beforeGenTxtTime, afterGenTxtTime)) | |
| 137 | |
| 138 endTime <- Sys.time() | |
| 139 | |
| 140 dur <- | |
| 141 lubridate::as.period(lubridate::as.duration(lubridate::interval(startTime, endTime))) | |
| 142 durGenXP <- lubridate::as.period(durGenX) | |
| 143 durGenTP <- lubridate::as.period(durGenT) | |
| 144 | |
| 145 print("REDELACSticsInputGenerator Report") | |
| 146 print("=================================") | |
| 147 print(paste("number of usms: ", nrow(usms_param))) | |
| 148 print(paste("redelac optimization:", redelac)) | |
| 149 print(paste("process in parallel:", parallel)) | |
| 150 print(paste("nbslots:", nbSlots)) | |
| 151 | |
| 152 sprintf( | |
| 153 'overall duration: %g jour(s) %g heure(s) %g minute(s) %g seconde(s)', | |
| 154 lubridate::day(dur), | |
| 155 lubridate::hour(dur), | |
| 156 lubridate::minute(dur), | |
| 157 lubridate::second(dur) | |
| 158 ) | |
| 159 | |
| 160 sprintf( | |
| 161 'inside gen_usms_xml duration: %g jour(s) %g heure(s) %g minute(s) %g seconde(s)', | |
| 162 lubridate::day(durGenXP), | |
| 163 lubridate::hour(durGenXP), | |
| 164 lubridate::minute(durGenXP), | |
| 165 lubridate::second(durGenXP) | |
| 166 ) | |
| 167 | |
| 168 sprintf( | |
| 169 'inside gen_usms_xml2txt duration: %g jour(s) %g heure(s) %g minute(s) %g seconde(s)', | |
| 170 lubridate::day(durGenTP), | |
| 171 lubridate::hour(durGenTP), | |
| 172 lubridate::minute(durGenTP), | |
| 173 lubridate::second(durGenTP) | |
| 174 ) | |
| 175 print( | |
| 176 "===================================================================================" | |
| 177 ) | |
| 178 | |
| 179 | |
| 180 # | |
| 181 # Simulation part | |
| 182 # | |
| 183 | |
| 184 # List of successive USMs | |
| 185 successive_usms_file <- ("successionPlan.csv") | |
| 186 successive_usms_tab <- | |
| 187 read.csv(file = file.path(workspace, successive_usms_file), | |
| 188 sep = ";") | |
| 189 | |
| 190 # from succesions to simulate retrieving upcSol Cases | |
| 191 | |
| 192 successRef <- successive_usms_tab["Treatment"] | |
| 193 | |
| 194 successRef <- successRef %>% | |
| 195 separate( | |
| 196 col = Treatment, | |
| 197 into = c("upc", "sol", "systeme", "rotation", "tete_rotation", "horizon"), | |
| 198 sep = "-", | |
| 199 remove = FALSE | |
| 200 ) | |
| 201 | |
| 202 successRef$upcSol <- paste0(successRef$upc, "-", successRef$sol) | |
| 203 | |
| 204 casesUpcSol <- unique(successRef$upcSol) | |
| 205 | |
| 206 systeme <- successRef$systeme[1] | |
| 207 rotation <- successRef$rotation[1] | |
| 208 | |
| 209 successive_usms_tab_split <- list() | |
| 210 | |
| 211 for (j in 1:length(casesUpcSol)) { | |
| 212 splited <- strsplit(casesUpcSol[j], split = "-")[[1]] | |
| 213 | |
| 214 upc <- splited[1] | |
| 215 | |
| 216 sol <- splited[2] | |
| 217 | |
| 218 successive_usms_tab_split[[j]] <- | |
| 219 successive_usms_tab[successRef$upcSol == casesUpcSol[j],] | |
| 220 } | |
| 221 | |
| 222 result <- foreach(j = 1:length(casesUpcSol)) %:% | |
| 223 foreach( | |
| 224 i = 1:nrow(successive_usms_tab_split[[j]]), | |
| 225 .options.future = list(packages =c("foreach", "SticsRFiles", "SticsOnR")) | |
| 226 | |
| 227 ) %dordopar% { | |
| 228 | |
| 229 nusms <- as.numeric(successive_usms_tab_split[[j]][i, 2]) | |
| 230 | |
| 231 vec <- | |
| 232 as.character(successive_usms_tab_split[[j]][i, c(3:(2 + nusms))]) | |
| 233 | |
| 234 list_successive_usms <- list(vec) | |
| 235 | |
| 236 sim_options <- stics_wrapper_options( | |
| 237 javastics = javastics_path, | |
| 238 stics_exe = paste0(javastics_path, "/bin/stics_modulo"), | |
| 239 workspace = txt_path, | |
| 240 verbose = TRUE, | |
| 241 successive = list_successive_usms | |
| 242 ) | |
| 243 | |
| 244 list_usms <- vec | |
| 245 | |
| 246 cat(paste0("--> succession : ", successive_usms_tab_split[[j]][i, 1], " launched\n")) | |
| 247 | |
| 248 return(stics_wrapper(model_options = sim_options, situation = list_usms)) | |
| 249 | |
| 250 } | |
| 251 | |
| 252 for (j in 1:length(casesUpcSol)) { | |
| 253 splited <- strsplit(casesUpcSol[j], split = "-")[[1]] | |
| 254 | |
| 255 upc <- splited[1] | |
| 256 | |
| 257 sol <- splited[2] | |
| 258 | |
| 259 for (i in 1:nrow(successive_usms_tab_split[[j]])) { | |
| 260 #i=1 | |
| 261 if (i == 1) { | |
| 262 simPCP <- result[[j]][[i]] | |
| 263 } else { | |
| 264 simPCP$sim_list <- c(simPCP$sim_list, result[[j]][[i]]$sim_list) | |
| 265 } | |
| 266 | |
| 267 } | |
| 268 | |
| 269 #agregation des sorties dans un dataframe | |
| 270 sim_df <- | |
| 271 rbindlist(simPCP$sim_list, use.names = TRUE, idcol = "usm") | |
| 272 | |
| 273 #ajout des colonnes explicatives + de l'horizon temporel | |
| 274 sim_df <- sim_df %>% | |
| 275 separate( | |
| 276 col = usm, | |
| 277 into = c( | |
| 278 "upc", | |
| 279 "sol", | |
| 280 "systeme", | |
| 281 "rotation", | |
| 282 "tete_rotation", | |
| 283 "horizon", | |
| 284 "annee", | |
| 285 "culture" | |
| 286 ), | |
| 287 sep = "-", | |
| 288 remove = FALSE | |
| 289 ) | |
| 290 | |
| 291 #sauvegarde sous la forme d'un fichier rds | |
| 292 | |
| 293 if (dir.exists(paste0( | |
| 294 workspace, | |
| 295 "/analyse_simulations_STICS/", | |
| 296 systeme, | |
| 297 "/", | |
| 298 rotation | |
| 299 )) == FALSE) { | |
| 300 dir.create( | |
| 301 paste0( | |
| 302 workspace, | |
| 303 "/analyse_simulations_STICS/", | |
| 304 systeme, | |
| 305 "/", | |
| 306 rotation | |
| 307 ), | |
| 308 recursive = TRUE | |
| 309 ) | |
| 310 } | |
| 311 | |
| 312 saveRDS( | |
| 313 sim_df, | |
| 314 paste0( | |
| 315 workspace, | |
| 316 "/analyse_simulations_STICS/", | |
| 317 systeme, | |
| 318 "/", | |
| 319 rotation, | |
| 320 "/outputs-", | |
| 321 rotation, | |
| 322 "-", | |
| 323 upc, | |
| 324 "-", | |
| 325 sol, | |
| 326 "-", | |
| 327 scenario, | |
| 328 ".rds" | |
| 329 ) | |
| 330 ) | |
| 331 | |
| 332 successive_usms_tab_split[[j]]$Treatment <- NULL | |
| 333 successive_usms_tab_split[[j]]$Number_USM <- NULL | |
| 334 | |
| 335 list_usms <- | |
| 336 unlist(unname(as.list( | |
| 337 transpose(successive_usms_tab_split[[j]]) | |
| 338 ))) | |
| 339 list_usms <- list_usms[!is.na(list_usms)] | |
| 340 list_usms <- list_usms[list_usms != ''] | |
| 341 | |
| 342 list_usms_yr1 <- successive_usms_tab_split[[j]]$USM_1 | |
| 343 | |
| 344 for (i in 1:length(list_usms)) { | |
| 345 if (i == 1) { | |
| 346 #ajout d'une condition sur l'existence du fichier "mod_rapport.sti" pour la concatenation | |
| 347 #en attendant que toutes les simulations tournent correctement | |
| 348 #if(exists(file.path(txt_path, list_usms[i], "mod_rapport.sti"))==TRUE){ | |
| 349 rap_1 <- | |
| 350 read_delim(file.path(txt_path, list_usms[i], "mod_rapport.sti"), | |
| 351 col_names = TRUE) | |
| 352 names_col <- colnames(rap_1) | |
| 353 | |
| 354 rap_string <- | |
| 355 read_lines(file = file.path(txt_path, list_usms[i], "mod_rapport.sti"), | |
| 356 skip = 1) | |
| 357 | |
| 358 rap <- as_tibble(rap_string) %>% | |
| 359 separate(col = value, | |
| 360 sep = ";", | |
| 361 into = names_col) %>% | |
| 362 mutate(USM = list_usms[i]) | |
| 363 # } | |
| 364 | |
| 365 } else { | |
| 366 #if (list_usms[i] %in% list_usms_yr1) { | |
| 367 #ajout d'une condition sur l'existence du fichier "mod_rapport.sti" pour la concatenation | |
| 368 #en attendant que toutes les simulations tournent correctement | |
| 369 #if(exists(file.path(txt_path, list_usms[i], "mod_rapport.sti"))==TRUE){ | |
| 370 rap_string <- | |
| 371 read_lines(file = file.path(txt_path, list_usms[i], "mod_rapport.sti"), | |
| 372 skip = 1,)#} | |
| 373 | |
| 374 # } else { | |
| 375 #ajout d'une condition sur l'existence du fichier "mod_rapport.sti" pour la concatenation | |
| 376 #en attendant que toutes les simulations tournent correctement | |
| 377 #if(exists(file.path(txt_path, list_usms[i], "mod_rapport.sti"))==TRUE){ | |
| 378 # rap_string <- | |
| 379 # read_file(file = file.path(txt_path, list_usms[i], "mod_rapport.sti"))#} | |
| 380 # } | |
| 381 rap_i <- as_tibble(rap_string) %>% | |
| 382 separate(col = value, | |
| 383 sep = ";", | |
| 384 into = names_col) %>% | |
| 385 mutate(USM = list_usms[i]) | |
| 386 | |
| 387 rap <- bind_rows(rap, rap_i) | |
| 388 | |
| 389 } | |
| 390 | |
| 391 } | |
| 392 rm(rap_1, names_col, rap_string, rap_i) | |
| 393 | |
| 394 rap <- rap %>% | |
| 395 select(USM, everything()) %>% | |
| 396 mutate(P_usm = str_replace_all(P_usm, " ", "")) %>% | |
| 397 mutate(wlieu = str_replace_all(wlieu, " ", "")) %>% | |
| 398 mutate(stade = str_replace_all(stade, " ", "")) %>% | |
| 399 mutate(nomversion = str_replace_all(nomversion, " ", "")) %>% | |
| 400 mutate(across(3:9, as.numeric)) %>% | |
| 401 mutate(across(13:ncol(rap), as.numeric)) %>% | |
| 402 #separate(col=P_usm,into=c("upc","sol","systeme","rotation","tete_rotation","horizon","annee","culture"),sep="-",remove = FALSE) | |
| 403 separate( | |
| 404 col = USM, | |
| 405 into = c( | |
| 406 "upc", | |
| 407 "sol", | |
| 408 "systeme", | |
| 409 "rotation", | |
| 410 "tete_rotation", | |
| 411 "horizon", | |
| 412 "annee", | |
| 413 "culture" | |
| 414 ), | |
| 415 sep = "-", | |
| 416 remove = FALSE | |
| 417 ) | |
| 418 | |
| 419 write_delim( | |
| 420 x = rap, | |
| 421 file = paste0( | |
| 422 workspace, | |
| 423 "/analyse_simulations_STICS/", | |
| 424 systeme, | |
| 425 "/", | |
| 426 rotation, | |
| 427 "/report-", | |
| 428 rotation, | |
| 429 "-", | |
| 430 upc, | |
| 431 "-", | |
| 432 sol, | |
| 433 "-", | |
| 434 scenario, | |
| 435 ".csv" | |
| 436 ), | |
| 437 delim = ";" | |
| 438 ) | |
| 439 | |
| 440 } |
