41 const std::vector<std::vector<std::size_t>>& connections,
42 const std::vector<std::size_t>& reference, std::size_t nnodes) {
43 std::vector<long> refpos(nnodes, -1);
44 for (std::size_t i = 0; i < reference.size(); ++i) refpos[reference[i]] =
static_cast<long>(i);
45 std::vector<double> bary(nnodes, std::numeric_limits<double>::max());
46 for (std::size_t k = 0; k < layer.size(); ++k) {
47 const std::size_t v = layer[k];
50 for (std::size_t c : connections[v]) {
52 sum +=
static_cast<double>(refpos[c]);
56 if (count > 0) bary[v] =
sum / count;
58 std::stable_sort(layer.begin(), layer.end(),
59 [&](std::size_t a, std::size_t b) { return bary[a] < bary[b]; });
67 const std::size_t n = g.
nodes.size();
72 std::vector<std::vector<std::size_t>> succ(n), pred(n);
73 for (std::size_t i = 0; i < n; ++i)
74 for (std::size_t j = 0; j < n; ++j)
81 std::vector<std::vector<std::size_t>>& layers = L.
layers;
82 std::vector<bool> assigned(n,
false);
83 std::size_t nassigned = 0;
84 std::vector<std::size_t> layer0;
85 for (std::size_t v = 0; v < n; ++v)
96 layers.push_back(layer0);
98 while (nassigned < n) {
99 std::vector<std::size_t> next;
100 for (std::size_t v = 0; v < n; ++v) {
101 if (assigned[v])
continue;
103 for (std::size_t p : pred[v])
108 if (all) next.push_back(v);
111 for (std::size_t v = 0; v < n; ++v)
117 for (std::size_t v : next) {
121 layers.push_back(next);
126 if (layers.size() > 1) {
127 std::vector<std::size_t>& last = layers.back();
128 for (std::size_t i = 0; i + 1 < layers.size(); ++i) {
129 std::vector<std::size_t>& layer = layers[i];
130 for (std::size_t k = 0; k < layer.size();) {
131 const std::size_t v = layer[k];
133 layer.erase(layer.begin() +
static_cast<long>(k));
134 if (std::find(last.begin(), last.end(), v) == last.end()) last.push_back(v);
140 std::vector<std::vector<std::size_t>> kept;
141 for (std::size_t i = 0; i < layers.size(); ++i)
142 if (!layers[i].empty()) kept.push_back(layers[i]);
147 for (
int pass = 0; pass < 4; ++pass) {
148 for (std::size_t i = 1; i < layers.size(); ++i)
150 for (std::size_t i = layers.size() >= 2 ? layers.size() - 1 : 0; i-- > 0;)
155 for (std::size_t li = 0; li < layers.size(); ++li) {
156 const std::vector<std::size_t>& layer = layers[li];
157 const double x =
static_cast<double>(li) *
opt.layer_spacing;
158 const double total =
static_cast<double>(layer.size() - 1) *
opt.node_spacing;
159 const double start = total / 2.0;
160 for (std::size_t k = 0; k < layer.size(); ++k) {
162 L.
y[layer[k]] = start -
static_cast<double>(k) *
opt.node_spacing;
void reorder_by_barycenter(std::vector< std::size_t > &layer, const std::vector< std::vector< std::size_t > > &connections, const std::vector< std::size_t > &reference, std::size_t nnodes)
reorderLayerByBarycenter: sort a layer by the mean position of its neighbours in the reference layer.