Skip to content

Commit 2307ca6

Browse files
committed
docs(generators): use cases and trade-offs
1 parent 0e08458 commit 2307ca6

File tree

3 files changed

+1233
-29
lines changed

3 files changed

+1233
-29
lines changed

docs/extra/generator_front.py

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import matplotlib.pyplot as plt
2+
import os
3+
4+
# Data points for formats (Redundancy, Convenience)
5+
formats = {
6+
"Clang AST": (0.9, 0.0), # High redundancy, low convenience
7+
"XML": (0, 0.1), # Slightly more redundancy and convenience
8+
"Asciidoc": (0.8, 0.8), # Higher convenience, higher redundancy
9+
"HTML": (0.9, 1.0), # Most convenient, slightly more redundant
10+
"Custom Templates": (0.5, 0.6), # Most convenient, slightly more redundant
11+
}
12+
13+
# Hypothetical solutions behind the Pareto front
14+
hypotheticals = [(0.4, 0.05), (0.45, 0.05), (0.7, 0.2), (0.9, 0.45), (1, 0.35)]
15+
16+
# Plotting
17+
plt.figure(figsize=(8, 6))
18+
19+
20+
def calculate_pareto_front(data_points):
21+
# Sort data points by the x-coordinate
22+
data_points.sort()
23+
24+
# Calculate the Pareto front
25+
pareto_front = []
26+
max_y = float('-inf')
27+
for x, y in data_points:
28+
if y > max_y:
29+
pareto_front.append((x, y))
30+
max_y = y
31+
32+
# Create stairs for the Pareto front
33+
min_x = min(data_points, key=lambda x: x[0])[0]
34+
max_x = max(data_points, key=lambda x: x[0])[0]
35+
min_y = min(data_points, key=lambda x: x[1])[1]
36+
max_y = max(data_points, key=lambda x: x[1])[1]
37+
stairs_x = [min_x]
38+
stairs_y = [min_y]
39+
for i in range(len(pareto_front) - 1):
40+
stairs_x.extend([pareto_front[i][0], pareto_front[i + 1][0]])
41+
stairs_y.extend([pareto_front[i][1], pareto_front[i][1]])
42+
stairs_x.append(pareto_front[-1][0])
43+
stairs_y.append(pareto_front[-1][1])
44+
stairs_x.append(max_x)
45+
stairs_y.append(max_y)
46+
47+
return stairs_x, stairs_y
48+
49+
50+
data_points = list(formats.values()) + hypotheticals
51+
pareto_x, pareto_y = calculate_pareto_front(data_points)
52+
plt.plot(pareto_x, pareto_y, linestyle="--", color="gray", label="Best Trade-offs")
53+
54+
# Hypothetical solutions
55+
x_hyp, y_hyp = zip(*hypotheticals)
56+
plt.scatter(x_hyp, y_hyp, color="gray", alpha=0.5, label="Hypothetical")
57+
58+
for label, (x, y) in formats.items():
59+
plt.scatter(x, y, s=100)
60+
plt.annotate(label, (x, y), textcoords="offset points", xytext=(5, 5), ha='center')
61+
62+
# The ideal solution
63+
plt.scatter(0, 1, color="gray", alpha=0.5)
64+
plt.annotate("Ideal", (0, 1), textcoords="offset points", xytext=(5, 5), ha='center')
65+
66+
# Labels and Legend
67+
plt.xlabel("Redundancy")
68+
plt.ylabel("Convenience")
69+
plt.title("Output Formats")
70+
plt.legend()
71+
plt.grid(True)
72+
plt.xticks([])
73+
plt.yticks([])
74+
75+
# Get the directory of the script
76+
script_dir = os.path.dirname(__file__)
77+
78+
# Construct the target path
79+
target_path = os.path.join(script_dir, '../modules/ROOT/images/generator_front.svg')
80+
81+
# Save the plot to the target path
82+
plt.savefig(target_path)

0 commit comments

Comments
 (0)