Skip to content
Snippets Groups Projects
Commit 7e8a1a7d authored by Andreas Gattringer's avatar Andreas Gattringer
Browse files

Butterflies: stats related updates

parent 9dd2b2c7
No related branches found
No related tags found
No related merge requests found
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 ".")
......
......@@ -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
//
// 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
//
// 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
......@@ -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));
}
}
#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
......@@ -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;
......
//
// 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);
}
//
// 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment