00001 #ifndef GALOIS_LIGRAGRAPHCHIEXECUTOR_H
00002 #define GALOIS_LIGRAGRAPHCHIEXECUTOR_H
00003
00004 #include "LigraExecutor.h"
00005 #include "GraphChiExecutor.h"
00006
00007 namespace Galois {
00009 namespace LigraGraphChi {
00010
00011 template<bool Forward,typename Graph,typename EdgeOperator,typename Bag>
00012 void edgeMap(size_t size, Graph& graph, EdgeOperator op, Bag& output) {
00013 typedef Galois::Graph::BindSegmentGraph<Graph> WrappedGraph;
00014 WrappedGraph wgraph(graph);
00015
00016 output.densify();
00017 Galois::GraphChi::hidden::vertexMap<false,false>(graph, wgraph,
00018 Galois::Ligra::hidden::DenseForwardOperator<WrappedGraph,Bag,EdgeOperator,Forward,true>(wgraph, output, output, op),
00019 static_cast<Bag*>(0),
00020 size);
00021 }
00022
00023 template<bool Forward,typename Graph, typename EdgeOperator,typename Bag>
00024 void edgeMap(size_t size, Graph& graph, EdgeOperator op, Bag& input, Bag& output, bool denseForward) {
00025 typedef Galois::Graph::BindSegmentGraph<Graph> WrappedGraph;
00026 WrappedGraph wgraph(graph);
00027
00028 size_t count = input.getCount();
00029
00030 if (!denseForward && count > graph.sizeEdges() / 20) {
00031 input.densify();
00032 if (denseForward) {
00033 abort();
00034 output.densify();
00035 Galois::GraphChi::hidden::vertexMap<false,false>(graph, wgraph,
00036 Galois::Ligra::hidden::DenseForwardOperator<WrappedGraph,Bag,EdgeOperator,Forward,false>(wgraph, input, output, op),
00037 static_cast<Bag*>(0),
00038 size);
00039 } else {
00040 Galois::GraphChi::hidden::vertexMap<false,false>(graph, wgraph,
00041 Galois::Ligra::hidden::DenseOperator<WrappedGraph,Bag,EdgeOperator,Forward>(wgraph, input, output, op),
00042 static_cast<Bag*>(0),
00043 size);
00044 }
00045 } else {
00046 Galois::GraphChi::hidden::vertexMap<true,false>(graph, wgraph,
00047 Galois::Ligra::hidden::SparseOperator<WrappedGraph,Bag,EdgeOperator,Forward>(wgraph, output, op),
00048 &input,
00049 size);
00050 }
00051 }
00052
00053 template<bool Forward,typename Graph, typename EdgeOperator,typename Bag>
00054 void edgeMap(size_t size, Graph& graph, EdgeOperator op, typename Graph::GraphNode single, Bag& output) {
00055 Bag input(graph.size());
00056 input.push(graph.idFromNode(single), 1);
00057 edgeMap<Forward>(size, graph, op, input, output, false);
00058 }
00059
00060 template<typename... Args>
00061 void outEdgeMap(Args&&... args) {
00062 edgeMap<true>(std::forward<Args>(args)...);
00063 }
00064
00065 template<typename... Args>
00066 void inEdgeMap(Args&&... args) {
00067 edgeMap<false>(std::forward<Args>(args)...);
00068 }
00069
00070 template<bool UseGraphChi>
00071 struct ChooseExecutor {
00072 template<typename... Args>
00073 void inEdgeMap(size_t size, Args&&... args) {
00074 edgeMap<false>(size, std::forward<Args>(args)...);
00075 }
00076
00077 template<typename... Args>
00078 void outEdgeMap(size_t size, Args&&... args) {
00079 edgeMap<true>(size, std::forward<Args>(args)...);
00080 }
00081
00082 template<typename Graph>
00083 void checkIfInMemoryGraph(Graph& g, size_t size) {
00084 if (Galois::GraphChi::hidden::fitsInMemory(g, size)) {
00085 g.keepInMemory();
00086 }
00087 }
00088 };
00089
00090 template<>
00091 struct ChooseExecutor<false> {
00092 template<typename... Args>
00093 void inEdgeMap(size_t size, Args&&... args) {
00094 Galois::Ligra::edgeMap<false>(std::forward<Args>(args)...);
00095 }
00096
00097 template<typename... Args>
00098 void outEdgeMap(size_t size, Args&&... args) {
00099 Galois::Ligra::edgeMap<true>(std::forward<Args>(args)...);
00100 }
00101
00102 template<typename Graph>
00103 void checkIfInMemoryGraph(Graph& g, size_t size) { }
00104 };
00105
00106 }
00107 }
00108 #endif