1#ifndef _res_dep_graph_hpp_
2#define _res_dep_graph_hpp_
58using TBBNode = tbb::flow::continue_node<tbb::flow::continue_msg>;
59using TBBNodePtr = std::shared_ptr<TBBNode>;
64inline int getIndex(
int lev,
int sldeg,
int nlevels,
int nslanted_degrees)
66 (void) nslanted_degrees;
67 return lev + (sldeg * nlevels);
71inline std::pair<int,int> getPair(
int index,
int nlevels,
int nslanted_degrees)
73 (void) nslanted_degrees;
74 return std::make_pair(index % nlevels, index / nlevels);
80 std::vector<int> mEdges;
81 TBBNodePtr mFillAndReduceNode;
83 TBBNodePtr mMinimalBettiNode;
90 tbb::flow::graph mTBBGraph;
91 std::vector<Node> mVertices;
94 SchreyerFrame* mFrame;
96 void topologicalSortWorker(
int curVertex, std::vector<bool> &visited, std::stack<int> &
result)
const;
98 TBBNodePtr createFillAndReduceNode(
int level,
int slantedDegree);
99 TBBNodePtr createRankNode(
int level,
int slantedDegree);
100 TBBNodePtr createMinimalBettiNode(
int level,
int slantedDegree);
104 DependencyGraph() : mFrame(nullptr) {};
105 DependencyGraph(SchreyerFrame *framePtr) : mFrame(framePtr) {};
108 int addVertex(
int level,
int slantedDegree);
110 const Node& getVertex(
int index)
const {
return mVertices[index]; }
112 int numVertices()
const {
return mVertices.size(); }
114 void addFillMatrixEdge(
int source,
int target);
115 void addMinimalBettiEdge(
int level,
int slantedDegree,
int nLevels,
int nSlantedDegrees);
117 std::stack<int> topologicalSort()
const;
122 void startComputation() { mVertices[0].mFillAndReduceNode->try_put(tbb::flow::continue_msg()); }
124 void waitForCompletion() { mTBBGraph.wait_for_all(); }
127void makeDependencyGraph(DependencyGraph &
G,
int nlevels,
int nslanted_degrees,
bool doMinimalBetti);
F4-style engine that computes one (level, degree) slice of a free resolution into the host SchreyerFr...
State container for the in-progress free resolution built by the F4 resolution engine.
VALGRIND_MAKE_MEM_DEFINED & result(result)
Engine TBB shim — single point of inclusion for every parallel primitive.
tbb::flow::continue_node< tbb::flow::continue_msg > Node
void makeDependencyGraph(int nlevels, int nslanted_degrees)