r-plumer-example / utils_function.R
hadimaster65555's picture
fix one cycle generator data
f23d719
Raw
History Blame Contribute Delete
11.3 kB
# growth function v2 ----
growth_function_training <- function(
data,
init_size = 0.01,
max_doc = 120,
method = "ADG"
) {
# set maximum doc
doc_vec <- 1:max_doc
if (method == "Growth Model") {
message("---- use Growth Model ----")
model_res <-nls(
mbw ~ asymptotic_growth*(1-(1-(init_size/asymptotic_growth)^(1/allometric_scale))*exp(-growth_rate*doc))^allometric_scale,
data = data,
start = list(
asymptotic_growth = 40,
allometric_scale = 3,
growth_rate = 0.015
)
)
pred_res <- predict(
model_res,
list(
doc = doc_vec
)
)
tibble(
doc = doc_vec,
mbw = round(pred_res,3)
) -> growth_res
} else if(method == "ABW Interpolation") {
message("---- use ABW Interpolation ----")
min_doc <- min(data$doc)
max_doc <- max(data$doc)
growth_res <- data.frame(
with(data,
approx(doc, mbw, xout = seq(min_doc, max_doc, by = 1), method = "linear")
)
) %>%
rename(doc = x, mbw = y)
} else if(method == "Genetics - Balanced") {
message("---- use Genetics - Balanced Data ----")
growth_res <- growth_by_genetic_data %>%
select(DOC, Balanced) %>%
rename(
doc = DOC,
mbw = Balanced
) %>%
filter(doc <= max_doc)
} else if(method == "Genetics - Fast Growth") {
message("---- use Genetics - Fast Growth Data ----")
growth_res <- growth_by_genetic_data %>%
select(DOC, Fast.Growth) %>%
rename(
mbw = Fast.Growth,
doc = DOC
) %>%
filter(doc <= max_doc)
} else {
message("---- use ADG Interpolation ----")
initial_weight <- init_size
final_doc <- max_doc
adg_data <- data
abw_container <- list()
for (indeks in 1:nrow(adg_data)) {
if (indeks == 1) {
abw_container[[indeks]] <- c(initial_weight, initial_weight + cumsum(rep(adg_data$adg[indeks], adg_data$doc[indeks + 1] - adg_data$doc[indeks] - 1)))
} else if(indeks == nrow(adg_data)) {
initial_weight <- max(abw_container[[indeks-1]])
abw_container[[indeks]] <- c(initial_weight + cumsum(rep(adg_data$adg[indeks], final_doc - adg_data$doc[indeks] + 1)))
} else {
initial_weight <- max(abw_container[[indeks-1]])
abw_container[[indeks]] <- c(initial_weight + cumsum(rep(adg_data$adg[indeks], adg_data$doc[indeks + 1] - adg_data$doc[indeks])))
}
}
mbw_ <- unlist(abw_container)
tibble(
doc = 1:final_doc,
mbw = mbw_
) -> growth_res
}
return(growth_res)
}
# survival function v2 ----
## function ----
survival_function_v2 <- function(
method, model, initial_population, target_survival, max_doc, harvest_setting
) {
if (method == "Target Based") {
message("---- Calculate Survival using Target Based Method ----")
natural_mort <- (1-(target_survival))*100/(max_doc)
sr_ = 100 - cumsum(rep(natural_mort, max_doc))
tibble(
doc = 1:max_doc,
sr_est = sr_,
population = initial_population
) -> temp_table
} else {
message("---- Calculate Survival using Model Based Method ----")
if(model == "Model Survival Logistik") {
message("---- Use Survival Logistic Model ----")
doc <- 1:max_doc
sr_ <- (100 - 2.86*log2(doc))/100
tibble(
doc = 1:max_doc,
sr_est = sr_,
population = initial_population
) -> temp_table
}
}
temp_table %>%
left_join(
harvest_setting %>%
mutate(harvest_percentage_cumm = cumsum(harvest_percentage))
) %>%
fill(harvest_percentage_cumm, .direction = "down") %>%
replace_na(
list(
harvest_percentage_cumm = 0,
harvest_percentage = 0
)
) %>%
mutate(lag_harvest_percentage_cumm = lag(harvest_percentage_cumm)) %>%
mutate(sr_est = sr_est - ifelse(is.na(lag_harvest_percentage_cumm), 0, lag_harvest_percentage_cumm)) %>%
mutate(
population_left = population * sr_est/100,
harvested = population_left * harvest_percentage/100
) %>%
select(doc, sr_est, population, harvest_percentage, harvested, population_left) -> result
return(result)
}
## testing ----
# survival_function_v2(
# initial_population = 414252,
# target_survival = 0.8,
# max_doc = 120,
# harvest_setting = harvest_setting,
# method = survival_calculation_method,
# model = survival_model
# ) -> survival_result
# survival_result %>%
# print(n = 120)
blind_feeding_function_v2 <- function(
total_feed_day_1,
blind_feeding_rules_table,
survival_table
) {
# init farm multiplier
farm_multiplier <- c(total_feed_day_1, blind_feeding_rules_table$feed_increment)
# check if farm_multiplier is empty
if (length(farm_multiplier) == 0) {
farm_multiplier <- c(3, 0.2, 0.4, 0.6)
}
blind_feeding_rules_table[1,] %>%
mutate(range = doc_end - doc_start) %>% pull(range) -> range_1
blind_feeding_rules_table[2,] %>%
mutate(range = doc_end - doc_start + 1) %>% pull(range) -> range_2
blind_feeding_rules_table[3,] %>%
mutate(range = doc_end - doc_start + 1) %>% pull(range) -> range_3
session_1 <- c(farm_multiplier[1], farm_multiplier[1] + cumsum(rep(farm_multiplier[2], range_1)))
session_2 <- c(max(session_1) + cumsum(rep(farm_multiplier[3], range_2)))
session_3 <- c(max(session_2) + cumsum(rep(farm_multiplier[4], range_3)))
end_doc <- max(blind_feeding_rules_table$doc_end)
tibble(
doc = 1:end_doc,
bf_coef = c(session_1, session_2, session_3)
) %>%
inner_join(
survival_table %>%
select(doc, population_left)
) %>%
mutate(
blind_feeding = bf_coef * population_left/100000
) %>%
select(doc, blind_feeding) -> feed_table
return(feed_table)
}
## testing ----
# blind_feeding_settings_day_2 <- tibble(
# doc_start = c(1, 11, 21),
# doc_end = c(10, 20, 30),
# feed_increment = c(0.2, 0.4, 0.6),
# unit = "kg/100K shrimps"
# )
#
# blind_feeding_function_v2(
# total_feed_day_1 = 3,
# blind_feeding_rules_table = blind_feeding_settings_day_2,
# survival_table = survival_result
# )
fi_generator <- function(
total_feed_day_1,
blind_feeding_rules_table
) {
# init farm multiplier
farm_multiplier <- c(total_feed_day_1, blind_feeding_rules_table$feed_increment)
# check if farm_multiplier is empty
if (length(farm_multiplier) == 0) {
farm_multiplier <- c(3, 0.2, 0.4, 0.6)
}
blind_feeding_rules_table[1,] %>%
mutate(range = doc_end - doc_start) %>% pull(range) -> range_1
blind_feeding_rules_table[2,] %>%
mutate(range = doc_end - doc_start + 1) %>% pull(range) -> range_2
blind_feeding_rules_table[3,] %>%
mutate(range = doc_end - doc_start + 1) %>% pull(range) -> range_3
session_1 <- c(farm_multiplier[1], farm_multiplier[1] + cumsum(rep(farm_multiplier[2], range_1)))
session_2 <- c(max(session_1) + cumsum(rep(farm_multiplier[3], range_2)))
session_3 <- c(max(session_2) + cumsum(rep(farm_multiplier[4], range_3)))
end_doc <- max(blind_feeding_rules_table$doc_end)
tibble(
doc = 1:end_doc,
feed_index = c(session_1, session_2, session_3)
) -> result
return(result)
}
# fi_generator(
# total_feed_day_1 = 3,
# blind_feeding_rules_table = blind_feeding_increment_setting
# )
# All Feeding Generator V2 ----
## function ----
all_feeding_generator_function_v2 <- function(
date_data,
max_doc,
shrimp_stock_data,
harvest_setting,
survival_calculation_method,
target_survival,
survival_model,
blind_feeding_day_1_setting,
blind_feeding_day_2_setting,
fi_multiplier,
fr_calculation_method,
fr_coef_x,
fr_coef_y,
growth_scenario_table
) {
survival_table_container <- tibble(
date = as.Date(character()),
doc = as.integer(),
sr_est = as.numeric(),
pond_code = as.character(),
population = as.numeric(),
harvest_percentage = as.numeric(),
harvested = as.numeric(),
population_left = as.numeric()
)
demand_feeding_container <- tibble(
doc = as.integer(),
pond_code = as.character(),
adg_plan = as.numeric(),
indeks_plan = as.numeric(),
fr_plan = as.numeric(),
feed_per_day_fr = as.numeric(),
feed_per_day_indeks = as.numeric()
)
blind_feeding_container <- tibble(
doc = as.integer(),
total_feed = as.integer(),
type = as.character(),
pond_code = as.character()
)
doc_vec <- 1:max_doc
for (pond_name in shrimp_stock_data$pond_code) {
date_table <- tibble(
date = seq(from = date_data, by = "day", length.out = length(doc_vec))
)
shrimp_stock_data %>%
filter(pond_code == pond_name) -> pond_stock_stats
survival_table <- survival_function_v2(
method = survival_calculation_method,
model = survival_model,
initial_population = pond_stock_stats$stocking_actual,
target_survival = target_survival,
max_doc = max_doc,
harvest_setting = harvest_setting
) %>%
mutate(pond_code = pond_stock_stats$pond_code) %>%
bind_cols(date_table)
survival_table_container %>%
bind_rows(survival_table) -> survival_table_container
demand_feeding_table <- growth_scenario_table %>%
inner_join(survival_table) %>%
mutate(
adg_plan = mbw - lag(mbw)
) %>%
mutate(
indeks_plan = adg_plan * fi_multiplier,
)
if (fr_calculation_method == "FR Type 1") {
demand_feeding_table <- demand_feeding_table %>%
mutate(
fr_plan = 10^(fr_coef_x-(fr_coef_y*log10(mbw)))
)
} else if(fr_calculation_method == "FR Type 2") {
demand_feeding_table <- demand_feeding_table %>%
mutate(
fr_plan = 10^(fr_coef_x-(fr_coef_y*log10(mbw))) * 100
)
} else {
demand_feeding_table <- demand_feeding_table %>%
mutate(
fr_plan = 10^(fr_coef_x-(fr_coef_y*log10(mbw)))
)
}
demand_feeding_table <- demand_feeding_table %>%
mutate(
feed_per_day_indeks = doc * indeks_plan * population_left/100000,
feed_per_day_fr = mbw * (population_left/1000) * fr_plan
) %>%
filter(doc >= 31) %>%
select(
doc, pond_code, adg_plan, indeks_plan, fr_plan, feed_per_day_fr,
contains("_indeks"),
contains("_fr")
)
demand_feeding_container %>%
bind_rows(demand_feeding_table) -> demand_feeding_container
blind_feed_table <- blind_feeding_function_v2(
survival_table = survival_table,
total_feed_day_1 = blind_feeding_day_1_setting,
blind_feeding_rules_table = blind_feeding_day_2_setting
) %>%
rename(total_feed = blind_feeding) %>%
mutate(type = 'blind_feeding', pond_code = pond_name)
blind_feeding_container %>%
bind_rows(blind_feed_table) -> blind_feeding_container
}
return(
list(
survival_table = survival_table_container,
blind_feed_table = blind_feeding_container,
demand_feeding_table = demand_feeding_container
)
)
}