AMF-Placer  2.0
An Open-Source Timing-driven Analytical Mixed-size FPGA Placer
MinCostBipartiteMatcher.h
Go to the documentation of this file.
1 
25 #ifndef _MinCostBipartiteMatcher
26 #define _MinCostBipartiteMatcher
27 
28 #include "PlacementInfo.h"
29 #include "minCostFlow/MinCostFlow.h"
30 #include "sysInfo.h"
31 #include <assert.h>
32 #include <fstream>
33 #include <iostream>
34 #include <map>
35 #include <mutex>
36 #include <semaphore.h>
37 #include <set>
38 #include <sstream>
39 #include <string>
40 #include <thread>
41 #include <vector>
42 
44 {
45  public:
47  std::vector<std::vector<std::pair<int, float>>> &adjList, int maxThreadNum, bool verbose)
50  {
51 
52  std::vector<int> leftId2ConnectedSubgraphId(0);
53  leftId2ConnectedSubgraphId.resize(numLeftNodes, -1);
54  int numConnectedSubgraphs = -1;
55  getConnectedSubgraphAdjList(adjList, leftId2ConnectedSubgraphId, numConnectedSubgraphs, maxThreadNum);
56  if (maxThreadNum < numConnectedSubgraphs)
58  else
59  threadNum = numConnectedSubgraphs;
60  minCostFlowSolvers.clear();
61  minCostFlowSolvers.resize(threadNum, nullptr);
62 
63  int totalNumEdges = 0;
64  for (auto &curList : adjList)
65  totalNumEdges += curList.size();
66  totalNumEdges += numLeftNodes + numRightNodes;
67 
69  sinkNode = srcNode + 1;
70  for (int i = 0; i < threadNum; i++)
72 
73  if (verbose)
74  {
75  print_info("#ConnectedSubgraphs: " + std::to_string(numConnectedSubgraphs));
76  print_info("#leftNodes: " + std::to_string(numLeftNodes));
77  print_info("#rightNodes: " + std::to_string(numRightNodes));
78  }
79 
80  assert(adjList.size() == (unsigned int)numLeftNodes);
81  for (int i = 0; i < numLeftNodes; i++)
82  {
83  for (unsigned int j = 0; j < adjList[i].size(); j++)
84  {
85  assert(leftId2ConnectedSubgraphId[i] >= 0);
86  int v = adjList[i][j].first + numLeftNodes;
87  float w = adjList[i][j].second;
88  assert(w > 0.00001);
89  minCostFlowSolvers[leftId2ConnectedSubgraphId[i]]->addEdge(i, v, 1, w);
90  }
91  }
92 
93  for (int solverId = 0; solverId < threadNum; solverId++)
94  {
95  for (int i = 0; i < numLeftNodes; i++)
96  {
97  minCostFlowSolvers[solverId]->addEdge(srcNode, i, 1, 0);
98  }
99  for (int i = numLeftNodes; i < numLeftNodes + numRightNodes; i++)
100  {
101  minCostFlowSolvers[solverId]->addEdge(i, sinkNode, 1, 0);
102  }
103  }
104 
105  left2right.clear();
106  right2left.clear();
107  left2right.resize(numLeftNodes, -1);
108  right2left.resize(numRightNodes, -1);
109  }
110 
112  {
113  for (auto minCostFlowSolver : minCostFlowSolvers)
114  delete minCostFlowSolver;
115  }
116 
117  void solve();
118 
119  inline int getMatchedRightNode(int x)
120  {
121  return left2right[x];
122  }
123 
124  private:
128  std::vector<std::vector<std::pair<int, float>>> &adjList;
129  std::vector<std::vector<std::vector<std::pair<int, float>>>> connectedSubgraphAdjList;
130  void getConnectedSubgraphAdjList(std::vector<std::vector<std::pair<int, float>>> &adjList,
131  std::vector<int> &leftId2ConnectedSubgraphId, int &numConnectedSubgraphs,
132  int maxThreadNum);
134  int threadNum = 1;
135  bool verbose;
136 
137  std::vector<MinCostFlow *> minCostFlowSolvers;
138  int srcNode;
139  int sinkNode;
140  std::vector<int> left2right;
141  std::vector<int> right2left;
142 };
143 
144 #endif
MinCostBipartiteMatcher
Definition: MinCostBipartiteMatcher.h:44
MinCostBipartiteMatcher::numLeftNodes
int numLeftNodes
Definition: MinCostBipartiteMatcher.h:125
MinCostBipartiteMatcher::verbose
bool verbose
Definition: MinCostBipartiteMatcher.h:135
MinCostBipartiteMatcher::left2right
std::vector< int > left2right
Definition: MinCostBipartiteMatcher.h:140
MinCostBipartiteMatcher::minCostFlowSolvers
std::vector< MinCostFlow * > minCostFlowSolvers
Definition: MinCostBipartiteMatcher.h:137
paintPlacement.x
list x
Definition: paintPlacement.py:152
MinCostBipartiteMatcher::solve
void solve()
Definition: MinCostBipartiteMatcher.cc:28
MinCostBipartiteMatcher::threadNum
int threadNum
Definition: MinCostBipartiteMatcher.h:134
MinCostBipartiteMatcher::sinkNode
int sinkNode
Definition: MinCostBipartiteMatcher.h:139
MinCostBipartiteMatcher::connectedSubgraphAdjList
std::vector< std::vector< std::vector< std::pair< int, float > > > > connectedSubgraphAdjList
Definition: MinCostBipartiteMatcher.h:129
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
sysInfo.h
MinCostBipartiteMatcher::maxThreadNum
int maxThreadNum
Definition: MinCostBipartiteMatcher.h:133
MinCostBipartiteMatcher::srcNode
int srcNode
Definition: MinCostBipartiteMatcher.h:138
densityVisualization.curList
list curList
Definition: densityVisualization.py:14
MinCostBipartiteMatcher::~MinCostBipartiteMatcher
~MinCostBipartiteMatcher()
Definition: MinCostBipartiteMatcher.h:111
MinCostBipartiteMatcher::adjList
std::vector< std::vector< std::pair< int, float > > > & adjList
Definition: MinCostBipartiteMatcher.h:128
MinCostBipartiteMatcher::numExpectedMatches
int numExpectedMatches
Definition: MinCostBipartiteMatcher.h:127
print_info
void print_info(std::string tmp_string)
Definition: strPrint.cc:39
checkHalfColumn.i
int i
Definition: checkHalfColumn.py:5
MinCostBipartiteMatcher::getMatchedRightNode
int getMatchedRightNode(int x)
Definition: MinCostBipartiteMatcher.h:119
MinCostBipartiteMatcher::MinCostBipartiteMatcher
MinCostBipartiteMatcher(int numLeftNodes, int numRightNodes, int numExpectedMatches, std::vector< std::vector< std::pair< int, float >>> &adjList, int maxThreadNum, bool verbose)
Definition: MinCostBipartiteMatcher.h:46
PlacementInfo.h
This header file mainly contains the definition of class PlacementInfo, including information related...
MinCostBipartiteMatcher::right2left
std::vector< int > right2left
Definition: MinCostBipartiteMatcher.h:141
MinCostBipartiteMatcher::numRightNodes
int numRightNodes
Definition: MinCostBipartiteMatcher.h:126