build: fix travis MPI/SMP build
[charm.git] / src / ck-perf / trace-projectionsBOC.h
1 #include "envelope.h"
2 #include "register.h"
3 #include "trace-common.h"
4 #include "ckcallback-ccs.h"
5
6 #include <set>
7
8 #ifndef PROJ_ANALYSIS
9 // NOTE: Needed to handle the automatically-generated method so 
10 //   trace-projections would build correctly while ignoring any of the 
11 //   BOC-based definitions generated by parsing trace-projections.ci.
12 //   Hence, we do not include TraceProjections.decl.h in this version.
13 //
14 //   This version of trace-projections would not permit any form of
15 //   end-of-run operations and NONE of the definitions found in 
16 //   trace-projections.ci would be visible to the rest of the code
17 //   (trace-projections.C), so some care would be needed to ensure 
18 //   PROJ_ANALYSIS encloses the correct code-fragments in 
19 //   trace-projections.C
20 void _registerTraceProjections() {
21   // faked call that does nothing.
22 }
23 #else
24 #include "TraceProjections.decl.h"
25
26 class KMeansStatsMessage : public CMessage_KMeansStatsMessage {
27  public:
28   int numMetrics;
29   int numKPos;
30   int numStats;
31   bool *filter;
32   double *kSeedsPos;
33   double *stats;
34 };
35
36 class KSeedsMessage : public CMessage_KSeedsMessage {
37  public:
38   int numKPos;
39   double *kSeedsPos;
40 };
41
42 class TraceProjectionsInit : public Chare {
43  public:
44   TraceProjectionsInit(CkArgMsg *msg);
45  TraceProjectionsInit(CkMigrateMessage *m):Chare(m) {}
46 };
47
48 class KSelectionMessage : public CMessage_KSelectionMessage {
49  public:
50   int numKMinIDs;
51   int numKMaxIDs;
52   int *minIDs;
53   int *maxIDs;
54 };
55
56 class KMeansBOC : public CBase_KMeansBOC {
57  private:
58   // commandline parameters
59   bool autoCompute;
60   bool usePhases;
61   int numK;
62   int peNumKeep;
63   int numKReported;
64   double entryThreshold;
65
66   // variables for correct data gathering across phases
67   bool markedBegin;
68   bool markedIdle;
69   bool selected;
70   int lastBeginEPIdx;
71   double beginBlockTime;
72   double beginIdleBlockTime;
73   int numSelectionIter;
74
75   int currentPhase;
76   double *currentExecTimes;
77   int lastPhaseIdx;
78
79   // kMeans outlier structures - ALL processors will host this data
80   int numEntryMethods;
81   int numMetrics;
82   int phaseIter;
83
84   bool *keepMetric;
85   double *incKSeeds;
86   double minDistance; // distance to the closest seed
87   int lastMinK;
88   int minK; // the seed closest to the processor
89
90   // ONLY processor 0 will host this data, the location vector of K seeds
91   // This is actually a 2-D array, we need it to be contiguous for
92   //   communication purposes.
93   double *kSeeds; 
94   int *kNumMembers;
95
96   int *exemplarChoicesLeft;
97   int *outlierChoicesLeft;
98
99  public:
100  KMeansBOC(bool outlierAutomatic, int numKSeeds, int _peNumKeep,
101            double _entryThreshold, bool outlierUsePhases) :
102   autoCompute(outlierAutomatic), usePhases(outlierUsePhases),
103   numK(numKSeeds), peNumKeep(_peNumKeep), entryThreshold(_entryThreshold) {}
104  KMeansBOC(CkMigrateMessage *m):CBase_KMeansBOC(m) {}
105   
106   void startKMeansAnalysis();
107   void flushCheck(bool someFlush);
108   void flushCheckDone();
109   void getNextPhaseMetrics();
110   void collectKMeansData(); // C++ method
111   void globalMetricRefinement(CkReductionMsg *msg);
112   void initKSeeds(); // C++ method
113   void findInitialClusters(KMeansStatsMessage *msg);
114   void updateKSeeds(double *modVector, int n);
115   double calculateDistance(int k); // C++ method
116   void updateSeedMembership(KSeedsMessage *msg);
117   void findRepresentatives(); // C++ method
118   void collectDistances(KSelectionMessage *msg);
119   void findNextMinMax(CkReductionMsg *msg);
120   void phaseDone();
121
122   /*
123   void calculateWeights(KMeansStatsMessage *);
124   void determineOutliers(OutlierWeightMessage *);
125   void setOutliers(OutlierThresholdMessage *);
126   */
127 };
128
129 class TraceProjectionsBOC : public CBase_TraceProjectionsBOC {
130  private:
131   bool findOutliers;
132   bool findStartTime;
133
134   int parModulesRemaining;
135
136   double dummy;
137   double endTime;
138   double analysisStartTime;
139   int endPe;                          // end PE which calls CkExit()
140   int          flush_count;
141   std::set<int> list;
142  public:
143  TraceProjectionsBOC(bool _findOutliers, bool _findStartTime) : findOutliers(_findOutliers), findStartTime(_findStartTime), parModulesRemaining(0), endPe(-1), flush_count(0) {};
144  TraceProjectionsBOC(CkMigrateMessage *m):CBase_TraceProjectionsBOC(m), parModulesRemaining(0), endPe(-1), flush_count(0) {};
145
146   void traceProjectionsParallelShutdown(int);
147   void startTimeAnalysis();
148   void startTimeDone(double result);
149   void startEndTimeAnalysis();
150   void endTimeDone(double result);
151   void kMeansDone(void);
152   void kMeansDoneFlushed(void);
153   void finalize(void);
154   void shutdownAnalysis(void);
155   void closingTraces(void);
156   void closeParallelShutdown(void);
157
158   void ccsOutlierRequest(CkCcsRequestMsg *);
159
160   void flush_warning(int pe);
161   void print_warning();
162 };
163 #endif