00001
00005
00006 #ifndef _RECBISECTBFLB_H_
00007 #define _RECBISECTBFLB_H_
00008
00009 #include "CentralLB.h"
00010 #include "RecBisectBfLB.decl.h"
00011
00012 #include "ObjGraph.h"
00013 #include "bitvecset.h"
00014 #include "cklists.h"
00015
00016
00017 typedef struct {
00018 int index;
00019 float weight;
00020 int firstEdge;
00021 int numEdges;
00022 } VertexRecord;
00023
00024
00025 typedef struct {
00026 int V, E;
00027 VertexRecord * vertices;
00028 int * edges;
00029 int currentVertex;
00030 int currentEdge;
00031 } Graph;
00032
00033
00034 Graph * generateRandomGraph(int numNodex);
00035
00036
00037 typedef CkQ<int> IntQueue;
00038
00039 void CreateRecBisectBfLB();
00040 BaseLB * AllocateRecBisectBfLB();
00041
00042 typedef struct {
00043 int size;
00044 int * nodeArray;
00045 } PartitionRecord;
00046
00047
00048 typedef struct {
00049 int next;
00050 int max;
00051 PartitionRecord * partitions;
00052 } PartitionList;
00053
00054
00055 class RecBisectBfLB : public CBase_RecBisectBfLB {
00056 public:
00057 RecBisectBfLB(const CkLBOptions &);
00058 RecBisectBfLB(CkMigrateMessage *m) : CBase_RecBisectBfLB(m) {}
00059 private:
00060 bool QueryBalanceNow(int step);
00061 void work(LDStats* stats);
00062
00063 Graph * convertGraph(ObjGraph *og);
00064
00065 void partitionInTwo(Graph *g, int nodes[], int numNodes,
00066 int ** pp1, int *numP1, int **pp2, int *numP2,
00067 int ratio1, int ratio2);
00068 int findNextUnassigned(int max, BV_Set * all, BV_Set * s1, BV_Set * s2);
00069 float addToQ(IntQueue * q, Graph *g, BV_Set * all, BV_Set * s1, BV_Set * s2);
00070
00071 void enqChildren(IntQueue * q, Graph *g, BV_Set * all,
00072 BV_Set * s1, BV_Set * s2, int node) ;
00073
00074 void addPartition(PartitionList * partitions, int * nodes, int num) ;
00075 void printPartitions(PartitionList * partitions) ;
00076 void recursivePartition(int numParts, Graph *g, int nodes[], int numNodes,
00077 PartitionList *partitions);
00078
00079 };
00080
00081
00082
00083 #endif
00084
00085