This commit is contained in:
parent
5661ba80e8
commit
b57ca6e57e
|
@ -507,13 +507,15 @@ void dags::DAGGraph::node_adjust_ingraph_forward(const QList<std::shared_ptr<DAG
|
||||||
{
|
{
|
||||||
int layer_index = 0;
|
int layer_index = 0;
|
||||||
while (this->node_adjust_inlayer_forward(layer_index, total_nodes)) {
|
while (this->node_adjust_inlayer_forward(layer_index, total_nodes)) {
|
||||||
|
this->sort_index_partition_indi(layer_index, total_nodes);
|
||||||
|
this->nodes_sort_with_above(layer_index, total_nodes);
|
||||||
layer_index++;
|
layer_index++;
|
||||||
}
|
|
||||||
|
|
||||||
for (auto idx = 0; idx < layer_index; ++idx) {
|
|
||||||
this->sort_index_partition_indi(idx, total_nodes);
|
|
||||||
this->nodes_sort_with_above(idx, total_nodes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//for (auto idx = 0; idx < layer_index; ++idx) {
|
||||||
|
// this->sort_index_partition_indi(idx, total_nodes);
|
||||||
|
// this->nodes_sort_with_above(idx, total_nodes);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
||||||
|
@ -530,8 +532,8 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std
|
||||||
QList<std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong>> orders_helper;
|
QList<std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong>> orders_helper;
|
||||||
std::transform(curr_layer_nodes.begin(), curr_layer_nodes.end(), std::back_inserter(orders_helper),
|
std::transform(curr_layer_nodes.begin(), curr_layer_nodes.end(), std::back_inserter(orders_helper),
|
||||||
[&](std::shared_ptr<DAGOrderHelper> ins) {
|
[&](std::shared_ptr<DAGOrderHelper> ins) {
|
||||||
auto val_n = this->node_evaluate_with_downstream(ins, total_nodes);
|
|
||||||
auto val_p = this->node_evaluate_with_upstream(ins, total_nodes);
|
auto val_p = this->node_evaluate_with_upstream(ins, total_nodes);
|
||||||
|
auto val_n = this->node_evaluate_with_downstream(ins, total_nodes);
|
||||||
return std::make_tuple(ins, val_n.first, val_n.second, val_p.first, val_p.second);
|
return std::make_tuple(ins, val_n.first, val_n.second, val_p.first, val_p.second);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -540,17 +542,40 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std
|
||||||
std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong> a,
|
std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong> a,
|
||||||
std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong> b)
|
std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong> b)
|
||||||
{
|
{
|
||||||
if (std::get<1>(a) == std::get<1>(b)) {
|
auto prev_nodesa = std::get<0>(a)->getUpstreamNodes();
|
||||||
if (std::get<2>(a) == std::get<2>(b)) {
|
auto prev_nodesb = std::get<0>(b)->getUpstreamNodes();
|
||||||
if (std::get<3>(a) == std::get<3>(b)) {
|
if (!prev_nodesa.size() && !prev_nodesb.size())
|
||||||
return std::get<4>(a) < std::get<4>(b);
|
return a < b;
|
||||||
|
|
||||||
|
if (prev_nodesa.size() && prev_nodesb.size()) {
|
||||||
|
if (std::get<3>(a) == std::get<3>(b)) {
|
||||||
|
if (std::get<4>(a) == std::get<4>(b)) {
|
||||||
|
if (std::get<1>(a) == std::get<1>(b)) {
|
||||||
|
return std::get<2>(a) < std::get<2>(b);
|
||||||
|
}
|
||||||
|
return std::get<1>(a) < std::get<1>(b);
|
||||||
}
|
}
|
||||||
return std::get<3>(a) < std::get<3>(b);
|
return std::get<4>(a) < std::get<4>(b);
|
||||||
}
|
}
|
||||||
return std::get<2>(a) < std::get<2>(b);
|
return std::get<3>(a) < std::get<3>(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::get<1>(a) < std::get<1>(b);
|
if (prev_nodesa.size()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//if (std::get<1>(a) == std::get<1>(b)) {
|
||||||
|
// if (std::get<2>(a) == std::get<2>(b)) {
|
||||||
|
// if (std::get<3>(a) == std::get<3>(b)) {
|
||||||
|
// return std::get<4>(a) < std::get<4>(b);
|
||||||
|
// }
|
||||||
|
// return std::get<3>(a) < std::get<3>(b);
|
||||||
|
// }
|
||||||
|
// return std::get<2>(a) < std::get<2>(b);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//return std::get<1>(a) < std::get<1>(b);
|
||||||
});
|
});
|
||||||
|
|
||||||
QList<int> sort_values;
|
QList<int> sort_values;
|
||||||
|
@ -568,22 +593,19 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std
|
||||||
|
|
||||||
bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
||||||
{
|
{
|
||||||
// ÌáÈ¡²ã´Î½Úµã
|
// 提取层次节点并排序节点
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> nodes_within_current_layer;
|
QList<std::shared_ptr<DAGOrderHelper>> nodes_within_current_layer;
|
||||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(nodes_within_current_layer),
|
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(nodes_within_current_layer),
|
||||||
[=](std::shared_ptr<DAGOrderHelper> inst) {
|
[=](std::shared_ptr<DAGOrderHelper> inst) {
|
||||||
return layer_index == inst->layerNumber();
|
return layer_index == inst->layerNumber();
|
||||||
});
|
});
|
||||||
// ÅÅÐò½Úµã
|
|
||||||
std::sort(nodes_within_current_layer.begin(), nodes_within_current_layer.end(),
|
std::sort(nodes_within_current_layer.begin(), nodes_within_current_layer.end(),
|
||||||
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
||||||
return a->sortNumber() < b->sortNumber();
|
return a->sortNumber() < b->sortNumber();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!nodes_within_current_layer.size())
|
if (!nodes_within_current_layer.size())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
||||||
// »ñÈ¡²¼¾ÖϵÊý
|
// »ñÈ¡²¼¾ÖϵÊý
|
||||||
QList<std::pair<std::shared_ptr<DAGOrderHelper>, QVariant>> sort_helper;
|
QList<std::pair<std::shared_ptr<DAGOrderHelper>, QVariant>> sort_helper;
|
||||||
for (auto& inst : nodes_within_current_layer) {
|
for (auto& inst : nodes_within_current_layer) {
|
||||||
|
@ -597,9 +619,18 @@ bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList<std:
|
||||||
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
||||||
return a->layerNumber() < b->layerNumber();
|
return a->layerNumber() < b->layerNumber();
|
||||||
});
|
});
|
||||||
sort_helper.append(std::make_pair(*anchor_it, (*anchor_it)->sortNumber()));
|
sort_helper.append(std::make_pair(inst, (*anchor_it)->sortNumber()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<QVariant> sort_backup;
|
||||||
|
std::transform(sort_helper.begin(), sort_helper.end(), std::back_inserter(sort_backup),
|
||||||
|
[](std::pair<std::shared_ptr<DAGOrderHelper>, QVariant> u) { return u.second; });
|
||||||
|
|
||||||
|
auto aligned_items_count = std::count_if(sort_backup.begin(), sort_backup.end(), [](QVariant u) { return !u.isNull(); });
|
||||||
|
if (!aligned_items_count)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// 补全布局系数
|
||||||
QVariant start_value;
|
QVariant start_value;
|
||||||
for (auto idx = 0; idx < sort_helper.size(); ++idx) {
|
for (auto idx = 0; idx < sort_helper.size(); ++idx) {
|
||||||
auto curr_u = sort_helper[idx];
|
auto curr_u = sort_helper[idx];
|
||||||
|
@ -612,9 +643,6 @@ bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList<std:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (start_value.isNull())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (int idx = 1; idx < sort_helper.size(); ++idx) {
|
for (int idx = 1; idx < sort_helper.size(); ++idx) {
|
||||||
auto prev_u = sort_helper[idx - 1];
|
auto prev_u = sort_helper[idx - 1];
|
||||||
auto curr_u = sort_helper[idx];
|
auto curr_u = sort_helper[idx];
|
||||||
|
@ -626,9 +654,20 @@ bool dags::DAGGraph::sort_index_partition_indi(int layer_index, const QList<std:
|
||||||
sort_helper[idx] = std::make_pair(curr_u.first, prev_u.second);
|
sort_helper[idx] = std::make_pair(curr_u.first, prev_u.second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double sub_sum = 0;
|
||||||
|
// 计算修正系数
|
||||||
|
for (auto ndx = 0; ndx < sort_backup.size(); ndx++) {
|
||||||
|
auto valbk = sort_backup[ndx];
|
||||||
|
auto val2 = sort_helper[ndx].second;
|
||||||
|
if (!valbk.isNull()) {
|
||||||
|
sub_sum += val2.toDouble() - valbk.toDouble();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
auto val_revised = sub_sum / aligned_items_count;
|
||||||
std::for_each(sort_helper.begin(), sort_helper.end(),
|
std::for_each(sort_helper.begin(), sort_helper.end(),
|
||||||
[](std::pair<std::shared_ptr<DAGOrderHelper>, QVariant> u) {
|
[=](std::pair<std::shared_ptr<DAGOrderHelper>, QVariant> u) {
|
||||||
u.first->setSortNumber(u.second.toDouble());
|
u.first->setSortNumber(u.second.toDouble() - val_revised);
|
||||||
});
|
});
|
||||||
|
|
||||||
this->current_nodelist_filling_indi(nodes_within_current_layer);
|
this->current_nodelist_filling_indi(nodes_within_current_layer);
|
||||||
|
|
Loading…
Reference in New Issue