This commit is contained in:
parent
ddf9b01651
commit
406d4c733e
|
@ -3,8 +3,7 @@ using namespace dags;
|
||||||
using namespace graph_data;
|
using namespace graph_data;
|
||||||
|
|
||||||
DAGLayerHelper::DAGLayerHelper(const Node& bind)
|
DAGLayerHelper::DAGLayerHelper(const Node& bind)
|
||||||
: bind_node(bind) {
|
: bind_node(bind) { }
|
||||||
}
|
|
||||||
|
|
||||||
Node DAGLayerHelper::bindPoint() const {
|
Node DAGLayerHelper::bindPoint() const {
|
||||||
return this->bind_node;
|
return this->bind_node;
|
||||||
|
@ -38,8 +37,7 @@ DAGOrderHelper::DAGOrderHelper(std::shared_ptr<DAGLayerHelper> bind) : layer_bin
|
||||||
}
|
}
|
||||||
|
|
||||||
DAGOrderHelper::DAGOrderHelper(std::shared_ptr<DAGLayerHelper> f, std::shared_ptr<DAGLayerHelper> t)
|
DAGOrderHelper::DAGOrderHelper(std::shared_ptr<DAGLayerHelper> f, std::shared_ptr<DAGLayerHelper> t)
|
||||||
: relate_bind(f), towards_to(t) {
|
: relate_bind(f), towards_to(t) { }
|
||||||
}
|
|
||||||
|
|
||||||
bool DAGOrderHelper::isFakeNode() const {
|
bool DAGOrderHelper::isFakeNode() const {
|
||||||
return !this->layer_bind;
|
return !this->layer_bind;
|
||||||
|
@ -228,8 +226,7 @@ QList<std::shared_ptr<DAGOrderHelper>> DAGGraph::tidy_graph_nodes() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
void dags::DAGGraph::graph_layout_layers_forward(const QList<std::shared_ptr<DAGOrderHelper>>& nodes)
|
void dags::DAGGraph::graph_layout_layers_forward(const QList<std::shared_ptr<DAGOrderHelper>>& nodes) {
|
||||||
{
|
|
||||||
for (auto layer_index = 0; layer_index < maxLayerCount(); ++layer_index) {
|
for (auto layer_index = 0; layer_index < maxLayerCount(); ++layer_index) {
|
||||||
this->nodes_sort_forward_within_layer(layer_index, nodes);
|
this->nodes_sort_forward_within_layer(layer_index, nodes);
|
||||||
this->nodes_sort_with_above(layer_index, nodes);
|
this->nodes_sort_with_above(layer_index, nodes);
|
||||||
|
@ -288,8 +285,7 @@ void DAGGraph::nodes_sort_forward_within_layer(int layer_index, const QList<std:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dags::DAGGraph::current_nodelist_filling_indi(const QList<std::shared_ptr<DAGOrderHelper>>& nodes_within_current_layer)
|
bool dags::DAGGraph::current_nodelist_filling_indi(const QList<std::shared_ptr<DAGOrderHelper>>& nodes_within_current_layer) {
|
||||||
{
|
|
||||||
// 提取节点划分档次
|
// 提取节点划分档次
|
||||||
QList<int> ordered_values;
|
QList<int> ordered_values;
|
||||||
std::transform(nodes_within_current_layer.begin(), nodes_within_current_layer.end(),
|
std::transform(nodes_within_current_layer.begin(), nodes_within_current_layer.end(),
|
||||||
|
@ -329,8 +325,7 @@ bool dags::DAGGraph::current_nodelist_filling_indi(const QList<std::shared_ptr<D
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::nodes_sort_with_above(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes)
|
void dags::DAGGraph::nodes_sort_with_above(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes) {
|
||||||
{
|
|
||||||
// 提取所有已知节点
|
// 提取所有已知节点
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> sorting_nodes;
|
QList<std::shared_ptr<DAGOrderHelper>> sorting_nodes;
|
||||||
std::copy_if(nodes.begin(), nodes.end(), std::back_inserter(sorting_nodes),
|
std::copy_if(nodes.begin(), nodes.end(), std::back_inserter(sorting_nodes),
|
||||||
|
@ -360,8 +355,7 @@ void dags::DAGGraph::nodes_sort_with_above(int layer_index, const QList<std::sha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::graph_adjust_layers_backward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
void dags::DAGGraph::graph_adjust_layers_backward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes) {
|
||||||
{
|
|
||||||
auto layer_index = this->maxLayerCount() - 1;
|
auto layer_index = this->maxLayerCount() - 1;
|
||||||
while (layer_index > -1) {
|
while (layer_index > -1) {
|
||||||
auto nlist = this->layer_adjust_via_next_sibling(layer_index, total_nodes);
|
auto nlist = this->layer_adjust_via_next_sibling(layer_index, total_nodes);
|
||||||
|
@ -371,8 +365,7 @@ void dags::DAGGraph::graph_adjust_layers_backward(const QList<std::shared_ptr<DA
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> dags::DAGGraph::layer_adjust_via_next_sibling(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
QList<std::shared_ptr<DAGOrderHelper>> dags::DAGGraph::layer_adjust_via_next_sibling(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes) {
|
||||||
{
|
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> curr_layer_nodes;
|
QList<std::shared_ptr<DAGOrderHelper>> curr_layer_nodes;
|
||||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(curr_layer_nodes),
|
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(curr_layer_nodes),
|
||||||
[&](std::shared_ptr<DAGOrderHelper> inst) { return inst->layerNumber() == curr_layer; });
|
[&](std::shared_ptr<DAGOrderHelper> inst) { return inst->layerNumber() == curr_layer; });
|
||||||
|
@ -404,8 +397,7 @@ QList<std::shared_ptr<DAGOrderHelper>> dags::DAGGraph::layer_adjust_via_next_sib
|
||||||
return curr_layer_nodes;
|
return curr_layer_nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::node_adjust_via_next_sibling(std::shared_ptr<DAGOrderHelper> curr_node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
void dags::DAGGraph::node_adjust_via_next_sibling(std::shared_ptr<DAGOrderHelper> curr_node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes) {
|
||||||
{
|
|
||||||
// 计算下游调整参考节点
|
// 计算下游调整参考节点
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> next_layer_nodes;
|
QList<std::shared_ptr<DAGOrderHelper>> next_layer_nodes;
|
||||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(next_layer_nodes),
|
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(next_layer_nodes),
|
||||||
|
@ -440,8 +432,7 @@ void dags::DAGGraph::node_adjust_via_next_sibling(std::shared_ptr<DAGOrderHelper
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::nodes_sort_with_belows(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
void dags::DAGGraph::nodes_sort_with_belows(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes) {
|
||||||
{
|
|
||||||
// 提取所有已知节点
|
// 提取所有已知节点
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> sorting_nodes;
|
QList<std::shared_ptr<DAGOrderHelper>> sorting_nodes;
|
||||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(sorting_nodes),
|
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(sorting_nodes),
|
||||||
|
@ -470,8 +461,7 @@ void dags::DAGGraph::nodes_sort_with_belows(int curr_layer, const QList<std::sha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
void dags::DAGGraph::node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes) {
|
||||||
{
|
|
||||||
int layer_index = 0;
|
int layer_index = 0;
|
||||||
while (this->nodes_revise_forward_within_layer(layer_index, total_nodes)) {
|
while (this->nodes_revise_forward_within_layer(layer_index, total_nodes)) {
|
||||||
this->node_adjust_inlayer_partition_indi(layer_index, total_nodes);
|
this->node_adjust_inlayer_partition_indi(layer_index, total_nodes);
|
||||||
|
@ -480,92 +470,41 @@ void dags::DAGGraph::node_adjust_ingraph_forward(const QList<std::shared_ptr<DAG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dags::DAGGraph::nodes_revise_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes)
|
bool dags::DAGGraph::nodes_revise_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes) {
|
||||||
{
|
|
||||||
if (layer_index) {
|
if (layer_index) {
|
||||||
|
QList<std::shared_ptr<DAGOrderHelper>> nodes_within_previous_layer;
|
||||||
|
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(nodes_within_previous_layer),
|
||||||
|
[=](std::shared_ptr<DAGOrderHelper> n) { return n->layerNumber() == layer_index - 1; });
|
||||||
|
std::sort(nodes_within_previous_layer.begin(), nodes_within_previous_layer.end(),
|
||||||
|
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
||||||
|
return a->sortNumber() < b->sortNumber();
|
||||||
|
});
|
||||||
|
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> nodes_within_current_layer;
|
QList<std::shared_ptr<DAGOrderHelper>> nodes_within_current_layer;
|
||||||
std::copy_if(nodes.begin(), 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> n) { return n->layerNumber() == layer_index; });
|
[=](std::shared_ptr<DAGOrderHelper> n) { return n->layerNumber() == layer_index; });
|
||||||
|
std::sort(nodes_within_current_layer.begin(), nodes_within_current_layer.end(),
|
||||||
|
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) {
|
||||||
|
return a->sortNumber() < b->sortNumber();
|
||||||
|
});
|
||||||
|
|
||||||
QList<std::pair<int, int>> sort_arrows;
|
//for (int idx = 0; idx < nodes_within_current_layer.size(); ++idx) {
|
||||||
std::for_each(nodes_within_current_layer.begin(), nodes_within_current_layer.end(),
|
// auto ns_remains = nodes_within_current_layer;
|
||||||
[&](std::shared_ptr<DAGOrderHelper> curr_node) {
|
// auto ns_currs = nodes_within_current_layer
|
||||||
auto prev_nodes = curr_node->getUpstreamNodes();
|
// // µ÷Õû²âÊÔ
|
||||||
std::for_each(prev_nodes.begin(), prev_nodes.end(),
|
// for(auto adj_idx=0; adj_idx<nodes_within_current_layer.size())
|
||||||
[&](std::shared_ptr<DAGOrderHelper> n) {
|
//}
|
||||||
sort_arrows << std::make_pair(n->sortNumber().toInt(), curr_node->sortNumber().toInt());
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
int dags::DAGGraph::forks_evaluate_with_sequence(const QList<std::shared_ptr<DAGOrderHelper>>& prevs, const QList<std::shared_ptr<DAGOrderHelper>>& currs) {
|
||||||
bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
return 0;
|
||||||
{
|
|
||||||
// 挑选当前层次节点
|
|
||||||
QList<std::shared_ptr<DAGOrderHelper>> curr_layer_nodes;
|
|
||||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(curr_layer_nodes),
|
|
||||||
[&](std::shared_ptr<DAGOrderHelper> inst) { return inst->layerNumber() == curr_layer; });
|
|
||||||
|
|
||||||
if (!curr_layer_nodes.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// 计算排序系数
|
|
||||||
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::shared_ptr<DAGOrderHelper> ins) {
|
|
||||||
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);
|
|
||||||
});
|
|
||||||
|
|
||||||
// 排序当前层次节点
|
|
||||||
std::sort(orders_helper.begin(), orders_helper.end(), [](
|
|
||||||
std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong> a,
|
|
||||||
std::tuple<std::shared_ptr<DAGOrderHelper>, qlonglong, qlonglong, qlonglong, qlonglong> b)
|
|
||||||
{
|
|
||||||
auto prev_nodesa = std::get<0>(a)->getUpstreamNodes();
|
|
||||||
auto prev_nodesb = std::get<0>(b)->getUpstreamNodes();
|
|
||||||
if (!prev_nodesa.size() && !prev_nodesb.size())
|
|
||||||
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<4>(a) < std::get<4>(b);
|
|
||||||
}
|
|
||||||
return std::get<3>(a) < std::get<3>(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prev_nodesa.size()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
QList<int> sort_values;
|
|
||||||
std::transform(curr_layer_nodes.begin(), curr_layer_nodes.end(), std::back_inserter(sort_values),
|
|
||||||
[](std::shared_ptr<DAGOrderHelper> ins) { return ins->sortNumber().toInt(); });
|
|
||||||
std::sort(sort_values.begin(), sort_values.end());
|
|
||||||
|
|
||||||
// 重新设定节点次序
|
|
||||||
for (auto idx = 0; idx < sort_values.size(); ++idx) {
|
|
||||||
std::get<0>(orders_helper[idx])->setSortNumber(sort_values[idx]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
bool dags::DAGGraph::node_adjust_inlayer_partition_indi(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
bool dags::DAGGraph::node_adjust_inlayer_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),
|
||||||
|
@ -646,6 +585,7 @@ bool dags::DAGGraph::node_adjust_inlayer_partition_indi(int layer_index, const Q
|
||||||
this->current_nodelist_filling_indi(nodes_within_current_layer);
|
this->current_nodelist_filling_indi(nodes_within_current_layer);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
std::pair<qlonglong, qlonglong> dags::DAGGraph::node_evaluate_with_downstream(std::shared_ptr<DAGOrderHelper> curr_node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
std::pair<qlonglong, qlonglong> dags::DAGGraph::node_evaluate_with_downstream(std::shared_ptr<DAGOrderHelper> curr_node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes)
|
||||||
{
|
{
|
||||||
|
@ -747,19 +687,16 @@ void dags::DAGGraph::primitiveGraphLayout() {
|
||||||
this->node_with_layout = tidy_nodes;
|
this->node_with_layout = tidy_nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::forwardsLayoutImpls()
|
void dags::DAGGraph::forwardsLayoutImpls() {
|
||||||
{
|
|
||||||
this->graph_layout_layers_forward(this->node_with_layout);
|
this->graph_layout_layers_forward(this->node_with_layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::backwardsLayoutImpls()
|
void dags::DAGGraph::backwardsLayoutImpls() {
|
||||||
{
|
|
||||||
this->graph_adjust_layers_backward(this->node_with_layout);
|
this->graph_adjust_layers_backward(this->node_with_layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dags::DAGGraph::adjustLayoutImpls()
|
void dags::DAGGraph::adjustLayoutImpls() {
|
||||||
{
|
this->node_adjust_ingraph_forward(this->node_with_layout);
|
||||||
//this->node_adjust_ingraph_forward(this->node_with_layout);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -104,12 +104,7 @@ namespace dags {
|
||||||
|
|
||||||
void node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
void node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
||||||
bool nodes_revise_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes);
|
bool nodes_revise_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes);
|
||||||
|
int forks_evaluate_with_sequence(const QList<std::shared_ptr<DAGOrderHelper>>& prevs, const QList<std::shared_ptr<DAGOrderHelper>>& currs);
|
||||||
bool node_adjust_inlayer_partition_indi(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
bool node_adjust_inlayer_partition_indi(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
||||||
|
|
||||||
|
|
||||||
//bool node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
||||||
//std::pair<qlonglong, qlonglong> node_evaluate_with_downstream(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
||||||
//std::pair<qlonglong, qlonglong> node_evaluate_with_upstream(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue