7int DependencyGraph::addVertex(
int level,
int slantedDegree)
9 auto fillAndReduceNode = createFillAndReduceNode(level,slantedDegree);
10 auto rankNode = createRankNode(level,slantedDegree);
11 auto minimalBettiNode = createMinimalBettiNode(level,slantedDegree);
12 mVertices.emplace_back(
Node {level,
19 return mVertices.size()-1;
22void DependencyGraph::addFillMatrixEdge(
int source,
int target)
24 mVertices[source].mEdges.push_back(target);
25 tbb::flow::make_edge(* mVertices[source].mFillAndReduceNode, * mVertices[target].mFillAndReduceNode);
28void DependencyGraph::addMinimalBettiEdge(
int level,
int slantedDegree,
int nLevels,
int nSlantedDegrees)
30 int target = getIndex(level,slantedDegree,nLevels,nSlantedDegrees);
31 tbb::flow::make_edge(* mVertices[target].mFillAndReduceNode, * mVertices[target].mRankNode);
32 tbb::flow::make_edge(* mVertices[target].mRankNode, * mVertices[target].mMinimalBettiNode);
34 int source = getIndex(level+1,slantedDegree-1,nLevels,nSlantedDegrees);
35 if ((level + 1 < nLevels) && (slantedDegree > 0))
36 tbb::flow::make_edge(* mVertices[source].mRankNode, * mVertices[target].mMinimalBettiNode);
39TBBNodePtr DependencyGraph::createFillAndReduceNode(
int lev,
int sldeg)
41 return std::make_shared<TBBNode>(mTBBGraph,
42 [lev, sldeg,
this](
const tbb::flow::continue_msg &msg)
44 int& status = mFrame->mComputationStatus.entry(sldeg,lev);
45 if (status != 1)
return msg;
46 F4Res computer {*mFrame};
49 std::lock_guard<std::mutex> guard(mMutex);
59TBBNodePtr DependencyGraph::createRankNode(
int lev,
int sldeg)
63 return std::make_shared<TBBNode>(mTBBGraph,
64 [](
const tbb::flow::continue_msg &msg)
92TBBNodePtr DependencyGraph::createMinimalBettiNode(
int lev,
int sldeg)
96 return std::make_shared<TBBNode>(mTBBGraph,
97 [](
const tbb::flow::continue_msg &msg)
107std::stack<int> DependencyGraph::topologicalSort()
const
111 std::vector<bool> visited(mVertices.size(),
false);
113 for (
int i = 0; i < mVertices.size(); ++i)
115 topologicalSortWorker(i,visited,
result);
120void DependencyGraph::topologicalSortWorker(
int curVertex, std::vector<bool> &visited, std::stack<int> &
result)
const
122 visited[curVertex] =
true;
124 for (
auto edgeTo = mVertices[curVertex].mEdges.cbegin(); edgeTo != mVertices[curVertex].mEdges.cend(); ++edgeTo)
125 if (!visited[*edgeTo])
126 topologicalSortWorker(*edgeTo, visited,
result);
131void DependencyGraph::print()
const
133 for (
int i = 0; i < mVertices.size(); ++i)
135 std::cout <<
"Vertex : " << i <<
" (" << mVertices[i].mLevel <<
"," << mVertices[i].mSlantedDegree <<
") edges=";
136 for (
auto edgeTo = mVertices[i].mEdges.cbegin(); edgeTo != mVertices[i].mEdges.cend(); ++edgeTo)
137 std::cout << *edgeTo <<
" ";
138 std::cout << std::endl;
142void makeDependencyGraph(DependencyGraph &
G,
int nlevels,
int nslanted_degrees,
bool doMinimalBetti)
145 for (
int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
146 for (
int lev=0; lev < nlevels; ++lev)
148 int newIndex =
G.addVertex(lev,sldeg);
149 if (newIndex != getIndex(lev,sldeg,nlevels,nslanted_degrees))
150 std::cout <<
"ERROR: Index of created vertex does not match expected index." << std::endl;
151 if (
G.getVertex(newIndex).mLevel != lev or
G.getVertex(newIndex).mSlantedDegree != sldeg)
152 std::cout <<
"ERROR: Level or Slanted Degree of Node not the expected value." << std::endl;
156 for (
int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
157 for (
int lev=0; lev < nlevels; ++lev)
160 G.addFillMatrixEdge(getIndex(lev-1,sldeg,nlevels,nslanted_degrees),
161 getIndex(lev,sldeg,nlevels,nslanted_degrees));
163 G.addFillMatrixEdge(getIndex(lev,sldeg-1,nlevels,nslanted_degrees),
164 getIndex(lev,sldeg,nlevels,nslanted_degrees));
165 if ((lev < nlevels-1) && doMinimalBetti)
167 G.addMinimalBettiEdge(lev,sldeg,nlevels,nslanted_degrees);
void construct(int lev, int degree)
F4-style engine that computes one (level, degree) slice of a free resolution into the host SchreyerFr...
VALGRIND_MAKE_MEM_DEFINED & result(result)
DependencyGraph — TBB flow-graph over (level, slanted-degree) cells of a Schreyer-frame resolution.
F4Res — F4-style matrix-reduction worker over a SchreyerFrame.
SchreyerFrame — in-progress representation of a free resolution organised by (level,...
tbb::flow::continue_node< tbb::flow::continue_msg > Node
void makeDependencyGraph(int nlevels, int nslanted_degrees)