#include "event_analysis_linreg.h"
-#ifndef g_info
-#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
-#endif
-
-
// Functions common to all analysis modules
static void initAnalysisLinReg(SyncState* const syncState);
static void destroyAnalysisLinReg(SyncState* const syncState);
-static void analyzeExchangeLinReg(SyncState* const syncState, Packet* const packet);
+static void analyzeExchangeLinReg(SyncState* const syncState, Exchange* const exchange);
static GArray* finalizeAnalysisLinReg(SyncState* const syncState);
static void printAnalysisStatsLinReg(SyncState* const syncState);
-static void writeAnalysisGraphsPlotsLinReg(FILE* stream, SyncState* const
- syncState, const unsigned int i, const unsigned int j);
+static void writeAnalysisGraphsPlotsLinReg(SyncState* const syncState, const
+ unsigned int i, const unsigned int j);
// Functions specific to this module
static void registerAnalysisLinReg() __attribute__((constructor (102)));
.name= "linreg",
.initAnalysis= &initAnalysisLinReg,
.destroyAnalysis= &destroyAnalysisLinReg,
- .analyzePacket= NULL,
.analyzeExchange= &analyzeExchangeLinReg,
.finalizeAnalysis= &finalizeAnalysisLinReg,
.printAnalysisStats= &printAnalysisStatsLinReg,
- .writeAnalysisGraphsPlots= &writeAnalysisGraphsPlotsLinReg,
- .writeAnalysisGraphsOptions= NULL,
+ .graphFunctions= {
+ .writeTraceTraceForePlots= &writeAnalysisGraphsPlotsLinReg,
+ }
};
/*
* Perform analysis on a series of event pairs.
*
- * If one event pair is a packet, an exchange is composed of at least two
- * packets, one in each direction. There should be a non-negative minimum
- * "round trip time" (RTT) between the first and last event of the exchange.
- * This RTT should be as small as possible so these packets should be closely
- * related in time like a data packet and an acknowledgement packet. If the
- * events analyzed are such that the minimum RTT can be zero, there's nothing
- * gained in analyzing exchanges beyond what can already be figured out by
- * analyzing packets.
- *
- * An exchange can also consist of more than two packets, in case one packet
- * single handedly acknowledges many data packets.
- *
* Args:
* syncState container for synchronization data
- * packet structure containing the many events
+ * exchange structure containing the many events
*/
-static void analyzeExchangeLinReg(SyncState* const syncState, Packet* const packet)
+static void analyzeExchangeLinReg(SyncState* const syncState, Exchange* const exchange)
{
unsigned int ni, nj;
double dji, eji;
double timoy;
Fit* fit;
- Packet* ackedPacket;
+ Message* ackedMessage;
AnalysisDataLinReg* analysisData;
- g_debug("Synchronization calculation, ");
- g_debug("%d acked packets - using last one, ",
- g_queue_get_length(packet->acks));
+ g_debug("Synchronization calculation, "
+ "%d acked packets - using last one,",
+ g_queue_get_length(exchange->acks));
analysisData= (AnalysisDataLinReg*) syncState->analysisData;
- ackedPacket= g_queue_peek_tail(packet->acks);
+ ackedMessage= g_queue_peek_tail(exchange->acks);
// Calculate the intermediate values for the
// least-squares analysis
- dji= ((double) ackedPacket->inE->tsc - (double) ackedPacket->outE->tsc +
- (double) packet->outE->tsc - (double) packet->inE->tsc) / 2;
- eji= fabs((double) ackedPacket->inE->tsc - (double) ackedPacket->outE->tsc
- - (double) packet->outE->tsc + (double) packet->inE->tsc) / 2;
- timoy= ((double) ackedPacket->outE->tsc + (double) packet->inE->tsc) / 2;
- ni= ackedPacket->outE->traceNum;
- nj= ackedPacket->inE->traceNum;
+ dji= ((double) ackedMessage->inE->cpuTime - (double) ackedMessage->outE->cpuTime
+ + (double) exchange->message->outE->cpuTime - (double)
+ exchange->message->inE->cpuTime) / 2;
+ eji= fabs((double) ackedMessage->inE->cpuTime - (double)
+ ackedMessage->outE->cpuTime - (double) exchange->message->outE->cpuTime +
+ (double) exchange->message->inE->cpuTime) / 2;
+ timoy= ((double) ackedMessage->outE->cpuTime + (double)
+ exchange->message->inE->cpuTime) / 2;
+ ni= ackedMessage->outE->traceNum;
+ nj= ackedMessage->inE->traceNum;
fit= &analysisData->fitArray[nj][ni];
fit->n++;
pow(fit->sd, 2) * fit->st2 - 2 * fit->st * fit->sd
* fit->std) / delta) / (fit->n - 2));
- g_debug("[i= %u j= %u]\n", i, j);
- g_debug("n= %d st= %g st2= %g sd= %g sd2= %g std= %g\n",
+ g_debug("[i= %u j= %u]", i, j);
+ g_debug("n= %d st= %g st2= %g sd= %g sd2= %g std= %g",
fit->n, fit->st, fit->st2, fit->sd, fit->sd2, fit->std);
- g_debug("xij= %g d0ij= %g e= %g\n", fit->x, fit->d0, fit->e);
- g_debug("(xji= %g d0ji= %g)\n", -fit->x / (1 + fit->x),
+ g_debug("xij= %g d0ij= %g e= %g", fit->x, fit->d0, fit->e);
+ g_debug("(xji= %g d0ji= %g)", -fit->x / (1 + fit->x),
-fit->d0 / (1 + fit->x));
}
}
GList* result;
// Perform shortest path search
- g_debug("shortest path trace %d\ndistances: ", i);
+ g_debug("shortest path trace %d, distances: ", i);
shortestPath(analysisData->fitArray, i, syncState->traceNb, distances,
previousVertex);
{
g_debug("%g, ", distances[j]);
}
- g_debug("\npreviousVertex: ");
+ g_debug("previousVertex: ");
for (j= 0; j < syncState->traceNb; j++)
{
g_debug("%u, ", previousVertex[j]);
}
- g_debug("\n");
// Group in graphs nodes that have exchanges
errorSum= sumDistances(distances, syncState->traceNb);
{
Graph* graph;
- g_debug("found graph\n");
+ g_debug("found graph");
graph= (Graph*) result->data;
if (errorSum < graph->errorSum)
{
- g_debug("adding to graph\n");
+ g_debug("adding to graph");
graph->errorSum= errorSum;
free(graph->previousVertex);
graph->previousVertex= previousVertex;
{
Graph* newGraph;
- g_debug("creating new graph\n");
+ g_debug("creating new graph");
newGraph= malloc(sizeof(Graph));
newGraph->errorSum= errorSum;
newGraph->previousVertex= previousVertex;
visited[i]= false;
fit= &fitArray[traceNum][i];
- g_debug("fitArray[traceNum= %u][i= %u]->n = %u\n", traceNum, i, fit->n);
+ g_debug("fitArray[traceNum= %u][i= %u]->n = %u", traceNum, i, fit->n);
if (fit->n > 0)
{
distances[i]= fit->e;
{
g_debug("(%d, %u, %g), ", visited[j], previousVertex[j], distances[j]);
}
- g_debug("\n");
for (i= 0; i < traceNb - 2; i++)
{
}
}
- g_debug("v= %u dvMin= %g\n", v, dvMin);
+ g_debug("v= %u dvMin= %g", v, dvMin);
if (dvMin != INFINITY)
{
{
g_debug("(%d, %u, %g), ", visited[j], previousVertex[j], distances[j]);
}
- g_debug("\n");
}
free(visited);
* Write the analysis-specific graph lines in the gnuplot script.
*
* Args:
- * stream: stream where to write the data
* syncState: container for synchronization data
* i: first trace number, on the x axis
* j: second trace number, garanteed to be larger than i
*/
-void writeAnalysisGraphsPlotsLinReg(FILE* stream, SyncState* const syncState,
- const unsigned int i, const unsigned int j)
+void writeAnalysisGraphsPlotsLinReg(SyncState* const syncState, const unsigned
+ int i, const unsigned int j)
{
AnalysisDataLinReg* analysisData;
Fit* fit;
analysisData= (AnalysisDataLinReg*) syncState->analysisData;
fit= &analysisData->fitArray[j][i];
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%7g + %7g * x "
"title \"Linreg conversion\" with lines "
"linecolor rgb \"gray60\" linetype 1, \\\n",