Open
Graph Drawing
Framework

 v. 2023.09 (Elderberry)
 

Loading...
Searching...
No Matches
SyncPlanOptions.h
Go to the documentation of this file.
1
31#pragma once
32
33// enable if you have nlohmann json.hpp available
34#if 0
35
39
40# include <json.hpp>
41
42namespace ogdf::sync_plan {
43
44namespace internal {
45template<typename... Args>
46std::string string_format(const std::string& format, const Args... args) {
47 size_t size = snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0'
48 if (size <= 0) {
49 throw std::runtime_error("Error during formatting.");
50 }
51 std::unique_ptr<char[]> buf(new char[size]);
52 snprintf(buf.get(), size, format.c_str(), args...);
53 return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
54}
55}
56
58class OGDF_EXPORT SyncPlanOptions {
59 struct EdgeOrder {
60 int node;
61 List<string> edges;
62
63 EdgeOrder(int node) : node(node) { }
64 };
65
66 FrozenPipeBij pipes;
67 List<List<int>> partitions;
68 List<EdgeOrder> orders;
69
70public:
71 void parseOptionPipes(char* optarg);
72
73 void parseOptionPartitions(char* optarg);
74
75 void parseOptionEmbedding(char* optarg);
76
77 void apply(Graph& G, GraphAttributes& GA, SyncPlan& pq);
78
79 static void applyConfigJSON(Graph& G, GraphAttributes& GA, SyncPlan& pq, nlohmann::json& j);
80
81 template<typename NodeLabeler = std::function<int(node)>,
82 typename EdgeLabeler = std::function<int(edge)>>
83 static void generateConfigJSON(
84 SyncPlan& pq, nlohmann::json& j,
85 const NodeLabeler& nl = [](node n) -> int { return n->index(); },
86 const EdgeLabeler& el = [](edge e) -> int { return e->index(); }) {
87 using nlohmann::json;
88 json pipes = json::array();
89 for (const auto& pipe : pq.matchings) {
90 json adj1 = json::array(), adj2 = json::array();
91 for (auto edges : pq.matchings.getIncidentEdgeBijection(pipe.node1)) {
92 adj1 += el(edges.first->theEdge());
93 adj2 += el(edges.second->theEdge());
94 }
95 pipes.push_back(json::array({nl(pipe.node1), nl(pipe.node2), adj1, adj2}));
96 }
97 j["pipes"] = pipes;
98
99 json partitions = json::array();
100 json embeddings = json::array();
101 for (int p = 0; p < pq.partitions.partitionCount(); p++) {
102 json ids = json::array();
103 for (node n : pq.partitions.nodesInPartition(p)) {
104 ids += nl(n);
105
106 json adj = json::array();
107 for (adjEntry a : n->adjEntries) {
108 adj += el(a->theEdge());
109 }
110 embeddings.push_back(json::array({nl(n), adj}));
111 }
112 partitions.push_back(ids);
113 }
114 j["partitions"] = partitions;
115 j["embeddings"] = embeddings;
116 }
117};
118
119}
120
121#endif
Utilities for working with the bijections between the edges incident to the two endpoints of a Pipe.
Declaration of class GraphAttributes which extends a Graph by additional attributes.
The main code for modelling and solving Synchronized Planarity instances.
#define OGDF_EXPORT
Specifies that a function or class is exported by the OGDF dynamic library (shared object / DLL),...
Definition config.h:117
NodeElement * node
The type of nodes.
Definition Graph_d.h:71
EdgeElement * edge
The type of edges.
Definition Graph_d.h:75
List< FrozenPipeBijPair > FrozenPipeBij
Definition Bijection.h:51