-/* Copyright (c) 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2009, 2010, 2011. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
#include <pcre.h> /* regular expression library */
+
+#include "simgrid/platf_interface.h" // platform creation API internal interface
+
#include "surf_routing_private.h"
#include "surf/surf_routing.h"
#include "surf/surfxml_parse_values.h"
static void routing_parse_Srandom(void); /* random bypass */
static void routing_parse_Erandom(void); /* random bypass */
-static void routing_parse_Sconfig(void); /* config Tag */
-static void routing_parse_Econfig(void); /* config Tag */
-
static char* replace_random_parameter(char * chaine);
static void clean_routing_after_parse(void);
/*
* \brief Add a host to the network element list from XML
*/
-static void parse_S_host_XML(void)
+static void parse_S_host_XML(sg_platf_host_cbarg_t h)
{
-// XBT_INFO("parse_S_host_XML");
-// XBT_INFO("'%s' '%s'",struct_host->V_host_id, struct_host->V_host_coord);
- parse_S_host(struct_host->V_host_id, struct_host->V_host_coord);
+ parse_S_host(h->V_host_id, h->V_host_coord);
}
static void parse_E_host_XML(void)
{
/**
* \brief Add a "router" to the network element list
*/
-static void parse_S_router(void)
+static void parse_S_router(sg_platf_router_cbarg_t router)
{
network_element_info_t info = NULL;
if (current_routing->hierarchy == SURF_ROUTING_NULL)
current_routing->hierarchy = SURF_ROUTING_BASE;
- xbt_assert(!xbt_lib_get_or_null(as_router_lib,struct_router->V_router_id, ROUTING_ASR_LEVEL),
+ xbt_assert(!xbt_lib_get_or_null(as_router_lib,router->V_router_id, ROUTING_ASR_LEVEL),
"Reading a router, processing unit \"%s\" already exists",
- struct_router->V_router_id);
+ router->V_router_id);
xbt_assert(current_routing->set_processing_unit,
"no defined method \"set_processing_unit\" in \"%s\"",
current_routing->name);
(*(current_routing->set_processing_unit)) (current_routing,
- struct_router->V_router_id);
+ router->V_router_id);
info = xbt_new0(s_network_element_info_t, 1);
info->rc_component = current_routing;
info->rc_type = SURF_NETWORK_ELEMENT_ROUTER;
- xbt_lib_set(as_router_lib,struct_router->V_router_id,ROUTING_ASR_LEVEL,(void *) info);
+ xbt_lib_set(as_router_lib,router->V_router_id,ROUTING_ASR_LEVEL,(void *) info);
if (strcmp(A_surfxml_router_coordinates,"")) {
if(!COORD_ASR_LEVEL) xbt_die("To use coordinates, you must set configuration 'coordinates' to 'yes'");
xbt_dynar_t ctn = xbt_str_split_str(A_surfxml_router_coordinates, " ");
xbt_dynar_shrink(ctn, 0);
- xbt_lib_set(as_router_lib,struct_router->V_router_id,COORD_ASR_LEVEL,(void *) ctn);
+ xbt_lib_set(as_router_lib,router->V_router_id,COORD_ASR_LEVEL,(void *) ctn);
}
}
/**
* brief Add a "router" to the network element list from XML description
*/
-static void parse_S_router_XML(void)
-{
- return parse_S_router();
-}
-
-/**
- * brief Add a "router" to the network element list from XML description
- */
-static void parse_S_router_lua(const char* router_id)
-{
- struct_router->V_router_id = xbt_strdup(router_id);
- struct_router->V_router_coord = xbt_strdup("");
- return parse_S_router();
+static void parse_S_router_lua(const char* router_id) {
+ s_sg_platf_router_cbarg_t router;
+ memset(&router,0,sizeof(router));
+ router.V_router_id = router_id;
+ router.V_router_coord = "";
+ return parse_S_router(&router);
}
/**
}
/**
- * \brief Make a new routing component
+ * \brief Make a new routing component to the platform
+ *
+ * Add a new autonomous system to the platform. Any elements (such as host,
+ * router or sub-AS) added after this call and before the corresponding call
+ * to sg_platf_new_AS_close() will be added to this AS.
+ *
+ * Once this function was called, the configuration concerning the used
+ * models cannot be changed anymore.
*
- * make the new structure and
- * set the parsing functions to allows parsing the part of the routing tree
+ * @param AS_id name of this autonomous system. Must be uniq in the platform
+ * @param wanted_routing_type one of Full, Floyd, Dijkstra or similar. Full list in the variable routing_models, in src/surf/surf_routing.c
*/
-void routing_AS_init(const char *AS_id, const char *wanted_routing_type)
+void sg_platf_new_AS_open(const char *AS_id, const char *wanted_routing_type)
{
routing_component_t new_routing;
model_type_t model = NULL;
int cpt;
+
+ surf_parse_models_setup(); /* ensure that the models are created after the last <config> tag and before the first <AS>-like */
+
/* search the routing model */
for (cpt = 0; routing_models[cpt].name; cpt++)
if (!strcmp(wanted_routing_type, routing_models[cpt].name))
current_routing = new_routing;
}
-/*
- * Detect the routing model type of the routing component from XML platforms
- */
-static void parse_S_AS(void)
-{
- routing_AS_init(A_surfxml_AS_id, A_surfxml_AS_routing);
-}
-
-
/**
- * \brief Finish the creation of a new routing component
+ * \brief Specify that the current description of AS is finished
+ *
+ * Once you've declared all the content of your AS, you have to close
+ * it with this call. Your AS is not usable until you call this function.
+ *
+ * @fixme: this call is not as robust as wanted: bad things WILL happen
+ * if you call it twice for the same AS, or if you forget calling it, or
+ * even if you add stuff to a closed AS
*
- * When you finish to read the routing component, other structures must be created.
- * the "end" method allow to do that for any routing model type
*/
-void routing_AS_end(const char *AS_id)
-{
+void sg_platf_new_AS_close() {
if (current_routing == NULL) {
- THROWF(arg_error, 0, "Close AS(%s), that were never opened", AS_id);
+ THROWF(arg_error, 0, "Close an AS, but none was under construction");
} else {
network_element_info_t info = NULL;
xbt_assert(!xbt_lib_get_or_null(as_router_lib,current_routing->name, ROUTING_ASR_LEVEL),
}
}
-/*
- * \brief Finish the creation of a new routing component from XML
- */
-static void parse_E_AS(void)
-{
- routing_AS_end(A_surfxml_AS_id);
-}
-
/* Aux Business methods */
/**
current_routing = NULL;
/* parse generic elements */
- surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML);
+ sg_platf_host_add_cb(parse_S_host_XML);
surfxml_add_callback(ETag_surfxml_host_cb_list, &parse_E_host_XML);
- surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router_XML);
+ sg_platf_router_add_cb(parse_S_router);
surfxml_add_callback(STag_surfxml_route_cb_list,
&parse_S_route_new_and_endpoints_XML);
surfxml_add_callback(ETag_surfxml_bypassRoute_cb_list,
&parse_E_bypassRoute_store_route);
- surfxml_add_callback(STag_surfxml_AS_cb_list, &parse_S_AS);
- surfxml_add_callback(ETag_surfxml_AS_cb_list, &parse_E_AS);
-
surfxml_add_callback(STag_surfxml_cluster_cb_list,
&routing_parse_Scluster);
void surf_parse_add_callback_config(void)
{
- surfxml_add_callback(STag_surfxml_config_cb_list, &routing_parse_Sconfig);
- surfxml_add_callback(ETag_surfxml_config_cb_list, &routing_parse_Econfig);
surfxml_add_callback(STag_surfxml_prop_cb_list, &parse_properties_XML);
surfxml_add_callback(STag_surfxml_random_cb_list, &routing_parse_Srandom);
}
src,dst,src_as->name, dst_as->name,rc->name);
}
-static void routing_parse_Sconfig(void)
-{
- XBT_DEBUG("START configuration name = %s",A_surfxml_config_id);
-}
-
-static void routing_parse_Econfig(void)
-{
- xbt_dict_cursor_t cursor = NULL;
- char *key;
- char *elem;
- char *cfg;
- xbt_dict_foreach(current_property_set, cursor, key, elem) {
- cfg = bprintf("%s:%s",key,elem);
- if(xbt_cfg_is_default_value(_surf_cfg_set, key))
- xbt_cfg_set_parse(_surf_cfg_set, cfg);
- else
- XBT_INFO("The custom configuration '%s' is already defined by user!",key);
- free(cfg);
- }
- XBT_DEBUG("End configuration name = %s",A_surfxml_config_id);
-}
-
-static void parse_create_host_link(int i)
-{
- char *host_id, *link_id = NULL;
-
- host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, i, struct_cluster->V_cluster_suffix);
- link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, i);
-
- A_surfxml_host_state = A_surfxml_host_state_ON;
-
- XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->S_cluster_power);
- struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1);
- struct_host->V_host_id = xbt_strdup(host_id);
- if(strcmp(struct_cluster->V_cluster_availability_file,"")){
- xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free);
- char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file);
- xbt_str_varsubst(tmp_availability_file,patterns);
- XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file);
- struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file);
- xbt_free(tmp_availability_file);
- }
- else
- {
- XBT_DEBUG("\tavailability_file=\"\"");
- }
- if(strcmp(struct_cluster->V_cluster_state_file,"")){
- char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file);
- xbt_str_varsubst(tmp_state_file,patterns);
- XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file);
- struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file);
- xbt_free(tmp_state_file);
- }
- else
- {
- XBT_DEBUG("\tstate_file=\"\"");
- }
-
- struct_host->V_host_power_peak = struct_cluster->S_cluster_power;
- struct_host->V_host_power_scale = 1.0;
- struct_host->V_host_core = struct_cluster->S_cluster_core;
- struct_host->V_host_state_initial = SURF_RESOURCE_ON;
- struct_host->V_host_coord = "";
- surf_parse_host();
- XBT_DEBUG("</host>");
-
- A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
- if(AX_surfxml_cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
- {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FULLDUPLEX;}
- if(AX_surfxml_cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE)
- {A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_FATPIPE;}
-
- XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,struct_cluster->S_cluster_bw, struct_cluster->S_cluster_lat);
-
- struct_lnk = xbt_new0(s_surf_parsing_link_arg_t, 1);
- struct_lnk->V_link_id = xbt_strdup(link_id);
- struct_lnk->V_link_bandwidth = struct_cluster->S_cluster_bw;
- struct_lnk->V_link_latency = struct_cluster->S_cluster_lat;
- struct_lnk->V_link_bandwidth_file = NULL;
- struct_lnk->V_link_latency_file = NULL;
- struct_lnk->V_link_state_file = NULL;
- struct_lnk->V_link_state = SURF_RESOURCE_ON;
- struct_lnk->V_link_sharing_policy = A_surfxml_link_sharing_policy;
-
- if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_SHARED)
- struct_lnk->V_policy_initial_link = SURF_LINK_SHARED;
- else
- {
- if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FATPIPE)
- struct_lnk->V_policy_initial_link = SURF_LINK_FATPIPE;
- else if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX)
- struct_lnk->V_policy_initial_link = SURF_LINK_FULLDUPLEX;
- }
- surf_parse_link();
-
- ETag_surfxml_host();
- ETag_surfxml_link();
-
- surf_parsing_link_up_down_t info = xbt_new0(s_surf_parsing_link_up_down_t, 1);
-
- if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX){
- char* tmp_link = bprintf("%s_UP",link_id);
- info->link_up = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
- free(tmp_link);
- tmp_link = bprintf("%s_DOWN",link_id);
- info->link_down = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
- free(tmp_link);
- }
- else{
- info->link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
- info->link_down = info->link_up;
- }
- xbt_dict_set(cluster_host_link,host_id,info,xbt_free);
- xbt_free(link_id);
- xbt_free(host_id);
-}
-
void routing_parse_Scluster(void)
{
if(!cluster_host_link)
static int AX_ptr = 0;
char *host_id, *groups, *link_id = NULL;
+ s_sg_platf_host_cbarg_t host;
+
if( strcmp(struct_cluster->V_cluster_availability_file,"")
|| strcmp(struct_cluster->V_cluster_state_file,"") )
{
//Make all hosts
radical_elements = xbt_str_split(struct_cluster->V_cluster_radical, ",");
xbt_dynar_foreach(radical_elements, iter, groups) {
+ memset(&host,0,sizeof(host));
+
radical_ends = xbt_str_split(groups, "-");
switch (xbt_dynar_length(radical_ends)) {
case 1:
- surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *));
+ start=surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, start, struct_cluster->V_cluster_suffix);
link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, start);
XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->S_cluster_power);
- struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1);
- struct_host->V_host_id = host_id;
+ host.V_host_id = host_id;
if(strcmp(struct_cluster->V_cluster_availability_file,"")){
xbt_dict_set(patterns, "radical", bprintf("%d", start), xbt_free);
char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file);
xbt_str_varsubst(tmp_availability_file,patterns);
XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file);
- struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file);
+ host.V_host_power_trace = tmgr_trace_new(tmp_availability_file);
xbt_free(tmp_availability_file);
}
else
char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file);
xbt_str_varsubst(tmp_state_file,patterns);
XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file);
- struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file);
+ host.V_host_state_trace = tmgr_trace_new(tmp_state_file);
xbt_free(tmp_state_file);
}
else
XBT_DEBUG("\tstate_file=\"\"");
}
- struct_host->V_host_power_peak = struct_cluster->S_cluster_power;
- struct_host->V_host_power_scale = 1.0;
- struct_host->V_host_core = struct_cluster->S_cluster_core;
- struct_host->V_host_state_initial = SURF_RESOURCE_ON;
- struct_host->V_host_coord = "";
- surf_parse_host();
+ host.V_host_power_peak = struct_cluster->S_cluster_power;
+ host.V_host_power_scale = 1.0;
+ host.V_host_core = struct_cluster->S_cluster_core;
+ host.V_host_state_initial = SURF_RESOURCE_ON;
+ host.V_host_coord = "";
+ sg_platf_new_host(&host);
XBT_DEBUG("</host>");
A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,struct_cluster->S_cluster_bw, struct_cluster->S_cluster_lat);
struct_lnk = xbt_new0(s_surf_parsing_link_arg_t, 1);
- struct_lnk->V_link_id = link_id;
+ struct_lnk->V_link_id = xbt_strdup(link_id);
struct_lnk->V_link_bandwidth = struct_cluster->S_cluster_bw;
struct_lnk->V_link_latency = struct_cluster->S_cluster_lat;
struct_lnk->V_link_bandwidth_file = NULL;
}
surf_parse_link();
- xbt_dict_set(cluster_host_link,host_id,strdup(link_id),free);
-// XBT_INFO("key '%s' Value '%s'",host_id,link_id);
ETag_surfxml_host();
ETag_surfxml_link();
+ surf_parsing_link_up_down_t info = xbt_new0(s_surf_parsing_link_up_down_t, 1);
+ if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX){
+ char* tmp_link = bprintf("%s_UP",link_id);
+ info->link_up = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ free(tmp_link);
+ tmp_link = bprintf("%s_DOWN",link_id);
+ info->link_down = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ free(tmp_link);
+ }
+ else{
+ info->link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+ info->link_down = info->link_up;
+ }
+ xbt_dict_set(cluster_host_link,host_id,info,xbt_free);
+ xbt_free(link_id);
+ xbt_free(host_id);
+
break;
case 2:
- surf_parse_get_int(&start,
- xbt_dynar_get_as(radical_ends, 0, char *));
- surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *));
+ start=surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
+ end= surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
for (i = start; i <= end; i++) {
host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, i, struct_cluster->V_cluster_suffix);
link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, i);
A_surfxml_host_state = A_surfxml_host_state_ON;
XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->S_cluster_power);
- struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1);
- struct_host->V_host_id = host_id;
+ host.V_host_id = host_id;
if(strcmp(struct_cluster->V_cluster_availability_file,"")){
xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free);
char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file);
xbt_str_varsubst(tmp_availability_file,patterns);
XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file);
- struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file);
+ host.V_host_power_trace = tmgr_trace_new(tmp_availability_file);
xbt_free(tmp_availability_file);
}
else
char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file);
xbt_str_varsubst(tmp_state_file,patterns);
XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file);
- struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file);
+ host.V_host_state_trace = tmgr_trace_new(tmp_state_file);
xbt_free(tmp_state_file);
}
else
XBT_DEBUG("\tstate_file=\"\"");
}
- struct_host->V_host_power_peak = struct_cluster->S_cluster_power;
- struct_host->V_host_power_scale = 1.0;
- struct_host->V_host_core = struct_cluster->S_cluster_core;
- struct_host->V_host_state_initial = SURF_RESOURCE_ON;
- struct_host->V_host_coord = "";
- surf_parse_host();
+ host.V_host_power_peak = struct_cluster->S_cluster_power;
+ host.V_host_power_scale = 1.0;
+ host.V_host_core = struct_cluster->S_cluster_core;
+ host.V_host_state_initial = SURF_RESOURCE_ON;
+ host.V_host_coord = "";
+ sg_platf_new_host(&host);
XBT_DEBUG("</host>");
A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,struct_cluster->S_cluster_bw, struct_cluster->S_cluster_lat);
struct_lnk = xbt_new0(s_surf_parsing_link_arg_t, 1);
- struct_lnk->V_link_id = link_id;
+ struct_lnk->V_link_id = xbt_strdup(link_id);
struct_lnk->V_link_bandwidth = struct_cluster->S_cluster_bw;
struct_lnk->V_link_latency = struct_cluster->S_cluster_lat;
struct_lnk->V_link_bandwidth_file = NULL;
}
surf_parse_link();
- xbt_dict_set(cluster_host_link,host_id,strdup(link_id),free);
-// XBT_INFO("key '%s' Value '%s'",host_id,link_id);
-
ETag_surfxml_host();
ETag_surfxml_link();
+ surf_parsing_link_up_down_t info = xbt_new0(s_surf_parsing_link_up_down_t, 1);
+ if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX){
+ char* tmp_link = bprintf("%s_UP",link_id);
+ info->link_up = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ free(tmp_link);
+ tmp_link = bprintf("%s_DOWN",link_id);
+ info->link_down = xbt_lib_get_or_null(link_lib, tmp_link, SURF_LINK_LEVEL);
+ free(tmp_link);
+ }
+ else{
+ info->link_up = xbt_lib_get_or_null(link_lib, link_id, SURF_LINK_LEVEL);
+ info->link_down = info->link_up;
+ }
+ xbt_dict_set(cluster_host_link,host_id,info,xbt_free);
+ xbt_free(link_id);
+ xbt_free(host_id);
+
}
break;
char *random_radical = A_surfxml_random_radical;
char *rd_name = NULL;
char *rd_value;
- surf_parse_get_double(&mean,A_surfxml_random_mean);
- surf_parse_get_double(&std,A_surfxml_random_std_deviation);
- surf_parse_get_double(&min,A_surfxml_random_min);
- surf_parse_get_double(&max,A_surfxml_random_max);
- surf_parse_get_double(&seed,A_surfxml_random_seed);
+ mean = surf_parse_get_double(A_surfxml_random_mean);
+ std = surf_parse_get_double(A_surfxml_random_std_deviation);
+ min = surf_parse_get_double(A_surfxml_random_min);
+ max = surf_parse_get_double(A_surfxml_random_max);
+ seed = surf_parse_get_double(A_surfxml_random_seed);
double res = 0;
int i = 0;
xbt_free(tmpbuf);
break;
- case 2: surf_parse_get_int(&start,
- xbt_dynar_get_as(radical_ends, 0, char *));
- surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *));
+ case 2:
+ start = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 0, char *));
+ end = surf_parse_get_int(xbt_dynar_get_as(radical_ends, 1, char *));
for (i = start; i <= end; i++) {
xbt_assert(!xbt_dict_get_or_null(random_value,random_id),"Custom Random '%s' already exists !",bprintf("%s%d",random_id,i));
res = random_generate(random);