diff --git a/src/modules/butterflies/CMakeLists.txt b/src/modules/butterflies/CMakeLists.txt index 1da70b3a9b656fe6cdfa876683a0a2ef8de8cc00..b74426a554c7935df7c46671dbcc7f4ee05a5107 100644 --- a/src/modules/butterflies/CMakeLists.txt +++ b/src/modules/butterflies/CMakeLists.txt @@ -1,4 +1,4 @@ -add_library(cats-butterflies SHARED "" butterflies_actions.c butterflies_actions.h butterflies_vital_rates.c butterflies_vital_rates.h module.h butterflies_dispersal.c butterflies_dispersal.h butterflies_populations.c butterflies_populations.h butterflies_inline.h butterflies_generations.c butterflies_generations.h) +add_library(cats-butterflies SHARED "" butterflies_actions.c butterflies_actions.h butterflies_vital_rates.c butterflies_vital_rates.h module.h butterflies_dispersal.c butterflies_dispersal.h butterflies_populations.c butterflies_populations.h butterflies_inline.h butterflies_generations.c butterflies_generations.h butterflies_stats.c) target_include_directories(cats-butterflies PUBLIC ".") diff --git a/src/modules/butterflies/butterflies_actions.c b/src/modules/butterflies/butterflies_actions.c index 4f62f6c2af0717ae84c6b3db91e70f3f6d2f26ac..882a9593b611499e814a300de07610f60e3efe21 100644 --- a/src/modules/butterflies/butterflies_actions.c +++ b/src/modules/butterflies/butterflies_actions.c @@ -18,6 +18,17 @@ #include "butterflies_generations.h" +inline void increase_custom_stat(struct statistics stats, int64_t stat_id, int64_t by) +{ + +} + + +inline void ensure_valid_stat_id(struct statistics stats, int64_t stat_id) +{ + +} + enum action_status action_butterfly_stats_reset(struct cats_grid *grid, struct cats_configuration *conf) { return ACTION_RUN; @@ -44,6 +55,7 @@ void grid_butterflies_maturation(struct cats_grid *grid, struct cats_thread_info } butterflies_cell_maturation(grid, ts, row, col, false); + } } @@ -168,6 +180,22 @@ enum action_status action_butterflies_output(struct cats_grid *grid, struct cats enum action_status action_butterfly_stats_gather(struct cats_grid *grid, struct cats_configuration *conf) { + struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; + int64_t excluded_id = module_conf->stat_ids[BF_STAT_EXCLUDED]; + + const cats_dt_coord rows = grid->dimension.rows; + const cats_dt_coord cols = grid->dimension.cols; + for (cats_dt_coord row = 0; row < rows; row++) { + for (cats_dt_coord col = 0; col < cols; col++) { + if (cell_excluded_by_overlay(conf, row, col)) { + increase_custom_stat(grid->stats, excluded_id, 1); + continue; + } + + + + } + } return ACTION_RUN; } @@ -313,25 +341,30 @@ void add_actions(struct cats_configuration *conf) register_action_function(conf, action_butterflies_dispersal, "butterfly_action_dispersal", "egg dispersal"); register_action_function(conf, action_butterflies_kill_adults, "butterfly_kill_adults", "kill adults"); register_action_function(conf, action_butterflies_save_grid, "action_butterflies_save_grid", "output"); - + register_action_function(conf, action_butterfly_stats_gather, "action_butterfly_stats_gather", "gather stats"); + register_action_function(conf, action_butterfly_stats_reset, "action_butterfly_stats_reset", "reset stats"); + register_action_function(conf, action_butterfly_stats_write, "action_butterfly_stats_write", "write stats"); list_actions_full(conf); append_action(conf, action_butterfly_stats_reset, ALL_STAGES, "resetting butterfly statistics", module_name); - append_action(conf, action_butterflies_update_overlays, ALL_STAGES, "updating resource layer", module_name); append_action_by_name(conf, "action_load_environments", ALL_STAGES, "environment update", module_name); append_action_by_name(conf, "action_overlay_update", ALL_STAGES, "overlay update", module_name); + append_action(conf, action_butterflies_update_overlays, ALL_STAGES, "updating resource layer", module_name); append_action(conf, action_butterfly_update_generations, ALL_STAGES, "update generations", module_name); for (int32_t generation = data->generations_max; generation > 0; generation--) { + add_butterfly_generation_action(conf, action_butterfly_stats_reset, "reset stats", generation); add_butterfly_generation_action(conf, action_start_generation, "start generation", generation); add_butterfly_generation_action(conf, action_butterflies_maturation, "transition eggs to adults", generation); + add_butterfly_generation_action(conf, action_butterfly_stats_gather, "gather stats", generation); add_butterfly_generation_action(conf, action_butterflies_dispersal, "dispersal", generation); add_butterfly_generation_action(conf, action_butterflies_save_grid, "output", generation); add_butterfly_generation_action(conf, action_butterflies_kill_adults, "kill adults", generation); add_butterfly_generation_action(conf, action_finish_generation, "finish generation", generation); + add_butterfly_generation_action(conf, action_butterfly_stats_write, "write stats", generation); } } \ No newline at end of file diff --git a/src/modules/butterflies/butterflies_generations.c b/src/modules/butterflies/butterflies_generations.c index 8e3642ce5ddb7b7dbb645e40ffb4c045c1cc215a..db756eddf8257fda20e0450b41a6a45d1c273feb 100644 --- a/src/modules/butterflies/butterflies_generations.c +++ b/src/modules/butterflies/butterflies_generations.c @@ -1,5 +1,51 @@ -// -// Created by gattringera on 01/03/23. -// +#include "butterflies_populations.h" +#include "inline_overlays.h" +#include "butterflies_main.h" +#include "modules/module_header.h" +#include "actions/cats_actions.h" #include "butterflies_generations.h" +#include "inline.h" + +void grid_update_generations(struct cats_grid *grid, struct cats_thread_info *ts) +{ + struct cats_configuration *conf = ts->conf; + + + struct conf_data_butterflies *module_conf = CATS_MODULE_DATA; + int module_id = CATS_MODULE_ID; + struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data; + struct cats_vital_rate *rate = &module_conf->butterfly_generations; + + //const bool sim_mode = conf-> + + const cats_dt_coord start_row = ts->area.start_row; + const cats_dt_coord end_row = ts->area.end_row; + + const cats_dt_coord start_col = ts->area.start_col; + const cats_dt_coord end_col = ts->area.end_col; + for (cats_dt_coord row = start_row; row < end_row; row++) { + for (cats_dt_coord col = start_col; col < end_col; col++) { + + if (cell_excluded_by_overlay(conf, row, col)) { + data->generations[row][col] = 0.0f; + continue; + } + + cats_dt_rates gen = calculate_rate(rate, 0, conf->param, grid, row, col, NULL); + + + + cats_dt_environment suitability = get_suitability(grid, row, col); + if (suitability < grid->param.ZT) { + gen = 0.0; + } else if (suitability > grid->param.OT) { + gen = min_rates(1.0, gen); + } + + data->generations[row][col] = (float) gen; + + //printf("GENERATIONS::thread %03d:: %d %d %f\n", ts->id ,row, col, (float) gen); + } + } +} \ No newline at end of file diff --git a/src/modules/butterflies/butterflies_generations.h b/src/modules/butterflies/butterflies_generations.h index d21b298b381ddd5e9b59d907f8a49c43fd6ecd5a..312421c84ab865c457804d4570c5d7f3f7152e51 100644 --- a/src/modules/butterflies/butterflies_generations.h +++ b/src/modules/butterflies/butterflies_generations.h @@ -1,8 +1,6 @@ -// -// Created by gattringera on 01/03/23. -// - #ifndef CATS_BUTTERFLIES_GENERATIONS_H #define CATS_BUTTERFLIES_GENERATIONS_H - +#include "data/cats_grid.h" +#include "threading/threading.h" +void grid_update_generations(struct cats_grid *grid, struct cats_thread_info *ts); #endif //CATS_BUTTERFLIES_GENERATIONS_H diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c index 8737f997b366157c165b64ec0f7592d12cf0a4bc..3da5d2ab4fc92620588c47be84f40b308fe514bb 100644 --- a/src/modules/butterflies/butterflies_main.c +++ b/src/modules/butterflies/butterflies_main.c @@ -26,6 +26,11 @@ void *butterfly_grid_init(struct cats_configuration *conf, struct cats_grid *gri //struct conf_data_butterflies *conf_data = CATS_MODULE_DATA; data->eggs = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float)); + if (grid->param.parametrization != PARAM_HYBRID) { + log_message(LOG_ERROR, "%s only works with hybrid parametrisation mode", module_name); + exit_cats(EXIT_FAILURE); + + } return data; } @@ -88,5 +93,12 @@ void cats_module_init(struct cats_configuration *conf) add_vital_rates(conf, data); log_message(LOG_INFO, "Hello from %s (id: %d)\n", module_name, id); + + for (enum butterfly_stats which = BF_STAT_MIN; which < BF_STAT_MAX; which++) { + data->stat_ids[which] = add_custom_stat(&conf->stats_registry, get_butterfly_stats_name(which)); + } + + + } diff --git a/src/modules/butterflies/butterflies_main.h b/src/modules/butterflies/butterflies_main.h index 3f3d940515a72f1c899e7645d2ccc2fb3d4f2637..2a6b1c0415371cca1ac2c6e4909925fb947168fb 100644 --- a/src/modules/butterflies/butterflies_main.h +++ b/src/modules/butterflies/butterflies_main.h @@ -1,22 +1,25 @@ #ifndef CATS_BUTTERFLIES_MAIN_H #define CATS_BUTTERFLIES_MAIN_H + #include "cats_global.h" #include <stdint.h> #include "data/cats_datatypes.h" #include "vital_rates/vital_rates.h" +#include "butterflies_stats.h" + struct grid_data_butterflies { - float **generations; - int32_t generation_current; - float **eggs; - int32_t **info_layer; + float **generations; + int32_t generation_current; + float **eggs; + int32_t **info_layer; }; enum butterfly_cell_info { BF_CELL_CLEAR = 0, - BF_CELL_EXCLUDED = 1 << 0, + BF_CELL_EXCLUDED = 1 << 0, BF_CELL_HABITAT_OK = 1 << 1, BF_CELL_RESOURCE_AVAILABLE = 1 << 2 @@ -27,16 +30,18 @@ enum butterfly_cell_info { struct conf_data_butterflies { - // fixme -> move to grid data; - int32_t generations_max; - int32_t current_generation; - int32_t animal_dispersal_max_radius; ///< maximal flight/dispersal distance - cats_dt_rates egg_to_adult_survival_rate_maximum; - cats_dt_rates egg_per_female_maximum; - bool actions_added; - struct cats_vital_rate eggs_per_female; - struct cats_vital_rate butterfly_egg_to_adult_survival; - struct cats_vital_rate butterfly_generations; + // fixme -> move to grid data; + int32_t generations_max; + int32_t current_generation; + int32_t animal_dispersal_max_radius; ///< maximal flight/dispersal distance + cats_dt_rates egg_to_adult_survival_rate_maximum; + cats_dt_rates egg_per_female_maximum; + bool actions_added; + struct cats_vital_rate eggs_per_female; + struct cats_vital_rate butterfly_egg_to_adult_survival; + struct cats_vital_rate butterfly_generations; + int64_t stat_ids[BF_STAT_MAX]; + }; #endif //CATS_BUTTERFLIES_MAIN_H diff --git a/src/modules/butterflies/butterflies_populations.c b/src/modules/butterflies/butterflies_populations.c index c42baf4377db4a6a2982bec537ff612c8627f841..cf8999044cbc98ad0e2c7f2c26b5c322bbda654b 100644 --- a/src/modules/butterflies/butterflies_populations.c +++ b/src/modules/butterflies/butterflies_populations.c @@ -13,6 +13,7 @@ #include "butterflies_inline.h" + void butterflies_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cats_dt_coord row, cats_dt_coord col, bool check_exclusion) { const struct cats_configuration *conf = ts->conf; diff --git a/src/modules/butterflies/butterflies_stats.c b/src/modules/butterflies/butterflies_stats.c new file mode 100644 index 0000000000000000000000000000000000000000..9a08c6752600b9cf95c0f123653be56cc000ee3f --- /dev/null +++ b/src/modules/butterflies/butterflies_stats.c @@ -0,0 +1,28 @@ +// +// Created by gattringera on 16/03/23. +// + +#include "butterflies_stats.h" +#include "logging.h" +#include "cats_global.h" + +const char *get_butterfly_stats_name(enum butterfly_stats which) +{ + switch (which) { + case BF_STAT_POPULATED_FIT: + return "populated_fit"; + case BF_STAT_POPULATED_UNFIT: + return "populated_unfit"; + case BF_STAT_UNPOPULATED_FIT: + return "unpopulated_fit"; + case BF_STAT_UNPOPULATED_UNFIT: + return "unpopulated_unfit"; + case BF_STAT_EXCLUDED: + return "excluded"; + case BF_STAT_MAX: + break; + } + + log_message(LOG_ERROR, "unknown butterfly stats name with id %d", which); + exit_cats(EXIT_FAILURE); +} diff --git a/src/modules/butterflies/butterflies_stats.h b/src/modules/butterflies/butterflies_stats.h new file mode 100644 index 0000000000000000000000000000000000000000..a3bb6a1fda2499a893044a65ebf8f4848ddeb503 --- /dev/null +++ b/src/modules/butterflies/butterflies_stats.h @@ -0,0 +1,22 @@ +// +// Created by gattringera on 16/03/23. +// + +#ifndef CATS_BUTTERFLIES_STATS_H +#define CATS_BUTTERFLIES_STATS_H + +enum butterfly_stats { + BF_STAT_MIN = 0, + BF_STAT_POPULATED_FIT = 0, + BF_STAT_POPULATED_UNFIT, + BF_STAT_UNPOPULATED_FIT, + BF_STAT_UNPOPULATED_UNFIT, + BF_STAT_EXCLUDED, + BF_STAT_MAX +}; + +const char *get_butterfly_stats_name(enum butterfly_stats which); + + + +#endif //CATS_BUTTERFLIES_STATS_H