PRCYCoin  2.0.0.7rc1
P2P Digital Currency
adjacency_graphs.cpp
Go to the documentation of this file.
1 // generated by scripts/build_keyboard_adjacency_graphs.py
3 
4 #include <zxcvbn/optional.hpp>
5 
6 #include <array>
7 #include <initializer_list>
8 #include <utility>
9 
10 namespace zxcvbn {
11 
12 static
13 optional::optional<std::string> M(const char *s) {
14  return optional::make_optional(std::string(s));
15 }
16 
17 const auto no = optional::nullopt;
18 
19 const Graphs _graphs = {
21  {"!", {M("`~"), no, no, M("2@"), M("qQ"), no}},
22  {"\"", {M(";:"), M("[{"), M("]}"), no, no, M("/?")}},
23  {"#", {M("2@"), no, no, M("4$"), M("eE"), M("wW")}},
24  {"$", {M("3#"), no, no, M("5%"), M("rR"), M("eE")}},
25  {"%", {M("4$"), no, no, M("6^"), M("tT"), M("rR")}},
26  {"&", {M("6^"), no, no, M("8*"), M("uU"), M("yY")}},
27  {"'", {M(";:"), M("[{"), M("]}"), no, no, M("/?")}},
28  {"(", {M("8*"), no, no, M("0)"), M("oO"), M("iI")}},
29  {")", {M("9("), no, no, M("-_"), M("pP"), M("oO")}},
30  {"*", {M("7&"), no, no, M("9("), M("iI"), M("uU")}},
31  {"+", {M("-_"), no, no, no, M("]}"), M("[{")}},
32  {",", {M("mM"), M("kK"), M("lL"), M(".>"), no, no}},
33  {"-", {M("0)"), no, no, M("=+"), M("[{"), M("pP")}},
34  {".", {M(",<"), M("lL"), M(";:"), M("/?"), no, no}},
35  {"/", {M(".>"), M(";:"), M("'\""), no, no, no}},
36  {"0", {M("9("), no, no, M("-_"), M("pP"), M("oO")}},
37  {"1", {M("`~"), no, no, M("2@"), M("qQ"), no}},
38  {"2", {M("1!"), no, no, M("3#"), M("wW"), M("qQ")}},
39  {"3", {M("2@"), no, no, M("4$"), M("eE"), M("wW")}},
40  {"4", {M("3#"), no, no, M("5%"), M("rR"), M("eE")}},
41  {"5", {M("4$"), no, no, M("6^"), M("tT"), M("rR")}},
42  {"6", {M("5%"), no, no, M("7&"), M("yY"), M("tT")}},
43  {"7", {M("6^"), no, no, M("8*"), M("uU"), M("yY")}},
44  {"8", {M("7&"), no, no, M("9("), M("iI"), M("uU")}},
45  {"9", {M("8*"), no, no, M("0)"), M("oO"), M("iI")}},
46  {":", {M("lL"), M("pP"), M("[{"), M("'\""), M("/?"), M(".>")}},
47  {";", {M("lL"), M("pP"), M("[{"), M("'\""), M("/?"), M(".>")}},
48  {"<", {M("mM"), M("kK"), M("lL"), M(".>"), no, no}},
49  {"=", {M("-_"), no, no, no, M("]}"), M("[{")}},
50  {">", {M(",<"), M("lL"), M(";:"), M("/?"), no, no}},
51  {"?", {M(".>"), M(";:"), M("'\""), no, no, no}},
52  {"@", {M("1!"), no, no, M("3#"), M("wW"), M("qQ")}},
53  {"A", {no, M("qQ"), M("wW"), M("sS"), M("zZ"), no}},
54  {"B", {M("vV"), M("gG"), M("hH"), M("nN"), no, no}},
55  {"C", {M("xX"), M("dD"), M("fF"), M("vV"), no, no}},
56  {"D", {M("sS"), M("eE"), M("rR"), M("fF"), M("cC"), M("xX")}},
57  {"E", {M("wW"), M("3#"), M("4$"), M("rR"), M("dD"), M("sS")}},
58  {"F", {M("dD"), M("rR"), M("tT"), M("gG"), M("vV"), M("cC")}},
59  {"G", {M("fF"), M("tT"), M("yY"), M("hH"), M("bB"), M("vV")}},
60  {"H", {M("gG"), M("yY"), M("uU"), M("jJ"), M("nN"), M("bB")}},
61  {"I", {M("uU"), M("8*"), M("9("), M("oO"), M("kK"), M("jJ")}},
62  {"J", {M("hH"), M("uU"), M("iI"), M("kK"), M("mM"), M("nN")}},
63  {"K", {M("jJ"), M("iI"), M("oO"), M("lL"), M(",<"), M("mM")}},
64  {"L", {M("kK"), M("oO"), M("pP"), M(";:"), M(".>"), M(",<")}},
65  {"M", {M("nN"), M("jJ"), M("kK"), M(",<"), no, no}},
66  {"N", {M("bB"), M("hH"), M("jJ"), M("mM"), no, no}},
67  {"O", {M("iI"), M("9("), M("0)"), M("pP"), M("lL"), M("kK")}},
68  {"P", {M("oO"), M("0)"), M("-_"), M("[{"), M(";:"), M("lL")}},
69  {"Q", {no, M("1!"), M("2@"), M("wW"), M("aA"), no}},
70  {"R", {M("eE"), M("4$"), M("5%"), M("tT"), M("fF"), M("dD")}},
71  {"S", {M("aA"), M("wW"), M("eE"), M("dD"), M("xX"), M("zZ")}},
72  {"T", {M("rR"), M("5%"), M("6^"), M("yY"), M("gG"), M("fF")}},
73  {"U", {M("yY"), M("7&"), M("8*"), M("iI"), M("jJ"), M("hH")}},
74  {"V", {M("cC"), M("fF"), M("gG"), M("bB"), no, no}},
75  {"W", {M("qQ"), M("2@"), M("3#"), M("eE"), M("sS"), M("aA")}},
76  {"X", {M("zZ"), M("sS"), M("dD"), M("cC"), no, no}},
77  {"Y", {M("tT"), M("6^"), M("7&"), M("uU"), M("hH"), M("gG")}},
78  {"Z", {no, M("aA"), M("sS"), M("xX"), no, no}},
79  {"[", {M("pP"), M("-_"), M("=+"), M("]}"), M("'\""), M(";:")}},
80  {"\\", {M("]}"), no, no, no, no, no}},
81  {"]", {M("[{"), M("=+"), no, M("\\|"), no, M("'\"")}},
82  {"^", {M("5%"), no, no, M("7&"), M("yY"), M("tT")}},
83  {"_", {M("0)"), no, no, M("=+"), M("[{"), M("pP")}},
84  {"`", {no, no, no, M("1!"), no, no}},
85  {"a", {no, M("qQ"), M("wW"), M("sS"), M("zZ"), no}},
86  {"b", {M("vV"), M("gG"), M("hH"), M("nN"), no, no}},
87  {"c", {M("xX"), M("dD"), M("fF"), M("vV"), no, no}},
88  {"d", {M("sS"), M("eE"), M("rR"), M("fF"), M("cC"), M("xX")}},
89  {"e", {M("wW"), M("3#"), M("4$"), M("rR"), M("dD"), M("sS")}},
90  {"f", {M("dD"), M("rR"), M("tT"), M("gG"), M("vV"), M("cC")}},
91  {"g", {M("fF"), M("tT"), M("yY"), M("hH"), M("bB"), M("vV")}},
92  {"h", {M("gG"), M("yY"), M("uU"), M("jJ"), M("nN"), M("bB")}},
93  {"i", {M("uU"), M("8*"), M("9("), M("oO"), M("kK"), M("jJ")}},
94  {"j", {M("hH"), M("uU"), M("iI"), M("kK"), M("mM"), M("nN")}},
95  {"k", {M("jJ"), M("iI"), M("oO"), M("lL"), M(",<"), M("mM")}},
96  {"l", {M("kK"), M("oO"), M("pP"), M(";:"), M(".>"), M(",<")}},
97  {"m", {M("nN"), M("jJ"), M("kK"), M(",<"), no, no}},
98  {"n", {M("bB"), M("hH"), M("jJ"), M("mM"), no, no}},
99  {"o", {M("iI"), M("9("), M("0)"), M("pP"), M("lL"), M("kK")}},
100  {"p", {M("oO"), M("0)"), M("-_"), M("[{"), M(";:"), M("lL")}},
101  {"q", {no, M("1!"), M("2@"), M("wW"), M("aA"), no}},
102  {"r", {M("eE"), M("4$"), M("5%"), M("tT"), M("fF"), M("dD")}},
103  {"s", {M("aA"), M("wW"), M("eE"), M("dD"), M("xX"), M("zZ")}},
104  {"t", {M("rR"), M("5%"), M("6^"), M("yY"), M("gG"), M("fF")}},
105  {"u", {M("yY"), M("7&"), M("8*"), M("iI"), M("jJ"), M("hH")}},
106  {"v", {M("cC"), M("fF"), M("gG"), M("bB"), no, no}},
107  {"w", {M("qQ"), M("2@"), M("3#"), M("eE"), M("sS"), M("aA")}},
108  {"x", {M("zZ"), M("sS"), M("dD"), M("cC"), no, no}},
109  {"y", {M("tT"), M("6^"), M("7&"), M("uU"), M("hH"), M("gG")}},
110  {"z", {no, M("aA"), M("sS"), M("xX"), no, no}},
111  {"{", {M("pP"), M("-_"), M("=+"), M("]}"), M("'\""), M(";:")}},
112  {"|", {M("]}"), no, no, no, no, no}},
113  {"}", {M("[{"), M("=+"), no, M("\\|"), no, M("'\"")}},
114  {"~", {no, no, no, M("1!"), no, no}},
115  }},
116  {GraphTag::DVORAK, {
117  {"!", {M("`~"), no, no, M("2@"), M("'\""), no}},
118  {"\"", {no, M("1!"), M("2@"), M(",<"), M("aA"), no}},
119  {"#", {M("2@"), no, no, M("4$"), M(".>"), M(",<")}},
120  {"$", {M("3#"), no, no, M("5%"), M("pP"), M(".>")}},
121  {"%", {M("4$"), no, no, M("6^"), M("yY"), M("pP")}},
122  {"&", {M("6^"), no, no, M("8*"), M("gG"), M("fF")}},
123  {"'", {no, M("1!"), M("2@"), M(",<"), M("aA"), no}},
124  {"(", {M("8*"), no, no, M("0)"), M("rR"), M("cC")}},
125  {")", {M("9("), no, no, M("[{"), M("lL"), M("rR")}},
126  {"*", {M("7&"), no, no, M("9("), M("cC"), M("gG")}},
127  {"+", {M("/?"), M("]}"), no, M("\\|"), no, M("-_")}},
128  {",", {M("'\""), M("2@"), M("3#"), M(".>"), M("oO"), M("aA")}},
129  {"-", {M("sS"), M("/?"), M("=+"), no, no, M("zZ")}},
130  {".", {M(",<"), M("3#"), M("4$"), M("pP"), M("eE"), M("oO")}},
131  {"/", {M("lL"), M("[{"), M("]}"), M("=+"), M("-_"), M("sS")}},
132  {"0", {M("9("), no, no, M("[{"), M("lL"), M("rR")}},
133  {"1", {M("`~"), no, no, M("2@"), M("'\""), no}},
134  {"2", {M("1!"), no, no, M("3#"), M(",<"), M("'\"")}},
135  {"3", {M("2@"), no, no, M("4$"), M(".>"), M(",<")}},
136  {"4", {M("3#"), no, no, M("5%"), M("pP"), M(".>")}},
137  {"5", {M("4$"), no, no, M("6^"), M("yY"), M("pP")}},
138  {"6", {M("5%"), no, no, M("7&"), M("fF"), M("yY")}},
139  {"7", {M("6^"), no, no, M("8*"), M("gG"), M("fF")}},
140  {"8", {M("7&"), no, no, M("9("), M("cC"), M("gG")}},
141  {"9", {M("8*"), no, no, M("0)"), M("rR"), M("cC")}},
142  {":", {no, M("aA"), M("oO"), M("qQ"), no, no}},
143  {";", {no, M("aA"), M("oO"), M("qQ"), no, no}},
144  {"<", {M("'\""), M("2@"), M("3#"), M(".>"), M("oO"), M("aA")}},
145  {"=", {M("/?"), M("]}"), no, M("\\|"), no, M("-_")}},
146  {">", {M(",<"), M("3#"), M("4$"), M("pP"), M("eE"), M("oO")}},
147  {"?", {M("lL"), M("[{"), M("]}"), M("=+"), M("-_"), M("sS")}},
148  {"@", {M("1!"), no, no, M("3#"), M(",<"), M("'\"")}},
149  {"A", {no, M("'\""), M(",<"), M("oO"), M(";:"), no}},
150  {"B", {M("xX"), M("dD"), M("hH"), M("mM"), no, no}},
151  {"C", {M("gG"), M("8*"), M("9("), M("rR"), M("tT"), M("hH")}},
152  {"D", {M("iI"), M("fF"), M("gG"), M("hH"), M("bB"), M("xX")}},
153  {"E", {M("oO"), M(".>"), M("pP"), M("uU"), M("jJ"), M("qQ")}},
154  {"F", {M("yY"), M("6^"), M("7&"), M("gG"), M("dD"), M("iI")}},
155  {"G", {M("fF"), M("7&"), M("8*"), M("cC"), M("hH"), M("dD")}},
156  {"H", {M("dD"), M("gG"), M("cC"), M("tT"), M("mM"), M("bB")}},
157  {"I", {M("uU"), M("yY"), M("fF"), M("dD"), M("xX"), M("kK")}},
158  {"J", {M("qQ"), M("eE"), M("uU"), M("kK"), no, no}},
159  {"K", {M("jJ"), M("uU"), M("iI"), M("xX"), no, no}},
160  {"L", {M("rR"), M("0)"), M("[{"), M("/?"), M("sS"), M("nN")}},
161  {"M", {M("bB"), M("hH"), M("tT"), M("wW"), no, no}},
162  {"N", {M("tT"), M("rR"), M("lL"), M("sS"), M("vV"), M("wW")}},
163  {"O", {M("aA"), M(",<"), M(".>"), M("eE"), M("qQ"), M(";:")}},
164  {"P", {M(".>"), M("4$"), M("5%"), M("yY"), M("uU"), M("eE")}},
165  {"Q", {M(";:"), M("oO"), M("eE"), M("jJ"), no, no}},
166  {"R", {M("cC"), M("9("), M("0)"), M("lL"), M("nN"), M("tT")}},
167  {"S", {M("nN"), M("lL"), M("/?"), M("-_"), M("zZ"), M("vV")}},
168  {"T", {M("hH"), M("cC"), M("rR"), M("nN"), M("wW"), M("mM")}},
169  {"U", {M("eE"), M("pP"), M("yY"), M("iI"), M("kK"), M("jJ")}},
170  {"V", {M("wW"), M("nN"), M("sS"), M("zZ"), no, no}},
171  {"W", {M("mM"), M("tT"), M("nN"), M("vV"), no, no}},
172  {"X", {M("kK"), M("iI"), M("dD"), M("bB"), no, no}},
173  {"Y", {M("pP"), M("5%"), M("6^"), M("fF"), M("iI"), M("uU")}},
174  {"Z", {M("vV"), M("sS"), M("-_"), no, no, no}},
175  {"[", {M("0)"), no, no, M("]}"), M("/?"), M("lL")}},
176  {"\\", {M("=+"), no, no, no, no, no}},
177  {"]", {M("[{"), no, no, no, M("=+"), M("/?")}},
178  {"^", {M("5%"), no, no, M("7&"), M("fF"), M("yY")}},
179  {"_", {M("sS"), M("/?"), M("=+"), no, no, M("zZ")}},
180  {"`", {no, no, no, M("1!"), no, no}},
181  {"a", {no, M("'\""), M(",<"), M("oO"), M(";:"), no}},
182  {"b", {M("xX"), M("dD"), M("hH"), M("mM"), no, no}},
183  {"c", {M("gG"), M("8*"), M("9("), M("rR"), M("tT"), M("hH")}},
184  {"d", {M("iI"), M("fF"), M("gG"), M("hH"), M("bB"), M("xX")}},
185  {"e", {M("oO"), M(".>"), M("pP"), M("uU"), M("jJ"), M("qQ")}},
186  {"f", {M("yY"), M("6^"), M("7&"), M("gG"), M("dD"), M("iI")}},
187  {"g", {M("fF"), M("7&"), M("8*"), M("cC"), M("hH"), M("dD")}},
188  {"h", {M("dD"), M("gG"), M("cC"), M("tT"), M("mM"), M("bB")}},
189  {"i", {M("uU"), M("yY"), M("fF"), M("dD"), M("xX"), M("kK")}},
190  {"j", {M("qQ"), M("eE"), M("uU"), M("kK"), no, no}},
191  {"k", {M("jJ"), M("uU"), M("iI"), M("xX"), no, no}},
192  {"l", {M("rR"), M("0)"), M("[{"), M("/?"), M("sS"), M("nN")}},
193  {"m", {M("bB"), M("hH"), M("tT"), M("wW"), no, no}},
194  {"n", {M("tT"), M("rR"), M("lL"), M("sS"), M("vV"), M("wW")}},
195  {"o", {M("aA"), M(",<"), M(".>"), M("eE"), M("qQ"), M(";:")}},
196  {"p", {M(".>"), M("4$"), M("5%"), M("yY"), M("uU"), M("eE")}},
197  {"q", {M(";:"), M("oO"), M("eE"), M("jJ"), no, no}},
198  {"r", {M("cC"), M("9("), M("0)"), M("lL"), M("nN"), M("tT")}},
199  {"s", {M("nN"), M("lL"), M("/?"), M("-_"), M("zZ"), M("vV")}},
200  {"t", {M("hH"), M("cC"), M("rR"), M("nN"), M("wW"), M("mM")}},
201  {"u", {M("eE"), M("pP"), M("yY"), M("iI"), M("kK"), M("jJ")}},
202  {"v", {M("wW"), M("nN"), M("sS"), M("zZ"), no, no}},
203  {"w", {M("mM"), M("tT"), M("nN"), M("vV"), no, no}},
204  {"x", {M("kK"), M("iI"), M("dD"), M("bB"), no, no}},
205  {"y", {M("pP"), M("5%"), M("6^"), M("fF"), M("iI"), M("uU")}},
206  {"z", {M("vV"), M("sS"), M("-_"), no, no, no}},
207  {"{", {M("0)"), no, no, M("]}"), M("/?"), M("lL")}},
208  {"|", {M("=+"), no, no, no, no, no}},
209  {"}", {M("[{"), no, no, no, M("=+"), M("/?")}},
210  {"~", {no, no, no, M("1!"), no, no}},
211  }},
212  {GraphTag::KEYPAD, {
213  {"*", {M("/"), no, no, no, M("-"), M("+"), M("9"), M("8")}},
214  {"+", {M("9"), M("*"), M("-"), no, no, no, no, M("6")}},
215  {"-", {M("*"), no, no, no, no, no, M("+"), M("9")}},
216  {".", {M("0"), M("2"), M("3"), no, no, no, no, no}},
217  {"/", {no, no, no, no, M("*"), M("9"), M("8"), M("7")}},
218  {"0", {no, M("1"), M("2"), M("3"), M("."), no, no, no}},
219  {"1", {no, no, M("4"), M("5"), M("2"), M("0"), no, no}},
220  {"2", {M("1"), M("4"), M("5"), M("6"), M("3"), M("."), M("0"), no}},
221  {"3", {M("2"), M("5"), M("6"), no, no, no, M("."), M("0")}},
222  {"4", {no, no, M("7"), M("8"), M("5"), M("2"), M("1"), no}},
223  {"5", {M("4"), M("7"), M("8"), M("9"), M("6"), M("3"), M("2"), M("1")}},
224  {"6", {M("5"), M("8"), M("9"), M("+"), no, no, M("3"), M("2")}},
225  {"7", {no, no, no, M("/"), M("8"), M("5"), M("4"), no}},
226  {"8", {M("7"), no, M("/"), M("*"), M("9"), M("6"), M("5"), M("4")}},
227  {"9", {M("8"), M("/"), M("*"), M("-"), M("+"), no, M("6"), M("5")}},
228  }},
230  {"*", {M("/"), no, no, no, no, no, M("-"), M("9")}},
231  {"+", {M("6"), M("9"), M("-"), no, no, no, no, M("3")}},
232  {"-", {M("9"), M("/"), M("*"), no, no, no, M("+"), M("6")}},
233  {".", {M("0"), M("2"), M("3"), no, no, no, no, no}},
234  {"/", {M("="), no, no, no, M("*"), M("-"), M("9"), M("8")}},
235  {"0", {no, M("1"), M("2"), M("3"), M("."), no, no, no}},
236  {"1", {no, no, M("4"), M("5"), M("2"), M("0"), no, no}},
237  {"2", {M("1"), M("4"), M("5"), M("6"), M("3"), M("."), M("0"), no}},
238  {"3", {M("2"), M("5"), M("6"), M("+"), no, no, M("."), M("0")}},
239  {"4", {no, no, M("7"), M("8"), M("5"), M("2"), M("1"), no}},
240  {"5", {M("4"), M("7"), M("8"), M("9"), M("6"), M("3"), M("2"), M("1")}},
241  {"6", {M("5"), M("8"), M("9"), M("-"), M("+"), no, M("3"), M("2")}},
242  {"7", {no, no, no, M("="), M("8"), M("5"), M("4"), no}},
243  {"8", {M("7"), no, M("="), M("/"), M("9"), M("6"), M("5"), M("4")}},
244  {"9", {M("8"), M("="), M("/"), M("*"), M("-"), M("+"), M("6"), M("5")}},
245  {"=", {no, no, no, no, M("/"), M("9"), M("8"), M("7")}},
246  }},
247 };
248 
249 // on qwerty, 'g' has degree 6, being adjacent to 'ftyhbv'. '' has degree 1.
250 // this calculates the average over all keys.
251 static
252 degree_t calc_average_degree(const Graph & graph) {
253  degree_t average = 0;
254  for (const auto & item : graph) {
255  for (const auto & neighbor : item.second) {
256  average += neighbor ? 1 : 0;
257  }
258  }
259  average /= graph.size();
260  return average;
261 }
262 
263 extern const degree_t KEYBOARD_AVERAGE_DEGREE = calc_average_degree(_graphs.at(GraphTag::QWERTY));
264 // slightly different for keypad/mac keypad, but close enough
265 extern const degree_t KEYPAD_AVERAGE_DEGREE = calc_average_degree(_graphs.at(GraphTag::KEYPAD));
266 
267 extern const std::size_t KEYBOARD_STARTING_POSITIONS = _graphs.at(GraphTag::QWERTY).size();
268 extern const std::size_t KEYPAD_STARTING_POSITIONS = _graphs.at(GraphTag::KEYPAD).size();
269 
270 const Graphs & graphs() {
271  return _graphs;
272 }
273 
274 }
zxcvbn::GraphTag::MAC_KEYPAD
@ MAC_KEYPAD
zxcvbn::optional::make_optional
constexpr optional< typename std::decay< T >::type > make_optional(T &&value)
Definition: optional.hpp:151
zxcvbn::KEYBOARD_STARTING_POSITIONS
const std::size_t KEYBOARD_STARTING_POSITIONS
Definition: adjacency_graphs.hpp:47
zxcvbn::GraphTag::KEYPAD
@ KEYPAD
zxcvbn::GraphTag::QWERTY
@ QWERTY
zxcvbn::_graphs
const Graphs _graphs
Definition: adjacency_graphs.cpp:19
zxcvbn
Definition: _frequency_lists.cpp:7
zxcvbn::Graphs
std::unordered_map< GraphTag, Graph > Graphs
Definition: adjacency_graphs.hpp:39
zxcvbn::no
const auto no
Definition: adjacency_graphs.cpp:17
zxcvbn::optional::nullopt
constexpr nullopt_t nullopt
Definition: optional.hpp:23
zxcvbn::GraphTag::DVORAK
@ DVORAK
zxcvbn::degree_t
double degree_t
Definition: adjacency_graphs.hpp:42
zxcvbn::KEYPAD_STARTING_POSITIONS
const std::size_t KEYPAD_STARTING_POSITIONS
Definition: adjacency_graphs.hpp:48
M
#define M(x)
zxcvbn::Graph
std::unordered_map< std::string, std::vector< optional::optional< std::string > >> Graph
Definition: adjacency_graphs.hpp:38
zxcvbn::graphs
const Graphs & graphs()
Definition: adjacency_graphs.cpp:270
adjacency_graphs.hpp
zxcvbn::KEYPAD_AVERAGE_DEGREE
const degree_t KEYPAD_AVERAGE_DEGREE
Definition: adjacency_graphs.hpp:45
zxcvbn::KEYBOARD_AVERAGE_DEGREE
const degree_t KEYBOARD_AVERAGE_DEGREE
Definition: adjacency_graphs.hpp:44
optional.hpp