#include <float.h>
#include <stdlib.h>
#include <stdio.h>
+#include <string.h>
#include <unistd.h>
#include "sync_chain.h"
#include "event_analysis_chull.h"
-#ifndef g_info
-#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
-#endif
-
-
typedef enum
{
LOWER,
message);
static GArray* finalizeAnalysisCHull(SyncState* const syncState);
static void printAnalysisStatsCHull(SyncState* const syncState);
-static void writeAnalysisGraphsPlotsCHull(FILE* stream, SyncState* const
- syncState, const unsigned int i, const unsigned int j);
+static void writeAnalysisGraphsPlotsCHull(SyncState* const syncState, const
+ unsigned int i, const unsigned int j);
// Functions specific to this module
static void registerAnalysisCHull() __attribute__((constructor (101)));
const p3) __attribute__((pure));
static double crossProductK(const Point const* p1, const Point const* p2,
const Point const* p3, const Point const* p4) __attribute__((pure));
-static FactorsCHull** calculateAllFactors(SyncState* const syncState);
static Factors* calculateFactorsExact(GQueue* const cu, GQueue* const cl, const
LineType lineType) __attribute__((pure));
-static void calculateFactorsMiddle(FactorsCHull* factors);
static void calculateFactorsFallback(GQueue* const cr, GQueue* const cs,
FactorsCHull* const result);
static double slope(const Point* const p1, const Point* const p2)
__attribute__((pure));
static GArray* reduceFactors(SyncState* const syncState, FactorsCHull**
allFactors);
-static void freeAllFactors(const SyncState* const syncState, FactorsCHull**
- const allFactors);
static double verticalDistance(Point* p1, Point* p2, Point* const point)
__attribute__((pure));
static void floydWarshall(SyncState* const syncState, FactorsCHull** const
.initAnalysis= &initAnalysisCHull,
.destroyAnalysis= &destroyAnalysisCHull,
.analyzeMessage= &analyzeMessageCHull,
- .analyzeExchange= NULL,
- .analyzeBroadcast= NULL,
.finalizeAnalysis= &finalizeAnalysisCHull,
.printAnalysisStats= &printAnalysisStatsCHull,
- .writeAnalysisGraphsPlots= &writeAnalysisGraphsPlotsCHull,
- .writeAnalysisGraphsOptions= NULL,
+ .graphFunctions= {
+ .writeTraceTraceForePlots= &writeAnalysisGraphsPlotsCHull,
+ }
+};
+
+const char* const approxNames[]= {
+ [EXACT]= "Exact",
+ [MIDDLE]= "Middle",
+ [FALLBACK]= "Fallback",
+ [INCOMPLETE]= "Incomplete",
+ [ABSENT]= "Absent",
+ [SCREWED]= "Screwed",
};
analysisData->stats->allFactors= NULL;
}
- if (syncState->graphs)
+ if (syncState->graphsStream)
{
analysisData->graphsData= malloc(sizeof(AnalysisGraphsDataCHull));
openGraphFiles(syncState);
analysisData= (AnalysisDataCHull*) syncState->analysisData;
- cwd= changeToGraphDir(syncState->graphs);
+ cwd= changeToGraphsDir(syncState->graphsDir);
analysisData->graphsData->hullPoints= malloc(syncState->traceNb *
sizeof(FILE**));
{
if (analysisData->stats->allFactors != NULL)
{
- freeAllFactors(syncState, analysisData->stats->allFactors);
+ freeAllFactors(syncState->traceNb, analysisData->stats->allFactors);
}
free(analysisData->stats);
}
- if (syncState->graphs)
+ if (syncState->graphsStream)
{
if (analysisData->graphsData->hullPoints != NULL)
{
if (!syncState->stats && analysisData->graphsData->allFactors != NULL)
{
- freeAllFactors(syncState, analysisData->graphsData->allFactors);
+ freeAllFactors(syncState->traceNb, analysisData->graphsData->allFactors);
}
free(analysisData->graphsData);
analysisData= (AnalysisDataCHull*) syncState->analysisData;
- if (syncState->graphs)
+ if (syncState->graphsStream && analysisData->graphsData->hullPoints != NULL)
{
writeGraphFiles(syncState);
closeGraphFiles(syncState);
factors= reduceFactors(syncState, allFactors);
- if (syncState->stats || syncState->graphs)
+ if (syncState->stats || syncState->graphsStream)
{
if (syncState->stats)
{
analysisData->stats->allFactors= allFactors;
}
- if (syncState->graphs)
+ if (syncState->graphsStream)
{
analysisData->graphsData->allFactors= allFactors;
}
}
else
{
- freeAllFactors(syncState, allFactors);
+ freeAllFactors(syncState->traceNb, allFactors);
}
return factors;
FactorsCHull* factorsCHull;
factorsCHull= &analysisData->stats->allFactors[j][i];
- printf("\t\t%3d - %-3d: ", i, j);
+ printf("\t\t%3d - %-3d: %s", i, j,
+ approxNames[factorsCHull->type]);
if (factorsCHull->type == EXACT)
{
- printf("Exact a0= % 7g a1= 1 %c %7g\n",
+ printf(" a0= % 7g a1= 1 %c %7g\n",
factorsCHull->approx->offset,
factorsCHull->approx->drift < 0. ? '-' : '+',
fabs(factorsCHull->approx->drift));
}
else if (factorsCHull->type == MIDDLE)
{
- printf("Middle a0= % 7g a1= 1 %c %7g accuracy %7g\n",
+ printf(" a0= % 7g a1= 1 %c %7g accuracy %7g\n",
factorsCHull->approx->offset, factorsCHull->approx->drift
- 1. < 0. ? '-' : '+', fabs(factorsCHull->approx->drift -
1.), factorsCHull->accuracy);
}
else if (factorsCHull->type == FALLBACK)
{
- printf("Fallback a0= % 7g a1= 1 %c %7g error= %7g\n",
+ printf(" a0= % 7g a1= 1 %c %7g error= %7g\n",
factorsCHull->approx->offset, factorsCHull->approx->drift
- 1. < 0. ? '-' : '+', fabs(factorsCHull->approx->drift -
1.), factorsCHull->accuracy);
}
else if (factorsCHull->type == INCOMPLETE)
{
- printf("Incomplete\n");
+ printf("\n");
if (factorsCHull->min->drift != -INFINITY)
{
}
else if (factorsCHull->type == SCREWED)
{
- printf("Screwed\n");
+ printf("\n");
if (factorsCHull->min != NULL && factorsCHull->min->drift != -INFINITY)
{
}
else if (factorsCHull->type == ABSENT)
{
- printf("Absent\n");
+ printf("\n");
}
else
{
* Free a container of FactorsCHull
*
* Args:
- * syncState: container for synchronization data.
- * allFactors: container of Factors
+ * traceNb: number of traces
+ * allFactors: container of FactorsCHull
*/
-static void freeAllFactors(const SyncState* const syncState, FactorsCHull**
- const allFactors)
+void freeAllFactors(const unsigned int traceNb, FactorsCHull** const
+ allFactors)
{
unsigned int i, j;
- for (i= 0; i < syncState->traceNb; i++)
+ for (i= 0; i < traceNb; i++)
{
for (j= 0; j <= i; j++)
{
- FactorsCHull* factorsCHull;
-
- factorsCHull= &allFactors[i][j];
- if (factorsCHull->type == MIDDLE || factorsCHull->type ==
- INCOMPLETE || factorsCHull->type == ABSENT)
- {
- free(factorsCHull->min);
- free(factorsCHull->max);
- }
- else if (factorsCHull->type == SCREWED)
- {
- if (factorsCHull->min != NULL)
- {
- free(factorsCHull->min);
- }
- if (factorsCHull->max != NULL)
- {
- free(factorsCHull->max);
- }
- }
-
- if (factorsCHull->type == EXACT || factorsCHull->type == MIDDLE ||
- factorsCHull->type == FALLBACK)
- {
- free(factorsCHull->approx);
- }
+ destroyFactorsCHull(&allFactors[i][j]);
}
free(allFactors[i]);
}
}
+/*
+ * Free a FactorsCHull
+ *
+ * Args:
+ * factorsCHull: container of Factors
+ */
+void destroyFactorsCHull(FactorsCHull* factorsCHull)
+{
+ if (factorsCHull->type == MIDDLE || factorsCHull->type ==
+ INCOMPLETE || factorsCHull->type == ABSENT)
+ {
+ free(factorsCHull->min);
+ free(factorsCHull->max);
+ }
+ else if (factorsCHull->type == SCREWED)
+ {
+ if (factorsCHull->min != NULL)
+ {
+ free(factorsCHull->min);
+ }
+ if (factorsCHull->max != NULL)
+ {
+ free(factorsCHull->max);
+ }
+ }
+
+ if (factorsCHull->type == EXACT || factorsCHull->type == MIDDLE ||
+ factorsCHull->type == FALLBACK)
+ {
+ free(factorsCHull->approx);
+ }
+}
+
+
/*
* Analyze the convex hulls to determine the synchronization factors between
* each pair of trace.
* FactorsCHull*[TraceNum][TraceNum] array. See the documentation for the
* member allFactors of AnalysisStatsCHull.
*/
-static FactorsCHull** calculateAllFactors(SyncState* const syncState)
+FactorsCHull** calculateAllFactors(SyncState* const syncState)
{
unsigned int traceNumA, traceNumB;
FactorsCHull** allFactors;
* Args:
* factors: contains the min and max limits, used to store the result
*/
-static void calculateFactorsMiddle(FactorsCHull* factors)
+void calculateFactorsMiddle(FactorsCHull* const factors)
{
double amin, amax, bmin, bmax, bhat;
* 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
* j: second trace number, garanteed to be larger than i
*/
-void writeAnalysisGraphsPlotsCHull(FILE* stream, SyncState* const syncState,
- const unsigned int i, const unsigned int j)
+void writeAnalysisGraphsPlotsCHull(SyncState* const syncState, const unsigned
+ int i, const unsigned int j)
{
AnalysisDataCHull* analysisData;
FactorsCHull* factorsCHull;
analysisData= (AnalysisDataCHull*) syncState->analysisData;
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t\"analysis_chull-%1$03d_to_%2$03d.data\" "
"title \"Lower half-hull\" with linespoints "
"linecolor rgb \"#015a01\" linetype 4 pointtype 8 pointsize 0.8, \\\n"
factorsCHull= &analysisData->graphsData->allFactors[j][i];
if (factorsCHull->type == EXACT)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%7g + %7g * x "
"title \"Exact conversion\" with lines "
"linecolor rgb \"black\" linetype 1, \\\n",
}
else if (factorsCHull->type == MIDDLE)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Min conversion\" with lines "
"linecolor rgb \"black\" linetype 5, \\\n",
factorsCHull->min->offset, factorsCHull->min->drift);
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Max conversion\" with lines "
"linecolor rgb \"black\" linetype 8, \\\n",
factorsCHull->max->offset, factorsCHull->max->drift);
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Middle conversion\" with lines "
- "linecolor rgb \"gray60\" linetype 1, \\\n",
+ "linecolor rgb \"black\" linetype 1, \\\n",
factorsCHull->approx->offset, factorsCHull->approx->drift);
}
else if (factorsCHull->type == FALLBACK)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Fallback conversion\" with lines "
"linecolor rgb \"gray60\" linetype 1, \\\n",
{
if (factorsCHull->min->drift != -INFINITY)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Min conversion\" with lines "
"linecolor rgb \"black\" linetype 5, \\\n",
if (factorsCHull->max->drift != INFINITY)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Max conversion\" with lines "
"linecolor rgb \"black\" linetype 8, \\\n",
{
if (factorsCHull->min != NULL && factorsCHull->min->drift != -INFINITY)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Min conversion\" with lines "
"linecolor rgb \"black\" linetype 5, \\\n",
if (factorsCHull->max != NULL && factorsCHull->max->drift != INFINITY)
{
- fprintf(stream,
+ fprintf(syncState->graphsStream,
"\t%.2f + %.10f * x "
"title \"Max conversion\" with lines "
"linecolor rgb \"black\" linetype 8, \\\n",