This commit is contained in:
parent
ddf9b01651
commit
3abf4c5aea
|
@ -3,8 +3,7 @@ using namespace dags;
|
|||
using namespace graph_data;
|
||||
|
||||
DAGLayerHelper::DAGLayerHelper(const Node& bind)
|
||||
: bind_node(bind) {
|
||||
}
|
||||
: bind_node(bind) { }
|
||||
|
||||
Node DAGLayerHelper::bindPoint() const {
|
||||
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)
|
||||
: relate_bind(f), towards_to(t) {
|
||||
}
|
||||
: relate_bind(f), towards_to(t) { }
|
||||
|
||||
bool DAGOrderHelper::isFakeNode() const {
|
||||
return !this->layer_bind;
|
||||
|
@ -228,8 +226,7 @@ QList<std::shared_ptr<DAGOrderHelper>> DAGGraph::tidy_graph_nodes() {
|
|||
}
|
||||
|
||||
#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) {
|
||||
this->nodes_sort_forward_within_layer(layer_index, nodes);
|
||||
this->nodes_sort_with_above(layer_index, nodes);
|
||||
|
@ -250,16 +247,17 @@ void DAGGraph::nodes_sort_forward_within_layer(int layer_index, const QList<std:
|
|||
}
|
||||
}
|
||||
else if (layer_index > 0) {
|
||||
QList<std::shared_ptr<DAGOrderHelper>> nodes_fixed;
|
||||
double min_sortv = DBL_MAX;
|
||||
for (auto target_node : nodes_within_current_layer) {
|
||||
auto upstream_list = target_node->getUpstreamNodes();
|
||||
std::sort(upstream_list.begin(), upstream_list.end(),
|
||||
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) { return a->sortNumber() < b->sortNumber(); });
|
||||
|
||||
if (upstream_list.size()) {
|
||||
auto sort_anchor = upstream_list[(upstream_list.size() - 1) / 2];
|
||||
target_node->setSortNumber(sort_anchor->sortNumber().toInt());
|
||||
nodes_fixed << sort_anchor;
|
||||
QList<double> sort_values;
|
||||
std::transform(upstream_list.begin(), upstream_list.end(), std::back_inserter(sort_values),
|
||||
[](std::shared_ptr<DAGOrderHelper> ins) { return ins->sortNumber().toDouble(); });
|
||||
|
||||
auto vals_sum = std::accumulate(sort_values.begin(), sort_values.end(), 0.0);
|
||||
target_node->setSortNumber(vals_sum / sort_values.size());
|
||||
min_sortv = std::min(target_node->sortNumber().toDouble(), min_sortv);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -269,11 +267,9 @@ void DAGGraph::nodes_sort_forward_within_layer(int layer_index, const QList<std:
|
|||
return ins->sortNumber().isNull();
|
||||
});
|
||||
if (nodes_hangout.size()) {
|
||||
auto min_anchor = std::min_element(nodes_fixed.begin(), nodes_fixed.end(),
|
||||
[](std::shared_ptr<DAGOrderHelper> a, std::shared_ptr<DAGOrderHelper> b) { return a->sortNumber() < b->sortNumber(); });
|
||||
|
||||
auto vspan = 1.0 / (nodes_hangout.size() + 1);
|
||||
for (int idx = 0; idx < nodes_hangout.size(); ++idx) {
|
||||
nodes_hangout[idx]->setSortNumber((*min_anchor)->sortNumber().toInt() - idx - 1);
|
||||
nodes_hangout[idx]->setSortNumber(min_sortv - (idx + 1) * vspan);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -288,8 +284,8 @@ 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;
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
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;
|
||||
while (layer_index > -1) {
|
||||
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;
|
||||
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; });
|
||||
|
@ -404,8 +397,7 @@ QList<std::shared_ptr<DAGOrderHelper>> dags::DAGGraph::layer_adjust_via_next_sib
|
|||
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;
|
||||
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;
|
||||
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;
|
||||
while (this->nodes_revise_forward_within_layer(layer_index, total_nodes)) {
|
||||
this->node_adjust_inlayer_partition_indi(layer_index, total_nodes);
|
||||
|
@ -480,8 +470,7 @@ 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>>& nodes) {
|
||||
if (layer_index) {
|
||||
QList<std::shared_ptr<DAGOrderHelper>> nodes_within_current_layer;
|
||||
std::copy_if(nodes.begin(), nodes.end(), std::back_inserter(nodes_within_current_layer),
|
||||
|
@ -564,8 +553,7 @@ bool dags::DAGGraph::node_adjust_inlayer_forward(int curr_layer, const QList<std
|
|||
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;
|
||||
std::copy_if(total_nodes.begin(), total_nodes.end(), std::back_inserter(nodes_within_current_layer),
|
||||
|
@ -747,18 +735,15 @@ void dags::DAGGraph::primitiveGraphLayout() {
|
|||
this->node_with_layout = tidy_nodes;
|
||||
}
|
||||
|
||||
void dags::DAGGraph::forwardsLayoutImpls()
|
||||
{
|
||||
void dags::DAGGraph::forwardsLayoutImpls() {
|
||||
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);
|
||||
}
|
||||
|
||||
void dags::DAGGraph::adjustLayoutImpls()
|
||||
{
|
||||
void dags::DAGGraph::adjustLayoutImpls() {
|
||||
//this->node_adjust_ingraph_forward(this->node_with_layout);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue