//=-------------------------------------------------------------------------=// // base definition // // // // Copyright © 2021 Libre en Communs (contact@a-lec.org) // // Copyright © 2021 Adrien Bourmault (neox@a-lec.org) // // // // This file is part of gem-graph. // // // // This program is free software: you can redistribute it and/or modify // // it under the terms of the GNU Affero General Public License as // // published by the Free Software Foundation, either version 3 of the // // License, or (at your option) any later version. // // // // This program is distributed in the hope that it will be useful, // // but WITHOUT ANY WARRANTY; without even the implied warranty of // // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // // GNU Affero General Public License for more details. // // // // You should have received a copy of the GNU Affero General Public License // // along with this program. If not, see . // //=-------------------------------------------------------------------------=// #include #include #include #include #include #include #include #include #include #include #include #define BASE_H /* -------------------------------------------------------------------------- */ #define LOGMSG "<%s:%s()>" #define printlog(FORMAT, ...) printf("\e[0;36m" LOGMSG "\e[0m" " " FORMAT \ "\e[0m", __FILE__,__func__, ##__VA_ARGS__) #define printerr(FORMAT,...) fprintf(stderr, "\e[0;31m" LOGMSG "\e[0m" " " \ FORMAT "\e[0m", __FILE__,__func__, \ ##__VA_ARGS__) #define LEN(x) (sizeof(x) / sizeof((x)[0])) /* -------------------------------------------------------------------------- */ struct parameters_t { char *configDir; char *userDir; char *modelDir; }; /* * Structure describing an arrow */ struct arrow_t { uint load; uint site; uint x; uint y; uint z; }; struct space_unit_t { bool lock; struct arrow_t **sites; // Array of struct arrow_t* elements // - lenght is multiplicity }; struct space_t { // Dimensions of space. // Note that a value 0 is not allowed, minimum is 1 int x_dim; int y_dim; int z_dim; struct space_unit_t *units; // (flat) arraw of space_unit_t elements : // - lenght is x_dim * y_dim * z_dim // - access to the (x,y,z) is done by // units[ x // + dim_x * y // + dim_x * dim_y * z ] }; struct state_t { // Metadata int id; int owner_id; time_t date; struct space_t *space; }; struct model_t { // Metadata int id; int owner_id; time_t date; union version { int major; int minor; }; // User friendly metadata char *owner_name; char *model_name; // Model parameters int multiplicity; // number of sites in a space_unit int dimension; // number of space dimensions // Simulation parameters int max_thread; int max_cycles; // Handler to the current space of the model struct space_t *space; // Handler to the saved states of the model struct state_t **states; }; struct worker_t { int id; int status; }; struct scheduler_t { int id; struct model_t **model; // Queue (array) of waiting models };