uninitialized parModulesRemaining caused program to hang at end during proj analysis...
[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 #ifndef PROJ_ANALYSIS
7 // NOTE: Needed to handle the automatically-generated method so 
8 //   trace-projections would build correctly while ignoring any of the 
9 //   BOC-based definitions generated by parsing trace-projections.ci.
10 //   Hence, we do not include TraceProjections.decl.h in this version.
11 //
12 //   This version of trace-projections would not permit any form of
13 //   end-of-run operations and NONE of the definitions found in 
14 //   trace-projections.ci would be visible to the rest of the code
15 //   (trace-projections.C), so some care would be needed to ensure 
16 //   PROJ_ANALYSIS encloses the correct code-fragments in 
17 //   trace-projections.C
18 void _registerTraceProjections() {
19   // faked call that does nothing.
20 }
21 #else
22 #include "TraceProjections.decl.h"
23
24 class KMeansStatsMessage : public CMessage_KMeansStatsMessage {
25  public:
26   int numMetrics;
27   int numKPos;
28   int numStats;
29   bool *filter;
30   double *kSeedsPos;
31   double *stats;
32 };
33
34 class KSeedsMessage : public CMessage_KSeedsMessage {
35  public:
36   int numKPos;
37   double *kSeedsPos;
38 };
39
40 class TraceProjectionsInit : public Chare {
41  public:
42   TraceProjectionsInit(CkArgMsg *msg);
43  TraceProjectionsInit(CkMigrateMessage *m):Chare(m) {}
44 };
45
46 class KSelectionMessage : public CMessage_KSelectionMessage {
47  public:
48   int numKMinIDs;
49   int numKMaxIDs;
50   int *minIDs;
51   int *maxIDs;
52 };
53
54 class KMeansBOC : public CBase_KMeansBOC {
55  private:
56   // commandline parameters
57   bool autoCompute;
58   int numK;
59   int peNumKeep;
60   double entryThreshold;
61   bool usePhases;
62
63   int numKReported;
64
65   // variables for correct data gathering across phases
66   bool markedBegin;
67   bool markedIdle;
68   double beginBlockTime;
69   double beginIdleBlockTime;
70   int lastBeginEPIdx;
71   int numSelectionIter;
72   bool selected;
73
74   int currentPhase;
75   int lastPhaseIdx;
76   double *currentExecTimes;
77
78   // kMeans outlier structures - ALL processors will host this data
79   int numEntryMethods;
80   int numMetrics;
81   int phaseIter;
82
83   bool *keepMetric;
84   double *incKSeeds;
85   double minDistance; // distance to the closest seed
86   int lastMinK;
87   int minK; // the seed closest to the processor
88
89   // ONLY processor 0 will host this data, the location vector of K seeds
90   // This is actually a 2-D array, we need it to be contiguous for
91   //   communication purposes.
92   double *kSeeds; 
93   int *kNumMembers;
94
95   int *exemplarChoicesLeft;
96   int *outlierChoicesLeft;
97
98  public:
99  KMeansBOC(bool outlierAutomatic, int numKSeeds, int _peNumKeep,
100            double _entryThreshold, bool outlierUsePhases) :
101   autoCompute(outlierAutomatic), numK(numKSeeds), 
102     peNumKeep(_peNumKeep), entryThreshold(_entryThreshold),
103     usePhases(outlierUsePhases) {};
104  KMeansBOC(CkMigrateMessage *m):CBase_KMeansBOC(m) {};
105   
106   void startKMeansAnalysis();
107   void flushCheck(CkReductionMsg *msg);
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(CkReductionMsg *msg);
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
133   int parModulesRemaining;
134
135   double dummy;
136   double endTime;
137   double analysisStartTime;
138  public:
139  TraceProjectionsBOC(bool _findOutliers) : findOutliers(_findOutliers), parModulesRemaining(0) {};
140  TraceProjectionsBOC(CkMigrateMessage *m):CBase_TraceProjectionsBOC(m), parModulesRemaining(0) {};
141
142   void traceProjectionsParallelShutdown();
143   void startEndTimeAnalysis();
144   void endTimeDone(CkReductionMsg *);
145   void kMeansDone(CkReductionMsg *);
146   void kMeansDone(void);
147   void finalize(void);
148   void shutdownAnalysis(void);
149   void closingTraces(void);
150   void closeParallelShutdown(CkReductionMsg *);
151
152   void ccsOutlierRequest(CkCcsRequestMsg *);
153 };
154 #endif