@@ -23,6 +23,15 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
23
23
namespace Gorder
24
24
{
25
25
26
+ string Graph::getDegree (bool deg) {
27
+ return (deg ? " indegree" : " outdegree" );
28
+ }
29
+
30
+ bool Graph::indegree_gorder=1 ; // reordering based on indegree if 1, outdegree if 0
31
+
32
+ bool Graph::terminate_after_map = false ; // terminate application after reordering mapping is computed
33
+
34
+
26
35
string Graph::getFilename (){
27
36
return name;
28
37
}
@@ -65,6 +74,7 @@ void Graph::readGraph(const string& fullname) {
65
74
vector< pair<int , int > > edges;
66
75
edges.reserve (100000000 );
67
76
77
+ #if 0
68
78
while(feof(fp)!=true){
69
79
if(fgets(line, 40, fp)){
70
80
u=v=0;
@@ -86,6 +96,30 @@ void Graph::readGraph(const string& fullname) {
86
96
edges.push_back(make_pair(u, v));
87
97
}
88
98
}
99
+ #else
100
+ ifstream ifs (fullname.c_str (), std::ifstream::in);
101
+ while (ifs.good ()) {
102
+ u=v=0 ;
103
+ ifs >> u >> v;
104
+ if (u==v)
105
+ continue ;
106
+ edgenum++;
107
+ if (u>vsize)
108
+ vsize=u;
109
+ if (v>vsize)
110
+ vsize=v;
111
+
112
+ if ( Graph::indegree_gorder ) {
113
+ edges.push_back (make_pair (u, v));
114
+ } else {
115
+ edges.push_back (make_pair (v, u));
116
+ }
117
+ }
118
+ if (edges[edgenum-1 ].first == 0 && edges[edgenum-1 ].second == 0 ) {
119
+ edgenum--;
120
+ edges.pop_back ();
121
+ }
122
+ #endif
89
123
vsize++;
90
124
91
125
fclose (fp);
@@ -141,8 +175,7 @@ void Graph::readGraph(const string& fullname) {
141
175
graph[vsize].instart =edgenum;
142
176
}
143
177
144
- void Graph::Transform (){
145
- vector<int > order;
178
+ void Graph::Transform (vector<int >& order){
146
179
RCMOrder (order);
147
180
if (order.size ()!=vsize){
148
181
cout << " order.size()!=vsize" << endl;
@@ -225,6 +258,27 @@ void Graph::writeGraph(ostream& out){
225
258
}
226
259
227
260
261
+ void Graph::PrintTwoDirectionMap (const vector<int >& rcm_order, const vector<int >& gorder_order) {
262
+ string degree_type = Graph::getDegree (Graph::indegree_gorder);
263
+ string f_map = name+" _gorder_" +degree_type+" .map" ;
264
+
265
+ if ( rcm_order.size () != gorder_order.size () ) {
266
+ cout << " Map size does not match: " << rcm_order.size () << gorder_order.size () << endl;
267
+ quit ();
268
+ }
269
+ cout << " Writing file: " << f_map << endl;
270
+ ofstream out_map (f_map.c_str ());
271
+ out_map << vsize << endl;
272
+ out_map << edgenum << endl;
273
+ for (int i = 0 ; i < gorder_order.size () ; i++ ) {
274
+ out_map << i << " \t " << gorder_order[rcm_order[i]] << endl;
275
+ }
276
+ if (terminate_after_map) {
277
+ cout << " Exiting early as instructed!" << endl;
278
+ exit (0 );
279
+ }
280
+ }
281
+
228
282
void Graph::PrintReOrderedGraph (const vector<int >& order){
229
283
ofstream out ((name+" _Gorder.txt" ).c_str ());
230
284
0 commit comments