double time = 0;
int i = 0;
p_timePoints = (double*) xbt_malloc0(sizeof(double) *
- (xbt_dynar_length(speedTrace->s_list.event_list) + 1));
+ (xbt_dynar_length(speedTrace->event_list) + 1));
p_integral = (double*) xbt_malloc0(sizeof(double) *
- (xbt_dynar_length(speedTrace->s_list.event_list) + 1));
- m_nbPoints = xbt_dynar_length(speedTrace->s_list.event_list) + 1;
- xbt_dynar_foreach(speedTrace->s_list.event_list, cpt, val) {
+ (xbt_dynar_length(speedTrace->event_list) + 1));
+ m_nbPoints = xbt_dynar_length(speedTrace->event_list) + 1;
+ xbt_dynar_foreach(speedTrace->event_list, cpt, val) {
p_timePoints[i] = time;
p_integral[i] = integral;
integral += val.delta * val.value;
reduced_a = a - floor(a / m_lastTime) * m_lastTime;
point = p_trace->binarySearch(p_trace->p_timePoints, reduced_a, 0,
p_trace->m_nbPoints - 1);
- xbt_dynar_get_cpy(p_speedTrace->s_list.event_list, point, &val);
+ xbt_dynar_get_cpy(p_speedTrace->event_list, point, &val);
return val.value;
}
}
/* only one point available, fixed trace */
- if (xbt_dynar_length(speedTrace->s_list.event_list) == 1) {
- xbt_dynar_get_cpy(speedTrace->s_list.event_list, 0, &val);
+ if (xbt_dynar_length(speedTrace->event_list) == 1) {
+ xbt_dynar_get_cpy(speedTrace->event_list, 0, &val);
m_type = TRACE_FIXED;
m_value = val.value;
return;
p_speedTrace = speedTrace;
/* count the total time of trace file */
- xbt_dynar_foreach(speedTrace->s_list.event_list, cpt, val) {
+ xbt_dynar_foreach(speedTrace->event_list, cpt, val) {
total_time += val.delta;
}
p_trace = new CpuTiTrace(speedTrace);
if (stateTrace)
p_stateEvent = future_evt_set->add_trace(stateTrace, 0.0, this);
- if (speedTrace && xbt_dynar_length(speedTrace->s_list.event_list) > 1) {
+ if (speedTrace && xbt_dynar_length(speedTrace->event_list) > 1) {
s_tmgr_event_t val;
// add a fake trace event if periodicity == 0
- xbt_dynar_get_cpy(speedTrace->s_list.event_list,
- xbt_dynar_length(speedTrace->s_list.event_list) - 1, &val);
+ xbt_dynar_get_cpy(speedTrace->event_list,
+ xbt_dynar_length(speedTrace->event_list) - 1, &val);
if (val.delta == 0) {
p_speedEvent =
future_evt_set->add_trace(tmgr_empty_trace_new(), p_availTrace->m_lastTime, this);
p_availTrace = new CpuTiTgmr(trace, m_speedScale);
/* add a fake trace event if periodicity == 0 */
- if (trace && xbt_dynar_length(trace->s_list.event_list) > 1) {
+ if (trace && xbt_dynar_length(trace->event_list) > 1) {
s_tmgr_event_t val;
- xbt_dynar_get_cpy(trace->s_list.event_list,
- xbt_dynar_length(trace->s_list.event_list) - 1, &val);
+ xbt_dynar_get_cpy(trace->event_list,
+ xbt_dynar_length(trace->event_list) - 1, &val);
if (val.delta == 0) {
p_speedEvent = future_evt_set->add_trace(tmgr_empty_trace_new(), 0.0, this);
}
modified(true);
speedTrace = p_availTrace->p_speedTrace;
- xbt_dynar_get_cpy(speedTrace->s_list.event_list,
- xbt_dynar_length(speedTrace->s_list.event_list) - 1, &val);
+ xbt_dynar_get_cpy(speedTrace->event_list,
+ xbt_dynar_length(speedTrace->event_list) - 1, &val);
/* free old trace */
delete p_availTrace;
m_speedScale = val.value;
xbt_heap_free(p_heap);
}
-
+#if 0 /* probabilistic dead code. Should be reimplemented, not killed (please) */
/**
* \brief Create a #tmgr_trace_t from probabilist generators
*
return generator->next_value;
}
+#endif /* probabilistic dead code */
tmgr_trace_t tmgr_trace_new_from_string(const char *id, const char *input,
double periodicity)
"Invalid periodicity %g (must be positive)", periodicity);
trace = xbt_new0(s_tmgr_trace_t, 1);
- trace->type = e_trace_list;
- trace->s_list.event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
+ trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
list = xbt_str_split(input, "\n\r");
s_tmgr_event_t first_event;
first_event.delta=event.delta;
first_event.value=-1.0;
- xbt_dynar_push(trace->s_list.event_list, &first_event);
+ xbt_dynar_push(trace->event_list, &first_event);
}
}
- xbt_dynar_push(trace->s_list.event_list, &event);
- last_event = (tmgr_event_t)xbt_dynar_get_ptr(trace->s_list.event_list, xbt_dynar_length(trace->s_list.event_list) - 1);
+ xbt_dynar_push(trace->event_list, &event);
+ last_event = (tmgr_event_t)xbt_dynar_get_ptr(trace->event_list, xbt_dynar_length(trace->event_list) - 1);
}
if (last_event)
last_event->delta = periodicity;
s_tmgr_event_t event;
trace = xbt_new0(s_tmgr_trace_t, 1);
- trace->type = e_trace_list;
- trace->s_list.event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
+ trace->event_list = xbt_dynar_new(sizeof(s_tmgr_event_t), NULL);
event.delta = 0.0;
event.value = 0.0;
- xbt_dynar_push(trace->s_list.event_list, &event);
+ xbt_dynar_push(trace->event_list, &event);
return trace;
}
if (!trace)
return;
- switch(trace->type) {
- case e_trace_list:
- xbt_dynar_free(&(trace->s_list.event_list));
- break;
- case e_trace_probabilist:
- THROW_UNIMPLEMENTED;
- break;
- }
+ xbt_dynar_free(&(trace->event_list));
free(trace);
}
trace_iterator->idx = 0;
trace_iterator->resource = resource;
- if(trace->type == e_trace_list) {
- xbt_assert((trace_iterator->idx < xbt_dynar_length(trace->s_list.event_list)),
- "You're referring to an event that does not exist!");
- }
+ xbt_assert((trace_iterator->idx < xbt_dynar_length(trace->event_list)),
+ "Your trace should have at least one event!");
xbt_heap_push(p_heap, trace_iterator, start_time);
tmgr_trace_t trace = trace_iterator->trace;
*resource = trace_iterator->resource;
- if (trace->type == e_trace_list) {
-
- tmgr_event_t event = (tmgr_event_t)xbt_dynar_get_ptr(trace->s_list.event_list, trace_iterator->idx);
+ tmgr_event_t event = (tmgr_event_t)xbt_dynar_get_ptr(trace->event_list, trace_iterator->idx);
- *value = event->value;
+ *value = event->value;
- if (trace_iterator->idx < xbt_dynar_length(trace->s_list.event_list) - 1) {
- xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
- trace_iterator->idx++;
- } else if (event->delta > 0) { /* Last element, checking for periodicity */
- xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
- trace_iterator->idx = 1; /* not 0 as the first event is a placeholder to handle when events really start */
- } else { /* We don't need this trace_event anymore */
- trace_iterator->free_me = 1;
- }
-
- } else if (trace->type == e_trace_probabilist) { //FIXME : not tested yet
- double event_delta;
- if(trace->s_probabilist.is_state_trace) {
- *value = (double) trace->s_probabilist.next_event;
- if(trace->s_probabilist.next_event == 0) {
- event_delta = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[0]);
- trace->s_probabilist.next_event = 1;
- } else {
- event_delta = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[1]);
- trace->s_probabilist.next_event = 0;
- }
- } else {
- event_delta = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[0]);
- *value = tmgr_event_generator_next_value(trace->s_probabilist.event_generator[1]);
- }
- xbt_heap_push(p_heap, trace_iterator, event_date + event_delta);
- XBT_DEBUG("Generating a new event at date %f, with value %f", event_date + event_delta, *value);
-
- } else
- THROW_IMPOSSIBLE;
+ if (trace_iterator->idx < xbt_dynar_length(trace->event_list) - 1) {
+ xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
+ trace_iterator->idx++;
+ } else if (event->delta > 0) { /* Last element, checking for periodicity */
+ xbt_heap_push(p_heap, trace_iterator, event_date + event->delta);
+ trace_iterator->idx = 1; /* not 0 as the first event is a placeholder to handle when events really start */
+ } else { /* We don't need this trace_event anymore */
+ trace_iterator->free_me = 1;
+ }
return trace_iterator;
}
} s_probabilist_event_generator_t;
typedef struct tmgr_trace {
- enum e_trace_type type;
- union {
- struct {
- xbt_dynar_t event_list;
- } s_list;
- struct {
- probabilist_event_generator_t event_generator[2];
- int is_state_trace;
- int next_event;
- } s_probabilist;
- };
+ xbt_dynar_t event_list;
} s_tmgr_trace_t;
/* Iterator within a trace */
#ifdef __cplusplus
namespace simgrid {
+/** @brief Modeling of the resource variations, such as those due to an external load
+ *
+ * There is 3 main concepts in this module:
+ * - #trace: a set of dated values, ie a list of pair <timestamp, value>
+ * - #trace_iterator: links a given trace to a given simgrid resource. A Cpu for example has 2 iterators: state (ie, is it ON/OFF) and speed, while a link has 3 iterators: state, bandwidth and latency.
+ * - #future_evt_set: makes it easy to find the next occuring event of all traces
+ */
namespace trace_mgr {
-/* Future Event Set (collection of iterators over the traces)
+/** @brief A trace_iterator links a trace to a resource */
+XBT_PUBLIC_CLASS trace_iterator {
+
+};
+
+/** @brief A trace is a set of timed values, encoding the value that a variable takes at what time *
+ *
+ * It is useful to model dynamic platforms, where an external load that makes the resource availability change over time.
+ * To model that, you have to set several traces per resource: one for the on/off state and one for each numerical value (computational speed, bandwidt and latency).
+ */
+XBT_PUBLIC_CLASS trace {
+public:
+ /** Creates an empty trace */
+ trace() {}
+ virtual ~trace() {}
+};
+
+/** @brief Future Event Set (collection of iterators over the traces)
* That's useful to quickly know which is the next occurring event in a set of traces. */
XBT_PUBLIC_CLASS future_evt_set {
public: