AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
MinCostBipartiteMatcher.cc
Go to the documentation of this file.
1 
26 #include <omp.h>
27 
29 {
30  int numSolvers = minCostFlowSolvers.size();
31 #pragma omp parallel for schedule(dynamic)
32  for (int solverId = 0; solverId < numSolvers; solverId++)
33  {
34  minCostFlowSolvers[solverId]->calcMinCostFlow(srcNode, sinkNode, numExpectedMatches);
35  for (int i = 0; i < numLeftNodes; i++)
36  {
37  for (unsigned int j = 0; j < minCostFlowSolvers[solverId]->resGraph.adj[i].size(); j++)
38  {
39  int destination = minCostFlowSolvers[solverId]->resGraph.adj[i][j]->destination;
40  if (destination >= numLeftNodes && destination < numLeftNodes + numRightNodes)
41  {
42  if (minCostFlowSolvers[solverId]->resGraph.adj[i][j]->residualFlow == 0)
43  {
44  assert(left2right[i] < 0);
45  left2right[i] = destination - numLeftNodes;
46  assert(right2left[destination - numLeftNodes] < 0);
47  right2left[destination - numLeftNodes] = i;
48  }
49  }
50  }
51  }
52  }
53 }
54 
55 void MinCostBipartiteMatcher::getConnectedSubgraphAdjList(std::vector<std::vector<std::pair<int, float>>> &adjList,
56  std::vector<int> &leftId2ConnectedSubgraphId,
57  int &numConnectedSubgraphs, int maxThreadNum)
58 {
59  std::vector<std::vector<int>> inv_adjList;
60  inv_adjList.resize(numRightNodes, std::vector<int>());
61  for (int i = 0; i < numLeftNodes; i++)
62  {
63  for (unsigned int j = 0; j < adjList[i].size(); j++)
64  {
65  unsigned int v = adjList[i][j].first;
66  assert(v < inv_adjList.size());
67  inv_adjList[v].push_back(i);
68  }
69  }
70 
71  numConnectedSubgraphs = 0;
72  for (unsigned int leftNodeId = 0; leftNodeId < adjList.size(); leftNodeId++)
73  {
74  if (leftId2ConnectedSubgraphId[leftNodeId] >= 0)
75  continue;
76  int curNode = leftNodeId;
77 
78  bool reachedRight[numRightNodes];
79  memset(reachedRight, 0, sizeof(reachedRight));
80  std::queue<int> leftNodeInQ;
81  leftNodeInQ.push(curNode);
82  leftId2ConnectedSubgraphId[curNode] = numConnectedSubgraphs % maxThreadNum;
83  while (leftNodeInQ.size())
84  {
85  curNode = leftNodeInQ.front();
86  leftNodeInQ.pop();
87  for (auto tmpPair : adjList[curNode])
88  {
89  int rightNode = tmpPair.first;
90  if (reachedRight[rightNode])
91  continue;
92  reachedRight[rightNode] = 1;
93  for (int nextLeftId : inv_adjList[rightNode])
94  {
95  if (leftId2ConnectedSubgraphId[nextLeftId] < 0)
96  {
97  leftId2ConnectedSubgraphId[nextLeftId] = numConnectedSubgraphs % maxThreadNum;
98  leftNodeInQ.push(nextLeftId);
99  }
100  }
101  }
102  }
103 
104  numConnectedSubgraphs++;
105  }
106 
107  // print_info("MinCostBipartiteMatcher finds " + std::to_string(numConnectedSubgraphs) +
108  // " connected subgraphs in the input bipartie graph");
109 }
MinCostBipartiteMatcher::numLeftNodes
int numLeftNodes
Definition: MinCostBipartiteMatcher.h:125
MinCostBipartiteMatcher::left2right
std::vector< int > left2right
Definition: MinCostBipartiteMatcher.h:140
MinCostBipartiteMatcher.h
MinCostBipartiteMatcher::minCostFlowSolvers
std::vector< MinCostFlow * > minCostFlowSolvers
Definition: MinCostBipartiteMatcher.h:137
MinCostBipartiteMatcher::solve
void solve()
Definition: MinCostBipartiteMatcher.cc:28
MinCostBipartiteMatcher::sinkNode
int sinkNode
Definition: MinCostBipartiteMatcher.h:139
MinCostBipartiteMatcher::getConnectedSubgraphAdjList
void getConnectedSubgraphAdjList(std::vector< std::vector< std::pair< int, float >>> &adjList, std::vector< int > &leftId2ConnectedSubgraphId, int &numConnectedSubgraphs, int maxThreadNum)
Definition: MinCostBipartiteMatcher.cc:55
MinCostBipartiteMatcher::maxThreadNum
int maxThreadNum
Definition: MinCostBipartiteMatcher.h:133
MinCostBipartiteMatcher::srcNode
int srcNode
Definition: MinCostBipartiteMatcher.h:138
MinCostBipartiteMatcher::adjList
std::vector< std::vector< std::pair< int, float > > > & adjList
Definition: MinCostBipartiteMatcher.h:128
MinCostBipartiteMatcher::numExpectedMatches
int numExpectedMatches
Definition: MinCostBipartiteMatcher.h:127
checkHalfColumn.i
int i
Definition: checkHalfColumn.py:5
MinCostBipartiteMatcher::right2left
std::vector< int > right2left
Definition: MinCostBipartiteMatcher.h:141
MinCostBipartiteMatcher::numRightNodes
int numRightNodes
Definition: MinCostBipartiteMatcher.h:126