Macaulay2 Engine
Loading...
Searching...
No Matches
res-dep-graph.cpp
Go to the documentation of this file.
1#include "res-dep-graph.hpp"
3#include "res-f4.hpp"
4
5#ifdef WITH_TBB
6
7int DependencyGraph::addVertex(int level, int slantedDegree)
8{
9 auto fillAndReduceNode = createFillAndReduceNode(level,slantedDegree);
10 auto rankNode = createRankNode(level,slantedDegree);
11 auto minimalBettiNode = createMinimalBettiNode(level,slantedDegree);
12 mVertices.emplace_back(Node {level,
13 slantedDegree,
14 std::vector<int> {},
15 fillAndReduceNode,
16 rankNode,
17 minimalBettiNode});
18
19 return mVertices.size()-1;
20}
21
22void DependencyGraph::addFillMatrixEdge(int source, int target)
23{
24 mVertices[source].mEdges.push_back(target);
25 tbb::flow::make_edge(* mVertices[source].mFillAndReduceNode, * mVertices[target].mFillAndReduceNode);
26}
27
28void DependencyGraph::addMinimalBettiEdge(int level, int slantedDegree, int nLevels, int nSlantedDegrees)
29{
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);
33
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);
37}
38
39TBBNodePtr DependencyGraph::createFillAndReduceNode(int lev, int sldeg)
40{
41 return std::make_shared<TBBNode>(mTBBGraph,
42 [lev, sldeg, this](const tbb::flow::continue_msg &msg)
43 {
44 int& status = mFrame->mComputationStatus.entry(sldeg,lev);
45 if (status != 1) return msg;
46 F4Res computer {*mFrame};
47 computer.construct(lev,sldeg + lev);
48 //mFrame->mComputer->construct(lev,sldeg + lev);
49 std::lock_guard<std::mutex> guard(mMutex);
50
51 //std::cout << "fill matrix node lev=" << lev << " sldeg="
52 // << sldeg << " sum=" << lev + sldeg << std::endl;
53
54 status = 2;
55 return msg;
56 });
57}
58
59TBBNodePtr DependencyGraph::createRankNode(int lev, int sldeg)
60{
61 (void) lev;
62 (void) sldeg;
63 return std::make_shared<TBBNode>(mTBBGraph,
64 [](const tbb::flow::continue_msg &msg)
65 {
66 // int& status = mFrame->mComputationStatus.entry(sldeg,lev);
67 // if (status != 2) return msg;
68
69 // {
70 // std::lock_guard<std::mutex> guard(mMutex);
71 // std::cout << "starting rank node lev=" << lev << " sldeg="
72 // << sldeg << " sum=" << lev + sldeg << std::endl;
73 // }
74
75 // commented out for now, will work on this later.
76 // int rk = mFrame->rank(sldeg,lev);
77
78 //std::lock_guard<std::mutex> guard(mMutex);
79 //std::cout << "rank node lev=" << lev << " sldeg="
80 // << sldeg << " sum=" << lev + sldeg << std::endl;
81 // if (rk > 0)
82 // {
83 // mFrame->mBettiMinimal.entry(sldeg, lev) -= rk;
84 // if (sldeg <= mFrame->mHiSlantedDegree and lev > 0)
85 // mFrame->mBettiMinimal.entry(sldeg + 1, lev - 1) -= rk;
86 // }
87 // status = 3;
88 return msg;
89 });
90}
91
92TBBNodePtr DependencyGraph::createMinimalBettiNode(int lev, int sldeg)
93{
94 (void) lev;
95 (void) sldeg;
96 return std::make_shared<TBBNode>(mTBBGraph,
97 [](const tbb::flow::continue_msg &msg)
98 {
99 (void) msg;
100 //std::lock_guard<std::mutex> guard(mMutex);
101 //std::cout << "minimal betti node lev=" << lev << " sldeg="
102 // << sldeg << " sum=" << lev + sldeg << std::endl;
103 //return msg;
104 });
105}
106
107std::stack<int> DependencyGraph::topologicalSort() const
108{
109 std::stack<int> result;
110
111 std::vector<bool> visited(mVertices.size(),false);
112
113 for (int i = 0; i < mVertices.size(); ++i)
114 if (!visited[i])
115 topologicalSortWorker(i,visited,result);
116
117 return result;
118}
119
120void DependencyGraph::topologicalSortWorker(int curVertex, std::vector<bool> &visited, std::stack<int> &result) const
121{
122 visited[curVertex] = true;
123
124 for (auto edgeTo = mVertices[curVertex].mEdges.cbegin(); edgeTo != mVertices[curVertex].mEdges.cend(); ++edgeTo)
125 if (!visited[*edgeTo])
126 topologicalSortWorker(*edgeTo, visited, result);
127
128 result.push(curVertex);
129}
130
131void DependencyGraph::print() const
132{
133 for (int i = 0; i < mVertices.size(); ++i)
134 {
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;
139 }
140}
141
142void makeDependencyGraph(DependencyGraph &G, int nlevels, int nslanted_degrees, bool doMinimalBetti)
143{
144 // Create the nodes
145 for (int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
146 for (int lev=0; lev < nlevels; ++lev)
147 {
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;
153 }
154
155 // Add the fill matrix edges
156 for (int sldeg=0; sldeg < nslanted_degrees; ++sldeg)
157 for (int lev=0; lev < nlevels; ++lev)
158 {
159 if (lev > 0)
160 G.addFillMatrixEdge(getIndex(lev-1,sldeg,nlevels,nslanted_degrees),
161 getIndex(lev,sldeg,nlevels,nslanted_degrees));
162 if (sldeg > 0)
163 G.addFillMatrixEdge(getIndex(lev,sldeg-1,nlevels,nslanted_degrees),
164 getIndex(lev,sldeg,nlevels,nslanted_degrees));
165 if ((lev < nlevels-1) && doMinimalBetti)
166 {
167 G.addMinimalBettiEdge(lev,sldeg,nlevels,nslanted_degrees);
168 }
169 }
170}
171
172#endif // WITH_TBB
void construct(int lev, int degree)
Definition res-f4.cpp:640
F4-style engine that computes one (level, degree) slice of a free resolution into the host SchreyerFr...
Definition res-f4.hpp:84
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)
tbb::flow::graph G