00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef EpetraExt_CRSGRAPH_SYMMRCM_H
00030 #define EpetraExt_CRSGRAPH_SYMMRCM_H
00031
00032 #include <vector>
00033
00034 #include <EpetraExt_Transform.h>
00035
00036 class Epetra_Map;
00037 class Epetra_CrsGraph;
00038
00039 namespace EpetraExt {
00040
00042 struct CrsGraph_SymmRCM : public StructuralSameTypeTransform<Epetra_CrsGraph> {
00043
00044 public:
00045
00047 ~CrsGraph_SymmRCM();
00048
00050 CrsGraph_SymmRCM( bool BruteForce = false, int testLeafWidth = 5 )
00051 : bruteForce_(BruteForce),
00052 testLeafWidth_(testLeafWidth),
00053 RCMMap_(0),
00054 RCMColMap_(0)
00055 {}
00056
00058 NewTypeRef operator()( OriginalTypeRef orig );
00059
00060 private:
00061
00062 Epetra_Map * RCMMap_;
00063 Epetra_Map * RCMColMap_;
00064 const int testLeafWidth_;
00065 const bool bruteForce_;
00066
00067 class BFT {
00068
00069 public:
00070
00071 BFT( const vector< vector<int> > & adjlist,
00072 int root,
00073 int max_width,
00074 bool & failed );
00075
00076 int Width() { return width_; }
00077 int Depth() { return depth_; }
00078
00079 void NonNeighborLeaves( vector<int> & leaves,
00080 const vector< vector<int> > & adjlist,
00081 int count );
00082 void ReverseVector( vector<int> & ordered );
00083
00084 private:
00085
00086 bool failed_;
00087 int width_;
00088 int depth_;
00089 int nodes_;
00090
00091 vector< vector<int> > levelSets_;
00092 };
00093
00094 };
00095
00096 }
00097
00098 #endif //EpetraExt_CRSGRAPH_SYMMRCM_H