WIP: loading arrows successfully

This commit is contained in:
Adrien Bourmault 2024-03-21 02:09:00 +02:00
parent 1625658b45
commit 575612a77d
Signed by: neox
GPG Key ID: 95F65F55F682A17A
6 changed files with 192 additions and 50 deletions

View File

@ -34,7 +34,7 @@
<!-- Each site points towards a neighbouring space unit. --> <!-- Each site points towards a neighbouring space unit. -->
<!-- Several arrows can be stacked in the same site. --> <!-- Several arrows can be stacked in the same site. -->
<site_multiplicity>3</site_multiplicity> <site_multiplicity>2</site_multiplicity>
</space-param> </space-param>
@ -75,19 +75,19 @@
<conditions id="random walk of dimers" date="1630000000" author="Zazard le lézard !"> <conditions id="random walk of dimers" date="1630000000" author="Zazard le lézard !">
<condition site="1" weight="1" node_id="1" parent="0" x="0"/> <condition site="0" weight="1" node_id="1" parent="0" x="0"/>
<condition site="2" weight="1" node_id="2" parent="1" x="1"/> <condition site="1" weight="1" node_id="2" parent="1" x="1"/>
<!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at atation (0,1). --> <!-- as soon as conditions 1 and 2 are satisfied, a dimer is identified at atation (0,1). -->
<condition site="1" weight="0" node_id="3" parent="2" x="2"/> <condition site="0" weight="0" node_id="3" parent="2" x="2"/>
<!-- as soon as condition 3 is satisfied, <!-- as soon as condition 3 is satisfied,
the neighbouring space unit to East of the dimer is empty the neighbouring space unit to East of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to East. --> and the dimer identified by conditions (0,1) can be moved to East. -->
<condition site="2" weight="0" node_id="4" parent="2" x="-1"/> <condition site="1" weight="0" node_id="4" parent="2" x="-1"/>
<!-- as soon as condition 4 is satisfied, <!-- as soon as condition 4 is satisfied,
the neighbouring space unit to West of the dimer is empty the neighbouring space unit to West of the dimer is empty
and the dimer identified by conditions (1,2) can be moved to West. --> and the dimer identified by conditions (0,1) can be moved to West. -->
</conditions> </conditions>

View File

@ -34,7 +34,7 @@
<!-- Each site points towards a neighbouring space unit. --> <!-- Each site points towards a neighbouring space unit. -->
<!-- Several arrows can be stacked in the same site. --> <!-- Several arrows can be stacked in the same site. -->
<site_multiplicity>3</site_multiplicity> <site_multiplicity>2</site_multiplicity>
</space-param> </space-param>

View File

@ -76,17 +76,17 @@ struct space_t
struct state_t struct state_t
{ {
// Metadata // Metadata
int id; char id[25];
int owner_id; int owner_id;
time_t date; time_t date;
struct space_t *space; struct space_t *space;
}; };
struct model_t { struct model_t
{
// Metadata // Metadata
int id; char id;
int owner_id; int owner_id;
time_t date; time_t date;
union version union version
@ -96,12 +96,13 @@ struct model_t {
}; };
// XML handlers // XML handlers
xmlDocPtr model; xmlDocPtr doc;
xmlHashTablePtr model_hashtable; xmlHashTablePtr hashtable;
// User friendly metadata // User friendly metadata
char *owner_name; char *owner_name;
char *model_name; char *model_name;
char *filename;
// Model parameters // Model parameters
int multiplicity; // number of sites in a space_unit int multiplicity; // number of sites in a space_unit
@ -114,14 +115,26 @@ struct model_t {
// Handler to the current space of the model // Handler to the current space of the model
struct space_t *space; struct space_t *space;
// Handler to the saved states of the model // Handler to the arrows
struct state_t **states; struct arrow_t *arrows;
size_t n_arrows;
// Handler to the saved states array
struct state_t *states;
size_t n_states;
};
struct model_array_t
{
struct model_t *models;
size_t size;
}; };
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// Model init function (and model discovery) // // Model init function (and model discovery) //
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// void model_system_init (parameters_t *parameters); void model_system_init (struct parameters_t *parameters);
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// Model stopping function // // Model stopping function //
@ -131,20 +144,13 @@ struct model_t {
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// Load a model ready to execute // // Load a model ready to execute //
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// int model_load (int id); bool model_load (struct model_t *self);
bool model_init(struct model_t *self,
const char *content,
size_t length,
const char *basename);
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// Unload a model // // Unload a model //
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// int model_unload (int id); // int model_unload (int id);
bool model_shutdown(struct model_t *self);
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //
// Add a model to the known model list // // Add a model to the known model list //
// -------------------------------------------------------------------------- // // -------------------------------------------------------------------------- //

View File

@ -114,12 +114,12 @@ int main(int argc, char **argv)
// Initializing random generator // Initializing random generator
t = time(&t); t = time(&t);
srand((unsigned)t); srand ((unsigned)t);
/* server = calloc(1, sizeof(*server)); */ /* server = calloc(1, sizeof(*server)); */
/* // Initializing model system */ // Initializing model system
/* model_system_init(&parameters); */ model_system_init (&parameters);
/* // Launching server */ /* // Launching server */
/* server_init(server); */ /* server_init(server); */

View File

@ -35,10 +35,11 @@
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
bool model_init(struct model_t *self, struct model_array_t *knownModels;
const char *content,
size_t length, /* -------------------------------------------------------------------------- */
const char *basename)
static bool model_init(struct model_t *self)
{ {
xmlNode *node; xmlNode *node;
@ -49,41 +50,42 @@ bool model_init(struct model_t *self,
*/ */
LIBXML_TEST_VERSION LIBXML_TEST_VERSION
self->model = xmlReadMemory(content, length, basename, NULL, 0); self->doc = xmlReadFile(self->filename, NULL, 0);
if (self->model == NULL ) { if (self->doc == NULL ) {
printerr("Error trying to open the XML model !\n");
return false; return false;
} }
node = xmlDocGetRootElement(self->model); node = xmlDocGetRootElement(self->doc);
if (node == NULL) { if (node == NULL) {
fprintf(stderr, "Empty XML model !\n"); printerr("Empty XML model !\n");
xmlFreeDoc(self->model); xmlFreeDoc(self->doc);
return false; return false;
} }
if (xmlStrcmp(node->name, (xmlChar *) "gem-graph-model")) { if (xmlStrcmp(node->name, (xmlChar *) "gem-graph-model")) {
fprintf(stderr, "document of the wrong type, root node != gem-graph-model\n"); printerr("document of the wrong type, root node != gem-graph-model\n");
xmlFreeDoc(self->model); xmlFreeDoc(self->doc);
return false; return false;
} }
self->model_hashtable = xmlHashCreate(0); self->hashtable = xmlHashCreate(0);
if (self->model_hashtable == NULL) { if (self->hashtable == NULL) {
fprintf(stderr, "Can't create model hash table !\n"); printerr("Can't create model hash table !\n");
xmlFreeDoc(self->model); xmlFreeDoc(self->doc);
return false; return false;
} }
return true; return true;
} }
bool model_shutdown(struct model_t *self) static bool model_shutdown(struct model_t *self)
{ {
xmlFreeDoc(self->model); xmlFreeDoc(self->doc);
xmlHashFree(self->model_hashtable, NULL); xmlHashFree(self->hashtable, NULL);
// Cleanup function for the XML library // Cleanup function for the XML library
xmlCleanupParser(); xmlCleanupParser();
@ -139,7 +141,7 @@ static xmlNodePtr model_get_node(struct model_t *self, xmlChar *path)
xmlChar *reste, *last, *affich; xmlChar *reste, *last, *affich;
// Lookup for node from path in hash table // Lookup for node from path in hash table
node = xmlHashLookup(self->model_hashtable, path); node = xmlHashLookup(self->hashtable, path);
// Found a node in hash table // Found a node in hash table
if (node) { if (node) {
@ -150,7 +152,7 @@ static xmlNodePtr model_get_node(struct model_t *self, xmlChar *path)
reste = path; reste = path;
affich = reste; affich = reste;
last = getLastTag(reste); last = getLastTag(reste);
node = xmlDocGetRootElement(self->model); node = xmlDocGetRootElement(self->doc);
while (xmlStrchr (reste, '/')) { while (xmlStrchr (reste, '/')) {
extrait = getFirstTag(reste); extrait = getFirstTag(reste);
@ -165,7 +167,7 @@ static xmlNodePtr model_get_node(struct model_t *self, xmlChar *path)
while (node && xmlStrcmp(node->name, last)) { while (node && xmlStrcmp(node->name, last)) {
node = node->next; node = node->next;
} }
xmlHashAddEntry (self->model_hashtable, path, node); xmlHashAddEntry (self->hashtable, path, node);
} }
return node; return node;
@ -473,4 +475,138 @@ bool model_get_next_arrow(struct model_t *self,
/* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */
bool model_load (struct model_t *self)
{
char state_id[30] = {0};
if (!model_init (self))
return false;
printlog ("Loading %s...\n", self->filename);
// Dimension
self->dimension = model_get_dim (self);
printlog ("Dimension : %d\n", self->dimension);
// Dimensions
self->space = calloc (1, sizeof(struct space_t));
self->space->x_dim = 1;
self->space->y_dim = 1;
self->space->z_dim = 1;
switch(self->dimension) {
case 3:
// even in 1D, we must be able to see a grid, so prevent to be 0
if (self->space->z_dim)
self->space->z_dim = model_get_dim_value (self, "z");
case 2:
// even in 1D, we must be able to see a grid, so prevent to be 0
if (self->space->y_dim)
self->space->y_dim = model_get_dim_value (self, "y");
case 1:
// even in 1D, we must be able to see a grid, so prevent to be 0
if (self->space->x_dim)
self->space->x_dim = model_get_dim_value (self, "x");
printlog("x_dim=%d, y_dim=%d, z_dim=%d\n",
self->space->x_dim,
self->space->y_dim,
self->space->z_dim);
break;
default:
printerr ("Invalid dimension value : %d\n", self->dimension);
return false;
}
// Space allocation
self->space->units = calloc (self->space->x_dim
* self->space->y_dim
* self->space->z_dim,
sizeof(struct space_unit_t));
// Multiplicity
self->multiplicity = model_get_multiplicity(self);
printlog("Multiplicity : %d\n", self->multiplicity);
if (!model_get_next_state(self, &state_id)) {
printerr("No valid state to load\n");
return false;
}
// States and initial state
self->states = calloc (1, sizeof(struct state_t));
self->n_states = 1;
memcpy(&self->states[0].id, &state_id, 25);
self->states[0].space = self->space;
printlog("Initial state : %s\n", &self->states[0].id);
// Initial state arrows
self->n_arrows = model_get_state_arrows_count(self, state_id);
self->arrows = calloc (self->n_arrows, sizeof(struct arrow_t));
for (int i = 0; i < self->n_arrows; i++) {
model_get_next_arrow(self,
&self->arrows[i],
&self->states[0].id,
self->dimension);
}
printlog("Loaded %d arrows\n", self->n_arrows);
return true;
}
void model_system_init (struct parameters_t *parameters)
{
struct dirent *modelDirEntry = NULL;
DIR *modelDir = NULL;
char *extensionPosition;
int i;
// Allocate model storage
knownModels = calloc (1, sizeof(struct model_array_t));
// Open model directory
if ((modelDir = opendir (parameters->modelDir)) <= 0) {
printerr ("Could not open %s\n", parameters->modelDir);
}
while ((modelDirEntry = readdir (modelDir)) != NULL) {
if ((extensionPosition = strstr (modelDirEntry->d_name, ".xml"))) {
i = knownModels->size;
// Creating model
knownModels->models = reallocarray (knownModels->models,
++knownModels->size,
sizeof(struct model_t));
// Allocate filename with trailing '\0'
knownModels->models[i].filename =
calloc (1, strlen (parameters->modelDir)
+ sizeof((char)'/')
+ strlen (modelDirEntry->d_name)
+ sizeof((char)'\0'));
memcpy (knownModels->models[i].filename,
parameters->modelDir,
strlen (parameters->modelDir));
knownModels->models[i].filename[
strlen (parameters->modelDir)] = '/';
memcpy (knownModels->models[i].filename
+ strlen (parameters->modelDir)
+ sizeof((char)'/'),
modelDirEntry->d_name,
strlen (modelDirEntry->d_name));
// Ask to parse the new model
if (model_load (&knownModels->models[i]))
// XXX Check model is valid and/or parsed
printlog ("Loaded %s\n", knownModels->models[i].filename);
}
}
free(modelDir);
}

View File

@ -102,7 +102,7 @@ int sched_start (struct scheduler_t *self, struct parameters_t *parameters)
int returnValue; int returnValue;
self->id = sched_new_id(); self->id = sched_new_id();
printlog("Scheduler initialized with %d threads\n", printlog("Scheduler %d initialized with %d threads\n",
self->id, self->id,
n_threads); n_threads);