33 const std::vector<std::pair<int, int>> &cluster2XY)
41 for (
unsigned int clusterA = 1; clusterA <
clusterAdjMat.size(); clusterA++)
42 for (
unsigned int clusterB = 0; clusterB < clusterA; clusterB++)
47 (fabs(cluster2XY[clusterA].first - cluster2XY[clusterB].first) * regionW +
48 y2xRatio * fabs(cluster2XY[clusterA].second - cluster2XY[clusterB].second) * regionH);
49 if (cluster2XY[clusterA].first == 2 || cluster2XY[clusterB].first == 2)
50 resWL += fabs(cluster2XY[clusterA].first - cluster2XY[clusterB].first) * regionW * 0.5;
53 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
55 for (
unsigned int fixedUnitId = 0; fixedUnitId <
cluster2FixedUnitMat[clusterA].size(); fixedUnitId++)
60 (fabs((cluster2XY[clusterA].first * regionW + regionW / 2) -
fixedX[fixedUnitId]) +
61 y2xRatio * fabs((cluster2XY[clusterA].second * regionH + regionH / 2) -
fixedY[fixedUnitId]));
66 for (
int gridY = 0; gridY <
gridH; gridY++)
67 for (
int gridX = 0; gridX <
gridW; gridX++)
69 if (grid2clusters[gridY][gridX].size() > 1)
72 for (
unsigned int clusterAId = 1; clusterAId < grid2clusters[gridY][gridX].size(); clusterAId++)
73 for (
unsigned int clusterBId = 0; clusterBId < clusterAId; clusterBId++)
75 int clusterA = grid2clusters[gridY][gridX][clusterAId];
76 int clusterB = grid2clusters[gridY][gridX][clusterBId];
90 const std::vector<std::pair<int, int>> &cluster2XY)
92 std::vector<bool> placed;
99 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
101 placed.push_back(cluster2XY[clusterA].first >= 0 && cluster2XY[clusterA].second >= 0);
104 for (
unsigned int clusterA = 1; clusterA <
clusterAdjMat.size(); clusterA++)
105 for (
unsigned int clusterB = 0; clusterB < clusterA; clusterB++)
107 if (placed[clusterA] && placed[clusterB])
112 (fabs(cluster2XY[clusterA].first - cluster2XY[clusterB].first) * regionW +
113 y2xRatio * fabs(cluster2XY[clusterA].second - cluster2XY[clusterB].second) * regionH);
117 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
119 for (
unsigned int fixedUnitId = 0; fixedUnitId <
cluster2FixedUnitMat[clusterA].size(); fixedUnitId++)
121 if (placed[clusterA])
127 (fabs((cluster2XY[clusterA].first * regionW + regionW / 2) -
fixedX[fixedUnitId]) +
128 y2xRatio * fabs((cluster2XY[clusterA].second * regionH + regionH / 2) -
fixedY[fixedUnitId]));
134 for (
int gridY = 0; gridY <
gridH; gridY++)
135 for (
int gridX = 0; gridX <
gridW; gridX++)
137 if (grid2clusters[gridY][gridX].size() > 1)
140 for (
unsigned int clusterAId = 1; clusterAId < grid2clusters[gridY][gridX].size(); clusterAId++)
141 for (
unsigned int clusterBId = 0; clusterBId < clusterAId; clusterBId++)
143 int clusterA = grid2clusters[gridY][gridX][clusterAId];
144 int clusterB = grid2clusters[gridY][gridX][clusterBId];
145 assert(placed[clusterA] && placed[clusterB]);
160 std::vector<int>
c = a;
168 for (
int i = N - 1;
i > 0; --
i)
170 int r = rng() % (
i + 1);
177 std::vector<std::vector<std::vector<int>>> &new_grid2clusters,
178 const std::vector<std::pair<int, int>> &cluster2XY,
179 std::vector<std::pair<int, int>> &new_cluster2XY,
float temperature,
188 while ((gridX1 == gridX0 && gridY1 == gridY0) ||
189 (grid2clusters[gridY1][gridX1].size() + grid2clusters[gridY0][gridX0].size()) == 0)
198 new_grid2clusters = grid2clusters;
199 new_cluster2XY = cluster2XY;
201 std::vector<int> clustersMixed;
202 clustersMixed.clear();
203 for (
auto id : grid2clusters[gridY0][gridX0])
204 clustersMixed.push_back(
id);
205 for (
auto id : grid2clusters[gridY1][gridX1])
206 clustersMixed.push_back(
id);
209 for (
unsigned int i = 0;
i < clustersMixed.size();
i++)
211 for (
unsigned int j =
i + 1; j < clustersMixed.size(); j++)
215 int tmp = clustersMixed[
i];
216 clustersMixed[
i] = clustersMixed[j];
217 clustersMixed[j] = tmp;
224 new_grid2clusters[gridY0][gridX0].clear();
225 new_grid2clusters[gridY1][gridX1].clear();
226 for (
auto id : clustersMixed)
230 new_grid2clusters[gridY1][gridX1].push_back(
id);
231 new_cluster2XY[id] = std::pair<int, int>(gridX1, gridY1);
235 new_grid2clusters[gridY0][gridX0].push_back(
id);
236 new_cluster2XY[id] = std::pair<int, int>(gridX0, gridY0);
239 std::sort(new_grid2clusters[gridY0][gridX0].begin(), new_grid2clusters[gridY0][gridX0].
end());
240 std::sort(new_grid2clusters[gridY1][gridX1].begin(), new_grid2clusters[gridY1][gridX1].
end());
241 if (new_grid2clusters[gridY0][gridX0].size() != grid2clusters[gridY0][gridX0].size())
247 bool changed =
false;
248 for (
unsigned int i = 0;
i < grid2clusters[gridY0][gridX0].size();
i++)
250 if (grid2clusters[gridY0][gridX0][
i] != new_grid2clusters[gridY0][gridX0][
i])
285 if (rng() % 20 == 0 && temperature > 0.5)
289 int rowId = rng() %
gridH;
294 int columnId = rng() %
gridW;
295 std::vector<std::vector<int>> tmpVec(
gridH);
296 for (
int tmpI = 0; tmpI <
gridH; tmpI++)
297 tmpVec[tmpI] = new_grid2clusters[tmpI][columnId];
299 for (
int tmpI = 0; tmpI <
gridH; tmpI++)
300 new_grid2clusters[tmpI][columnId] = tmpVec[tmpI];
302 for (
int gridY = 0; gridY <
gridH; gridY++)
303 for (
int gridX = 0; gridX <
gridW; gridX++)
304 for (
auto clusterId : new_grid2clusters[gridY][gridX])
306 new_cluster2XY[clusterId] = std::pair<int, int>(gridX, gridY);
314 std::vector<std::vector<std::vector<int>>> &new_grid2clusters,
315 const std::vector<std::pair<int, int>> &cluster2XY,
316 std::vector<std::pair<int, int>> &new_cluster2XY,
float temperature,
325 while (grid2clusters[gridY0][gridX0].size() == 0)
331 while ((gridX1 == gridX0 && gridY1 == gridY0) || gridY1 < 0 || gridY1 >=
gridH || gridX1 < 0 || gridX1 >=
gridW)
333 gridY1 = (1 - (rng() % 3)) + gridY0;
334 gridX1 = (1 - (rng() % 3)) + gridX0;
337 new_grid2clusters = grid2clusters;
338 new_cluster2XY = cluster2XY;
340 std::vector<int> clustersMixed;
341 clustersMixed.clear();
342 for (
auto id : grid2clusters[gridY0][gridX0])
343 clustersMixed.push_back(
id);
344 for (
auto id : grid2clusters[gridY1][gridX1])
345 clustersMixed.push_back(
id);
348 for (
unsigned int i = 0;
i < clustersMixed.size();
i++)
350 for (
unsigned int j =
i + 1; j < clustersMixed.size(); j++)
354 int tmp = clustersMixed[
i];
355 clustersMixed[
i] = clustersMixed[j];
356 clustersMixed[j] = tmp;
363 new_grid2clusters[gridY0][gridX0].clear();
364 new_grid2clusters[gridY1][gridX1].clear();
365 for (
auto id : clustersMixed)
369 new_grid2clusters[gridY1][gridX1].push_back(
id);
370 new_cluster2XY[id] = std::pair<int, int>(gridX1, gridY1);
374 new_grid2clusters[gridY0][gridX0].push_back(
id);
375 new_cluster2XY[id] = std::pair<int, int>(gridX0, gridY0);
378 std::sort(new_grid2clusters[gridY0][gridX0].begin(), new_grid2clusters[gridY0][gridX0].
end());
379 std::sort(new_grid2clusters[gridY1][gridX1].begin(), new_grid2clusters[gridY1][gridX1].
end());
380 if (new_grid2clusters[gridY0][gridX0].size() != grid2clusters[gridY0][gridX0].size())
386 bool changed =
false;
387 for (
unsigned int i = 0;
i < grid2clusters[gridY0][gridX0].size();
i++)
389 if (grid2clusters[gridY0][gridX0][
i] != new_grid2clusters[gridY0][gridX0][
i])
403 std::vector<std::vector<std::vector<int>>> &new_grid2clusters,
404 const std::vector<std::pair<int, int>> &cluster2XY,
405 std::vector<std::pair<int, int>> &new_cluster2XY, boost::mt19937 &rng)
407 new_grid2clusters = grid2clusters;
408 new_cluster2XY = cluster2XY;
412 int rowId = rng() %
gridH;
417 int columnId = rng() %
gridW;
418 std::vector<std::vector<int>> tmpVec(
gridH);
419 for (
int tmpI = 0; tmpI <
gridH; tmpI++)
420 tmpVec[tmpI] = new_grid2clusters[tmpI][columnId];
422 for (
int tmpI = 0; tmpI <
gridH; tmpI++)
423 new_grid2clusters[tmpI][columnId] = tmpVec[tmpI];
425 for (
int gridY = 0; gridY <
gridH; gridY++)
426 for (
int gridX = 0; gridX <
gridW; gridX++)
427 for (
auto clusterId : new_grid2clusters[gridY][gridX])
429 new_cluster2XY[clusterId] = std::pair<int, int>(gridX, gridY);
443 std::vector<std::pair<int, int>> &init_cluster2XY,
444 std::vector<std::vector<std::vector<int>>> &opt_grid2clusters,
445 std::vector<std::pair<int, int>> &opt_cluster2XY,
int &totalIterNum,
int &workers_randomSeed,
448 std::vector<std::pair<int, int>> cur_cluster2XY = init_cluster2XY;
449 std::vector<std::vector<std::vector<int>>> cur_grid2clusters = init_grid2clusters;
450 std::vector<std::pair<int, int>> new_cluster2XY;
451 std::vector<std::vector<std::vector<int>>> new_grid2clusters;
453 boost::mt19937 rng(workers_randomSeed);
459 int SAIterNum = (totalIterNum - 1);
460 for (
int k = SAIterNum; k >= 0; k--)
463 float temperature = (float)(k + 1) / SAIterNum;
464 new_cluster2XY.clear();
465 new_grid2clusters.clear();
468 saPlacer->
randomShuffleRowColumn(cur_grid2clusters, new_grid2clusters, cur_cluster2XY, new_cluster2XY, rng);
470 saPlacer->
randomSwapInWideRange(cur_grid2clusters, new_grid2clusters, cur_cluster2XY, new_cluster2XY,
474 float thr = (float)rng() / (float)rng.max();
476 if (P >= thr || k > SAIterNum)
479 cur_grid2clusters = new_grid2clusters;
480 cur_cluster2XY = new_cluster2XY;
486 opt_grid2clusters = new_grid2clusters;
487 opt_cluster2XY = new_cluster2XY;
495 const std::vector<std::vector<std::vector<int>>> &init_grid2clusters,
496 std::vector<std::pair<int, int>> &res_cluster2XY,
497 std::vector<std::vector<std::vector<int>>> &res_grid2clusters,
int clusterIdToPlace)
499 std::vector<bool> placed;
502 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
504 placed.push_back(init_cluster2XY[clusterA].first >= 0 && init_cluster2XY[clusterA].second >= 0);
507 int highConnectCluster = -1;
508 float connectRatio = 0;
510 for (
unsigned int clusterB = 0; clusterB <
clusterAdjMat.size(); clusterB++)
512 if (!placed[clusterB])
516 if (
clusterAdjMat[clusterIdToPlace][clusterB] > connectRatio)
519 highConnectCluster = clusterB;
525 if (highConnectCluster < 0)
537 for (
int gridY = 0; gridY <
gridH; gridY++)
538 for (
int gridX = 0; gridX <
gridW; gridX++)
540 std::vector<std::pair<int, int>> new_cluster2XY;
541 std::vector<std::vector<std::vector<int>>> new_grid2clusters;
542 new_cluster2XY = init_cluster2XY;
543 new_grid2clusters = init_grid2clusters;
544 new_cluster2XY[clusterIdToPlace].first = gridX;
545 new_cluster2XY[clusterIdToPlace].second = gridY;
546 new_grid2clusters[gridY][gridX].push_back(clusterIdToPlace);
559 std::vector<std::vector<std::vector<int>>> &tmp_grid2clusters)
561 std::vector<bool> placed;
562 std::vector<int> unplacedClusterIds;
563 unplacedClusterIds.clear();
566 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
568 placed.push_back(tmp_cluster2XY[clusterA].first >= 0 && tmp_cluster2XY[clusterA].second >= 0);
569 if (!(tmp_cluster2XY[clusterA].first >= 0 && tmp_cluster2XY[clusterA].second >= 0))
571 unplacedClusterIds.push_back(clusterA);
575 int highConnectCluster = -1;
576 float connectRatio = 0;
577 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
579 if (placed[clusterA])
581 for (
unsigned int clusterB = 0; clusterB <
clusterAdjMat.size(); clusterB++)
583 if (!placed[clusterB])
590 highConnectCluster = clusterB;
598 if (highConnectCluster < 0)
600 assert(unplacedClusterIds.size());
601 return unplacedClusterIds[random() % unplacedClusterIds.size()];
605 return highConnectCluster;
610 std::vector<std::vector<std::vector<int>>> &init_grid2clusters,
int initOffset)
612 for (
unsigned int clusterId = 0; clusterId <
clusterAdjMat.size(); clusterId++)
614 init_cluster2XY.push_back(std::pair<int, int>(-1, -1));
628 if (random() % 2 == 0)
630 std::vector<std::pair<int, int>> new_cluster2XY;
631 std::vector<std::vector<std::vector<int>>> new_grid2clusters;
632 new_cluster2XY = init_cluster2XY;
633 new_grid2clusters = init_grid2clusters;
637 init_cluster2XY = new_cluster2XY;
638 init_grid2clusters = new_grid2clusters;
666 std::vector<std::pair<int, int>> new_cluster2XY;
667 std::vector<std::vector<std::vector<int>>> new_grid2clusters;
668 new_cluster2XY = init_cluster2XY;
669 new_grid2clusters = init_grid2clusters;
671 greedyPlaceACluster(init_cluster2XY, init_grid2clusters, new_cluster2XY, new_grid2clusters, nextClusterId);
673 init_cluster2XY = new_cluster2XY;
674 init_grid2clusters = new_grid2clusters;
681 std::string dumpSAFile =
"";
685 std::ofstream outfile0;
693 std::vector<std::pair<int, int>> init_cluster2XY;
694 std::vector<std::vector<std::vector<int>>> init_grid2clusters;
696 std::vector<std::thread> threads;
697 std::vector<std::vector<std::pair<int, int>>> workers_cluster2XY;
698 std::vector<std::vector<std::vector<std::vector<int>>>> workers_grid2clusters;
699 std::vector<double> works_E;
700 std::vector<int> workers_randomSeed;
704 std::vector<std::pair<int, double>> seedAndE;
714 workers_cluster2XY.clear();
715 workers_grid2clusters.clear();
717 workers_randomSeed.clear();
719 for (
int threadId = restartI; threadId >= 0 && threadId > restartI -
nJobs; threadId--)
723 init_cluster2XY.clear();
724 init_grid2clusters = std::vector<std::vector<std::vector<int>>>(
725 gridH, std::vector<std::vector<int>>(
gridW, std::vector<int>()));
730 for (
unsigned int clusterA = 0; clusterA <
clusterAdjMat.size(); clusterA++)
732 assert(init_cluster2XY[clusterA].first >= 0 && init_cluster2XY[clusterA].second >= 0);
734 for (
int gridY = 0; gridY <
gridH; gridY++)
736 for (
int gridX = 0; gridX <
gridW; gridX++)
738 std::sort(init_grid2clusters[gridY][gridX].begin(), init_grid2clusters[gridY][gridX].
end());
743 workers_cluster2XY.push_back(init_cluster2XY);
744 workers_grid2clusters.push_back(init_grid2clusters);
745 works_E.push_back(0);
746 workers_randomSeed.push_back(threadId);
748 for (
unsigned int threadId = 0; threadId < workers_cluster2XY.size(); threadId++)
750 threads.push_back(std::thread(
worker,
this, std::ref(init_grid2clusters), std::ref(init_cluster2XY),
751 std::ref(workers_grid2clusters[threadId]),
752 std::ref(workers_cluster2XY[threadId]), std::ref(workerIterNum),
753 std::ref(workers_randomSeed[threadId]), std::ref(works_E[threadId])));
755 for (
unsigned int threadId = 0; threadId < threads.size(); threadId++)
757 threads[threadId].join();
758 seedAndE.emplace_back(workers_randomSeed[threadId], works_E[threadId]);
761 if (works_E[0] <
resE)
768 for (
unsigned int threadId = 1; threadId < threads.size(); threadId++)
770 if (works_E[threadId] <
resE)
772 resE = works_E[threadId];
781 for (
int restartI =
restartNum - 1; restartI >= 0; restartI--)
783 std::cout <<
" " << seedAndE[restartI].first <<
"(" << seedAndE[restartI].second <<
")";
784 if (restartI % 10 == 0)
788 int occupiedRegionNum = 0;
789 for (
int gridY = 0; gridY <
gridH; gridY++)
790 for (
int gridX = 0; gridX <
gridW; gridX++)
797 print_info(
"SA final occupied region num = " + std::to_string(occupiedRegionNum));
799 if (dumpSAFile !=
"")
801 print_info(
"SAPlace handle " + std::to_string(init_cluster2XY.size()) +
802 " cluster(s) and the final placement cost is " + std::to_string(
resE));