80 std::vector<float> &retVec,
81 std::vector<LongSimplexId> &treeSimplexId,
82 std::vector<ftm::idNode> &
ttkNotUsed(branching),
83 std::vector<std::vector<ftm::idNode>> &nodeBranching) {
86 float const rootY = retVec[treeSimplexId[treeRoot] * 2 + 1];
87 float const rootOriginY = retVec[treeSimplexId[treeRootOrigin] * 2 + 1];
88 float const rootYmin = std::min(rootY, rootOriginY);
89 float const rootYmax = std::max(rootY, rootOriginY);
91 std::vector<std::tuple<float, float>> allNodeSpanX(
93 std::vector<std::tuple<float, float>> allNodeImportantSpanX(
97 float const nonImportantPairsGap
99 float const importantPairsGap
108 return not compLowerPers(a, b);
112 std::vector<ftm::idNode> leaves;
114 std::sort(leaves.begin(), leaves.end(), compLowerPers);
115 std::queue<ftm::idNode> queue;
116 for(
auto node : leaves)
118 while(!queue.empty()) {
124 retVec[treeSimplexId[nodeOrigin] * 2] = 0;
125 retVec[treeSimplexId[nodeOrigin] * 2 + 1]
126 = nodePers / rootPers * (rootYmax - rootYmin) + rootYmin;
131 std::vector<ftm::idNode> nodeBranchingVector;
132 for(
size_t i = 1; i < nodeBranching[nodeOrigin].size(); ++i)
133 nodeBranchingVector.push_back(nodeBranching[nodeOrigin][i]);
134 std::sort(nodeBranchingVector.begin(), nodeBranchingVector.end(),
138 int lastIndexImportant = -1;
139 for(
size_t i = 0; i < nodeBranchingVector.size(); ++i) {
140 ftm::idNode const nodeBranchingI = nodeBranchingVector[i];
143 float const oldMin = std::get<0>(allNodeSpanX[nodeBranchingI]);
144 float const oldMax = std::get<1>(allNodeSpanX[nodeBranchingI]);
147 float nodeSpacing = 0;
153 nodeSpacing = importantPairsGap;
161 nodeSpacing = nonImportantPairsGap;
172 float const newMin = prevX + nodeSpacing;
173 float const shiftX = newMin - oldMin;
176 dataType nodeBranchingIPers
179 float diffY = retVec[treeSimplexId[nodeBranchingI] * 2 + 1];
180 retVec[treeSimplexId[nodeBranchingI] * 2 + 1]
181 = retVec[treeSimplexId[nodeOrigin] * 2 + 1] - shiftY;
182 diffY = retVec[treeSimplexId[nodeBranchingI] * 2 + 1] - diffY;
185 std::queue<ftm::idNode> queueBranching;
186 queueBranching.emplace(nodeBranchingI);
187 while(!queueBranching.empty()) {
188 ftm::idNode const nodeBranchOrigin = queueBranching.front();
189 queueBranching.pop();
190 retVec[treeSimplexId[nodeBranchOrigin] * 2] += shiftX;
191 if(nodeBranchOrigin != nodeBranchingI)
192 retVec[treeSimplexId[nodeBranchOrigin] * 2 + 1] += diffY;
194 for(
auto nodeB : nodeBranching[nodeBranchOrigin])
195 queueBranching.emplace(nodeB);
199 allNodeSpanX[nodeBranchingI]
200 = std::make_tuple(oldMin + shiftX, oldMax + shiftX);
201 float const oldMinImp
202 = std::get<0>(allNodeImportantSpanX[nodeBranchingI]);
203 float const oldMaxImp
204 = std::get<1>(allNodeImportantSpanX[nodeBranchingI]);
205 allNodeImportantSpanX[nodeBranchingI]
206 = std::make_tuple(oldMinImp + shiftX, oldMaxImp + shiftX);
209 prevX = std::get<1>(allNodeSpanX[nodeBranchingI]);
214 lastIndexImportant = i;
215 prevX = std::get<1>(allNodeImportantSpanX[nodeBranchingI]);
216 if(i < nodeBranchingVector.size() - 1
222 = std::get<0>(allNodeSpanX[nodeBranchingVector[0]]);
224 = std::get<1>(allNodeImportantSpanX
225 [nodeBranchingVector[lastIndexImportant]]);
226 prevX = (spanMin + spanMax) / 2;
232 float spanMin = std::get<0>(allNodeSpanX[nodeBranchingVector[0]]);
233 if(lastIndexImportant != -1) {
234 float const spanMaxImp = std::get<1>(
235 allNodeImportantSpanX[nodeBranchingVector[lastIndexImportant]]);
236 allNodeImportantSpanX[nodeOrigin]
237 = std::make_tuple(spanMin, spanMaxImp);
239 allNodeImportantSpanX[nodeOrigin] = std::make_tuple(0, 0);
242 float const spanMax = std::get<1>(
243 allNodeSpanX[nodeBranchingVector[nodeBranchingVector.size() - 1]]);
244 allNodeSpanX[nodeOrigin] = std::make_tuple(spanMin, spanMax);
246 allNodeSpanX[nodeOrigin] = std::make_tuple(0, 0);
247 allNodeImportantSpanX[nodeOrigin] = std::make_tuple(0, 0);
251 float const spanMin = std::get<0>(allNodeImportantSpanX[nodeOrigin]);
252 float const spanMax = std::get<1>(allNodeImportantSpanX[nodeOrigin]);
253 retVec[treeSimplexId[nodeOrigin] * 2] = (spanMin + spanMax) / 2;
257 for(
auto node : leaves)
259 while(!queue.empty()) {
263 retVec[treeSimplexId[node] * 2] = retVec[treeSimplexId[nodeOrigin] * 2];
264 retVec[treeSimplexId[node] * 2 + 1]
265 = retVec[treeSimplexId[nodeOrigin] * 2 + 1];
275 std::vector<float> &retVec,
276 std::vector<LongSimplexId> &treeSimplexId,
277 std::vector<ftm::idNode> &leaves,
278 double importantPairsGap) {
279 std::queue<ftm::idNode> queue;
280 for(
auto &node : leaves)
290 std::vector<ftm::idNode> children;
292 childSize[i] = children.size();
294 while(!queue.empty()) {
300 std::vector<ftm::idNode> children;
308 if(isNodeImportant) {
310 = {retVec[treeSimplexId[node] * 2], retVec[treeSimplexId[node] * 2],
311 retVec[treeSimplexId[node] * 2 + 1],
312 retVec[treeSimplexId[node] * 2 + 1]};
313 parentOfImportantPair[node] =
true;
315 float nodeX = retVec[treeSimplexId[node] * 2];
318 if(not nodeDone[child1] or not nodeDone[child2])
319 printErr(
"not nodeDone[child1] or not nodeDone[child2]");
320 if(children.size() != 2)
323 double sign = (lowestValue[child1] > lowestValue[child2] ? -1 : 1);
327 float child1XBound = bounds[child1][(sign == -1 ? 1 : 0)];
329 = -child1XBound + nodeX + sign * importantPairsGap / 2.0;
331 tree, child1, child1Shift, retVec, treeSimplexId);
332 bounds[child1][0] += child1Shift;
333 bounds[child1][1] += child1Shift;
334 float child2XBound = bounds[child2][(sign == -1 ? 0 : 1)];
336 = -child2XBound + nodeX + sign * -1 * importantPairsGap / 2.0;
338 tree, child2, child2Shift, retVec, treeSimplexId);
339 bounds[child2][0] += child2Shift;
340 bounds[child2][1] += child2Shift;
346 for(
auto &child : children) {
350 if((isChildImportant or parentOfImportantPair[child])
351 and not parentOfImportantPair[node])
352 bounds[node] = bounds[child];
353 if(isChildImportant or parentOfImportantPair[child]) {
354 bounds[node] = {std::min(bounds[node][0], bounds[child][0]),
355 std::max(bounds[node][1], bounds[child][1]),
356 std::min(bounds[node][2], bounds[child][2]),
357 std::max(bounds[node][3], bounds[child][3])};
358 parentOfImportantPair[node] =
true;
364 lowestValue[node] = tree->
getValue<dataType>(node);
365 for(
auto &child : children) {
367 lowestValue[node] = std::min(lowestValue[node], lowestValue[child]);
369 lowestValue[node] = std::max(lowestValue[node], lowestValue[child]);
373 nodeDone[node] =
true;
375 noChildDone[parent] += 1;
376 if(noChildDone[parent] == childSize[parent])
377 queue.emplace(parent);
408 std::tuple<double, double, double, double, double, double> oldBounds,
410 std::vector<float> &retVec) {
421 int const outNumberOfPoints = nPoints * 2;
422 retVec.resize(outNumberOfPoints);
426 std::vector<ftm::idNode> branching;
427 std::vector<int> branchingID;
428 std::vector<std::vector<ftm::idNode>> nodeBranching;
431 std::stringstream ss;
441 std::queue<ftm::idNode> queue;
445 queue.emplace(treeRoot);
446 while(!queue.empty()) {
451 treeSimplexId[node] = cptNode;
455 std::vector<ftm::idNode> children;
457 for(
size_t i = 0; i < children.size(); ++i) {
458 auto child = children[i];
459 queue.emplace(child);
463 std::stringstream ss2;
470 std::queue<ftm::idNode> queue2;
471 queue2.emplace(treeRoot);
472 while(!queue2.empty()) {
476 retVec[treeSimplexId[node] * 2]
477 = tree->
getValue<dataType>(branching[node]);
478 retVec[treeSimplexId[node] * 2 + 1] = tree->
getValue<dataType>(node);
481 std::vector<ftm::idNode> children;
483 for(
auto child : children)
484 queue2.emplace(child);
493 float x_min, y_min, x_max, y_max;
494 x_min = std::numeric_limits<float>::max();
495 y_min = std::numeric_limits<float>::max();
496 x_max = std::numeric_limits<float>::lowest();
497 y_max = std::numeric_limits<float>::lowest();
498 for(
int i = 0; i < outNumberOfPoints; i += 2) {
499 x_min = std::min(x_min, retVec[i]);
500 x_max = std::max(x_max, retVec[i]);
501 y_min = std::min(y_min, retVec[i + 1]);
502 y_max = std::max(y_max, retVec[i + 1]);
504 auto newBounds = std::make_tuple(x_min, x_max, y_min, y_max, 0, 0);
507 double diff = std::max((std::get<1>(oldBounds) - std::get<0>(oldBounds)),
508 (std::get<3>(oldBounds) - std::get<2>(oldBounds)));
509 double offset = std::max(std::get<0>(oldBounds), std::get<2>(oldBounds));
513 dataType rootVal = tree->
getValue<dataType>(treeRoot);
514 dataType lowestNodeVal = tree->
getValue<dataType>(lowestNode);
515 diff = (rootVal > lowestNodeVal ? rootVal - lowestNodeVal
516 : lowestNodeVal - rootVal);
517 offset = std::min(rootVal, lowestNodeVal);
520 for(
int i = 0; i < outNumberOfPoints; i += 2) {
522 = std::get<1>(newBounds) - std::get<0>(newBounds);
523 divisor1 = (divisor1 == 0 ? 1 : divisor1);
525 = std::get<3>(newBounds) - std::get<2>(newBounds);
526 divisor2 = (divisor2 == 0 ? 1 : divisor2);
529 retVec[i] = (retVec[i] - std::get<0>(newBounds)) / divisor1;
530 retVec[i] = retVec[i] * diff / 2 + offset;
533 retVec[i + 1] = (retVec[i + 1] - std::get<2>(newBounds)) / divisor2;
534 retVec[i + 1] = retVec[i + 1] * diff + offset;
537 std::stringstream ss3;
546 tree, retVec, treeSimplexId, branching, nodeBranching);
554 std::vector<ftm::idNode> leaves;
556 std::vector<int> allNodeLevel;
562 std::sort(leaves.begin(), leaves.end(), compLevel);
565 float rootY = retVec[treeSimplexId[treeRoot] * 2 + 1];
566 float rootOriginY = retVec[treeSimplexId[lowestNode] * 2 + 1];
567 float rootYmin = std::min(rootY, rootOriginY);
568 float rootYmax = std::max(rootY, rootOriginY);
573 std::stack<ftm::idNode> stack;
574 for(
auto node : leaves)
577 while(!stack.empty()) {
580 nodeDone[node] =
true;
581 if(node == treeRoot or node == treeRootOrigin
589 float const nodeDiff = (retVec[treeSimplexId[node] * 2]
590 - retVec[treeSimplexId[nodeOrigin] * 2]);
591 const auto sign = nodeDiff / std::abs(nodeDiff);
592 auto inc = sign * nodePers / rootPers * (rootYmax - rootYmin) / 2;
593 retVec[treeSimplexId[node] * 2]
594 = retVec[treeSimplexId[nodeOrigin] * 2] + inc;
598 while(nodeParent != nodeOrigin) {
599 if(not nodeDone[nodeParent])
600 stack.emplace(nodeParent);
603 oldNodeParent = nodeParent;
605 if(oldNodeParent == nodeParent) {
606 std::stringstream ss5;
607 ss5 <<
"treePlanarLayoutImpl oldNodeParent == nodeParent";
618 retVec[treeSimplexId[node] * 2] = branchY;
621 std::stringstream ss5;
638 std::vector<std::tuple<float, float, float, float>> allBranchBounds(
640 std::vector<std::vector<ftm::idNode>> allBranchOrigins(
643 std::queue<ftm::idNode> queueCrossing;
647 int maxSize = std::numeric_limits<int>::lowest();
648 for(
auto leaf : leaves)
649 queueCrossing.emplace(leaf);
650 while(!queueCrossing.empty()) {
656 std::tuple<std::vector<ftm::idNode>, std::vector<ftm::idNode>>
659 allBranchOrigins[nodeOrigin] = std::get<0>(tupBranchOrigins);
660 std::vector<ftm::idNode> nonBranchOrigins
661 = std::get<1>(tupBranchOrigins);
662 allBranchOrigins[nodeOrigin].insert(allBranchOrigins[nodeOrigin].
end(),
663 nonBranchOrigins.begin(),
664 nonBranchOrigins.end());
665 std::sort(allBranchOrigins[nodeOrigin].
begin(),
666 allBranchOrigins[nodeOrigin].
end(), compValue);
667 allBranchOriginsSize[nodeOrigin] = allBranchOrigins[nodeOrigin].size();
670 for(
size_t i = 0; i < allBranchOrigins[nodeOrigin].size(); ++i) {
671 ftm::idNode const branchNodeOrigin = allBranchOrigins[nodeOrigin][i];
676 if(not isSubBranchImportant)
677 allBranchOriginsSize[nodeOrigin]
678 += allBranchOriginsSize[branchNodeOrigin];
684 maxSize = std::max(maxSize, allBranchOriginsSize[nodeOrigin]);
686 double const nonImportantPairsGap
688 double importantPairsGap = (maxSize)*nonImportantPairsGap * 1.05;
689 bool const customimportantPairsSpacing_
691 if(customimportantPairsSpacing_)
695 for(
auto leaf : leaves)
696 queueCrossing.emplace(leaf);
697 while(!queueCrossing.empty()) {
705 auto restrictedBounds
706 = std::make_tuple(retVec[treeSimplexId[node] * 2],
707 retVec[treeSimplexId[node] * 2], 0, 0);
708 for(
size_t i = 0; i < allBranchOrigins[nodeOrigin].size(); ++i) {
709 ftm::idNode const branchNodeOrigin = allBranchOrigins[nodeOrigin][i];
717 bool const toLeft = not isSubBranchImportant;
721 float const branchNodeOriginXmax
722 = std::get<1>(allBranchBounds[branchNodeOrigin]);
724 = toLeft ? std::get<0>(restrictedBounds) - branchNodeOriginXmax :
726 std::get<1>(restrictedBounds)
727 - retVec[treeSimplexId[branchNode] * 2];
728 shift += (toLeft ? -1 : 1)
729 * (isSubBranchImportant ? importantPairsGap
730 : nonImportantPairsGap);
733 allBranchOrigins[branchNodeOrigin], tree,
734 branchNodeOrigin, shift);
738 for(
size_t i = 1; i < allBranchOrigins[nodeOrigin].size(); ++i) {
739 ftm::idNode const branchNodeOrigin = allBranchOrigins[nodeOrigin][i];
742 for(
size_t j = 0; j < i; ++j) {
743 auto first = allBranchBounds[branchNodeOrigin];
745 = allBranchOrigins[nodeOrigin][j];
746 auto second = allBranchBounds[previousBranchNodeOrigin];
749 first, second, tree, previousBranchNodeOrigin, retVec,
754 int const lastIndex = nodeBranching[branchNodeOrigin].size() - 1;
757 [treeSimplexId[nodeBranching[branchNodeOrigin][lastIndex]]
760 < retVec[treeSimplexId[node] * 2]);
763 float const branchNodeOriginXmax = std::get<1>(first);
764 float const previousbranchNodeOriginXmin = std::get<0>(second);
766 float const previousbranchNodeOriginXmax = std::get<1>(second);
768 = isLeft ? previousbranchNodeOriginXmin - branchNodeOriginXmax :
770 previousbranchNodeOriginXmax
771 - retVec[treeSimplexId[branchNode] * 2];
776 shift += (isLeft ? -1 : 1)
777 * (isSubBranchImportant ? importantPairsGap
778 : nonImportantPairsGap);
784 allBranchOrigins[branchNodeOrigin], tree,
785 branchNodeOrigin, shift);
792 allBranchBounds[nodeOrigin]
805 double realImportantPairsGap = std::numeric_limits<double>::lowest();
827 realImportantPairsGap = importantPairsGap;
830 for(
auto leaf : leaves)
831 queueCrossing.emplace(leaf);
832 while(!queueCrossing.empty()) {
840 if(not isBranchImportant)
843 for(
size_t i = 0; i < allBranchOrigins[nodeOrigin].size(); ++i) {
844 ftm::idNode const branchNodeOrigin = allBranchOrigins[nodeOrigin][i];
850 if(not isSubBranchImportant) {
851 double const gap = retVec[treeSimplexId[node] * 2]
852 - std::get<0>(allBranchBounds[nodeOrigin]);
856 shift = -(importantPairsGap
857 - realImportantPairsGap);
861 allBranchOrigins[branchNodeOrigin], tree,
862 branchNodeOrigin, shift);
866 std::stringstream ss6;
876 tree, retVec, treeSimplexId, leaves, importantPairsGap);