2323#include < getopt.h>
2424#include < iostream>
2525#include < optional>
26+ #include < set>
2627#include < string>
2728
2829#include < algorithms/cc/cc.hpp>
30+ #include < sbg/set_fact.hpp>
2931#include < util/time_profiler.hpp>
3032
3133#include " build_sb_graph.hpp"
@@ -151,7 +153,7 @@ void read_directory(const std::string& name, std::vector<std::string>& v)
151153}
152154
153155
154- tuple<unique_ptr<SBG ::LIB ::WeightedSBGraph>, PartitionMap, double , double > run_current_version (
156+ tuple<unique_ptr<SBG ::LIB ::WeightedSBGraph>, PartitionMap, double , double > partitionate_not_using_cc (
155157 const PartitionerParams& params)
156158{
157159 auto start_build_graph = chrono::high_resolution_clock::now ();
@@ -173,6 +175,93 @@ tuple<unique_ptr<SBG::LIB::WeightedSBGraph>, PartitionMap, double, double> run_c
173175}
174176
175177
178+ tuple<unique_ptr<SBG ::LIB ::WeightedSBGraph>, PartitionMap, double , double > partitionate_using_cc (const PartitionerParams& params)
179+ {
180+ auto start_build_graph = chrono::high_resolution_clock::now ();
181+ auto sb_graph = make_unique<SBG ::LIB ::WeightedSBGraph>(build_sb_graph (params.filename ->c_str (), false ));
182+ auto end_build_graph = chrono::high_resolution_clock::now ();
183+ auto time_to_build_graph = chrono::duration<double , std::milli>(end_build_graph - start_build_graph).count ();
184+
185+ cout << " sb_graph: " << *sb_graph << endl;
186+
187+ auto injective_conn = using_cc::split_nodes_into_injective_domains (*sb_graph);
188+
189+ logging::sbg_log << " injective connections " << injective_conn << endl;
190+ #if SBG_PARTITIONER_LOGGING
191+ logging::sbg_log << " remaining " << sb_graph->V ().difference (injective_conn) << endl;
192+ #endif
193+
194+ auto start_partitionate = chrono::high_resolution_clock::now ();
195+ using_cc::SetPointers sorted_nodes = {};
196+ unsigned index = 0 ;
197+ for (const auto & s : injective_conn) {
198+ sorted_nodes.push_back (using_cc::SetPointer (index++, s, 0 , s.cardinal ()));
199+ }
200+
201+ sbg_partitioner::CommunicationCostCC comm_cc (*sb_graph, sorted_nodes);
202+
203+ std::vector<sbg_partitioner::using_cc::SetPointers> sorted_partitions;
204+ auto new_graph = SBG::LIB::WeightedSBGraph (
205+ injective_conn,
206+ sb_graph->Vmap (),
207+ sb_graph->map1 (),
208+ sb_graph->map2 (),
209+ sb_graph->Emap (),
210+ sb_graph->subEmap ()
211+ );
212+
213+ auto non_sorted_partitions = best_initial_partition (new_graph, *params.number_of_partitions , params.initial_partition_strategy , params.enable_multithreading );
214+
215+ // logging::sbg_log << "converting nodes into set pointers" << endl;
216+ auto start_conversion = chrono::high_resolution_clock::now ();
217+ for (const auto & partition : non_sorted_partitions) {
218+ sorted_partitions.emplace_back ();
219+ for (const auto & v : partition) {
220+ for (const auto & n : sorted_nodes) {
221+ if (not v.intersection (n.set_piece ).isEmpty ()) {
222+ size_t offset = v.begin ()[0 ].begin () - n.set_piece .begin ()[0 ].begin ();
223+ sorted_partitions.back ().emplace_back (n.index , n.set_piece , offset, v.cardinal ());
224+ }
225+ }
226+ }
227+ }
228+ auto end_conversion = chrono::high_resolution_clock::now ();
229+ auto conversion_time = chrono::duration<double , std::milli>(end_conversion - start_conversion).count ();
230+ // auto sorted_partitions = using_cc::best_initial_partition(*sb_graph, sorted_nodes, comm_cc, *params.number_of_partitions, InitialPartitionStrategy::DFS_DISTRIBUTIVE_POSTORDER);
231+ for (const auto & sp : sorted_partitions){
232+ cout << sp << endl;
233+ }
234+
235+ for (size_t i = 0 ; i < sorted_nodes.size (); i++) {
236+ const auto & s1 = sorted_nodes.at (i);
237+ for (size_t j = i + 1 ; j < sorted_nodes.size (); j++) {
238+ const auto & s2 = sorted_nodes.at (j);
239+
240+ auto comm = comm_cc.get_communication (s1.index , s2.index );
241+ cout << s1.set_piece << " " << s1.set_piece .cardinal () << " - " << s2.set_piece << " " << s2.set_piece .cardinal () << " : " << comm << endl;
242+ if (comm > 0 ) {
243+ assert (s1.set_piece .cardinal () == s2.set_piece .cardinal ());
244+ }
245+ }
246+ }
247+
248+ sanity_check (*sb_graph, sbg_partitioner::using_cc::rebuild_partitions (sorted_nodes, sorted_partitions), *params.number_of_partitions );
249+
250+ using_cc::kl_sbg_imbalance_partitioner (*sb_graph, sorted_nodes, sorted_partitions, comm_cc, 0 .);
251+
252+ auto partitions = sbg_partitioner::using_cc::rebuild_partitions (sorted_nodes, sorted_partitions);
253+ auto end_partitionate = chrono::high_resolution_clock::now ();
254+ auto time_to_partitionate = chrono::duration<double , std::milli>(end_partitionate - start_partitionate).count ();
255+ time_to_partitionate -= conversion_time;
256+
257+ // if (sanity_check_enabled) {
258+ sanity_check (*sb_graph, partitions, *params.number_of_partitions );
259+ // }
260+
261+ return { move (sb_graph), partitions, time_to_build_graph, time_to_partitionate };
262+ }
263+
264+
176265static struct option long_options[] = {{" config-filename" , required_argument, 0 , ' c' },
177266 {" filename" , required_argument, 0 , ' f' }, {" partitions" , required_argument, 0 , ' p' },
178267 {" output-file" , required_argument, 0 , ' g' }, {" output-graph" , required_argument, 0 , ' o' },
@@ -316,57 +405,9 @@ int main(int argc, char** argv)
316405 PartitionMap partitions;
317406 double time_to_build_graph, time_to_partitionate = 0.0 ;
318407 if (not params.use_connected_components ) {
319- tie (sb_graph, partitions, time_to_build_graph, time_to_partitionate) = run_current_version (params);
408+ tie (sb_graph, partitions, time_to_build_graph, time_to_partitionate) = partitionate_not_using_cc (params);
320409 } else {
321- auto start_build_graph = chrono::high_resolution_clock::now ();
322- sb_graph = make_unique<SBG ::LIB ::WeightedSBGraph>(build_sb_graph (params.filename ->c_str ()));
323- auto end_build_graph = chrono::high_resolution_clock::now ();
324- time_to_build_graph = chrono::duration<double , std::milli>(end_build_graph - start_build_graph).count ();
325-
326- auto cc_pw_map = SBG::LIB::connectedComponents (*sb_graph);
327-
328- cout << " sb_graph: " << *sb_graph << endl;
329- cout << cc_pw_map.dom () << endl;
330-
331- using_cc::SetPointers sorted_nodes = {};
332- unsigned index = 0 ;
333- for (const auto & s : cc_pw_map.dom ()) {
334- sorted_nodes.push_back (using_cc::SetPointer (index++, s, s.cardinal ()));
335- }
336-
337- sbg_partitioner::CommunicationCostCC comm_cc (*sb_graph, sorted_nodes);
338-
339- auto new_graph = SBG::LIB::WeightedSBGraph (
340- cc_pw_map.dom (),
341- sb_graph->Vmap (),
342- sb_graph->map1 (),
343- sb_graph->map2 (),
344- sb_graph->Emap (),
345- sb_graph->subEmap ()
346- );
347-
348- vector<using_cc::SetPointers> sorted_partitions;
349- auto non_sorted_partitions = best_initial_partition (new_graph, *params.number_of_partitions , params.initial_partition_strategy , params.enable_multithreading );
350-
351- for (const auto & partition : non_sorted_partitions) {
352- sorted_partitions.emplace_back ();
353- for (const auto & s : partition) {
354- for (const auto & ss : sorted_nodes) {
355- if (not s.intersection (ss.set_piece ).isEmpty ()) {
356- sorted_partitions.back ().emplace_back (ss.index , ss.set_piece , s.cardinal ());
357- break ;
358- }
359- }
360- }
361- }
362-
363- partitions = sbg_partitioner::using_cc::rebuild_partitions (sorted_nodes, sorted_partitions);
364- sanity_check (*sb_graph, partitions, *params.number_of_partitions );
365-
366- sbg_partitioner::using_cc::kl_sbg_imbalance_partitioner (*sb_graph, sorted_nodes, sorted_partitions, comm_cc, 0 .);
367-
368- partitions = sbg_partitioner::using_cc::rebuild_partitions (sorted_nodes, sorted_partitions);
369- sanity_check (*sb_graph, partitions, *params.number_of_partitions );
410+ tie (sb_graph, partitions, time_to_build_graph, time_to_partitionate) = partitionate_using_cc (params);
370411 }
371412
372413 if (not sb_graph) {
0 commit comments