Merge branch 'charm' of charmgit:charm into xiang/optChkp
[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   int numK;
61   int peNumKeep;
62   double entryThreshold;
63   bool usePhases;
64
65   int numKReported;
66
67   // variables for correct data gathering across phases
68   bool markedBegin;
69   bool markedIdle;
70   double beginBlockTime;
71   double beginIdleBlockTime;
72   int lastBeginEPIdx;
73   int numSelectionIter;
74   bool selected;
75
76   int currentPhase;
77   int lastPhaseIdx;
78   double *currentExecTimes;
79
80   // kMeans outlier structures - ALL processors will host this data
81   int numEntryMethods;
82   int numMetrics;
83   int phaseIter;
84
85   bool *keepMetric;
86   double *incKSeeds;
87   double minDistance; // distance to the closest seed
88   int lastMinK;
89   int minK; // the seed closest to the processor
90
91   // ONLY processor 0 will host this data, the location vector of K seeds
92   // This is actually a 2-D array, we need it to be contiguous for
93   //   communication purposes.
94   double *kSeeds; 
95   int *kNumMembers;
96
97   int *exemplarChoicesLeft;
98   int *outlierChoicesLeft;
99
100  public:
101  KMeansBOC(bool outlierAutomatic, int numKSeeds, int _peNumKeep,
102            double _entryThreshold, bool outlierUsePhases) :
103   autoCompute(outlierAutomatic), numK(numKSeeds), 
104     peNumKeep(_peNumKeep), entryThreshold(_entryThreshold),
105     usePhases(outlierUsePhases) {};
106  KMeansBOC(CkMigrateMessage *m):CBase_KMeansBOC(m) {};
107   
108   void startKMeansAnalysis();
109   void flushCheck(CkReductionMsg *msg);
110   void flushCheckDone();
111   void getNextPhaseMetrics();
112   void collectKMeansData(); // C++ method
113   void globalMetricRefinement(CkReductionMsg *msg);
114   void initKSeeds(); // C++ method
115   void findInitialClusters(KMeansStatsMessage *msg);
116   void updateKSeeds(CkReductionMsg *msg);
117   double calculateDistance(int k); // C++ method
118   void updateSeedMembership(KSeedsMessage *msg);
119   void findRepresentatives(); // C++ method
120   void collectDistances(KSelectionMessage *msg);
121   void findNextMinMax(CkReductionMsg *msg);
122   void phaseDone();
123
124   /*
125   void calculateWeights(KMeansStatsMessage *);
126   void determineOutliers(OutlierWeightMessage *);
127   void setOutliers(OutlierThresholdMessage *);
128   */
129 };
130
131 class TraceProjectionsBOC : public CBase_TraceProjectionsBOC {
132  private:
133   bool findOutliers;
134   bool findStartTime;
135
136   int parModulesRemaining;
137
138   double dummy;
139   double endTime;
140   double analysisStartTime;
141   int endPe;                          // end PE which calls CkExit()
142   std::set<int> list;
143   int          flush_count;
144  public:
145  TraceProjectionsBOC(bool _findOutliers, bool _findStartTime) : findOutliers(_findOutliers), findStartTime(_findStartTime), parModulesRemaining(0), endPe(-1), flush_count(0) {};
146  TraceProjectionsBOC(CkMigrateMessage *m):CBase_TraceProjectionsBOC(m), parModulesRemaining(0), endPe(-1), flush_count(0) {};
147
148   void traceProjectionsParallelShutdown(int);
149   void startTimeAnalysis();
150   void startTimeDone(CkReductionMsg *);
151   void startEndTimeAnalysis();
152   void endTimeDone(CkReductionMsg *);
153   void kMeansDone(CkReductionMsg *);
154   void kMeansDone(void);
155   void finalize(void);
156   void shutdownAnalysis(void);
157   void closingTraces(void);
158   void closeParallelShutdown(CkReductionMsg *);
159
160   void ccsOutlierRequest(CkCcsRequestMsg *);
161
162   void flush_warning(int pe);
163   void print_warning();
164 };
165 #endif