diff options
Diffstat (limited to 'Metrics/Metrics-Calculation')
144 files changed, 3286 insertions, 135 deletions
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/.classpath b/Metrics/Metrics-Calculation/SocialNetwork_plugin/.classpath index 58c238b9..4f2afbc9 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/.classpath +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/.classpath | |||
@@ -1,6 +1,7 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | 1 | <?xml version="1.0" encoding="UTF-8"?> |
2 | <classpath> | 2 | <classpath> |
3 | <classpathentry kind="src" path="encore_gen"/> | 3 | <classpathentry kind="src" path="encore_gen"/> |
4 | <classpathentry kind="src" path="queries"/> | ||
4 | <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> | 5 | <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> |
5 | <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> | 6 | <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> |
6 | <classpathentry kind="src" path="src"/> | 7 | <classpathentry kind="src" path="src"/> |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF index b7ec683a..cf5154e4 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF | |||
@@ -7,6 +7,7 @@ Bundle-ClassPath: . | |||
7 | Bundle-Vendor: %providerName | 7 | Bundle-Vendor: %providerName |
8 | Bundle-Localization: plugin | 8 | Bundle-Localization: plugin |
9 | Export-Package: ca.mcgill.ecse.socialnetwork.plugin, | 9 | Export-Package: ca.mcgill.ecse.socialnetwork.plugin, |
10 | queries, | ||
10 | socialnetwork, | 11 | socialnetwork, |
11 | socialnetwork.impl, | 12 | socialnetwork.impl, |
12 | socialnetwork.util | 13 | socialnetwork.util |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore index 683b1de1..8b962bcf 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore | |||
@@ -1 +1,8 @@ | |||
1 | /ca/ | 1 | /ca/ |
2 | /ecore.ecore | ||
3 | /queries/ | ||
4 | /socialnetwork.aird | ||
5 | /socialnetwork.ecore | ||
6 | /socialnetwork.genmodel | ||
7 | /socialnetwork/ | ||
8 | /statistics/ | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2015194.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2015194.xmi new file mode 100644 index 00000000..25ff5ce0 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2015194.xmi | |||
@@ -0,0 +1,132 @@ | |||
1 | <?xml version="1.0" encoding="ASCII"?> | ||
2 | <hu.bme.mit.inf.yakindumm:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hu.bme.mit.inf.yakindumm="hu.bme.mit.inf.yakindumm"> | ||
3 | <regions> | ||
4 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.2/@outgoingTransitions.0"> | ||
5 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
6 | <regions> | ||
7 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.13/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.12/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.12/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.13/@outgoingTransitions.1"> | ||
8 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.12"/> | ||
9 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
10 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.13"/> | ||
11 | </vertices> | ||
12 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.14/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.15/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.15/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.14/@outgoingTransitions.1"> | ||
13 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.7"/> | ||
14 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.14"/> | ||
15 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.15"/> | ||
16 | </vertices> | ||
17 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.1"> | ||
18 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
19 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
20 | </vertices> | ||
21 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.1"> | ||
22 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
23 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
24 | </vertices> | ||
25 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.1"> | ||
26 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/> | ||
27 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/> | ||
28 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.9"/> | ||
29 | </vertices> | ||
30 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.11/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.11/@outgoingTransitions.1"> | ||
31 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
32 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.10"/> | ||
33 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.11"/> | ||
34 | </vertices> | ||
35 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
36 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
37 | </vertices> | ||
38 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.0"> | ||
39 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
40 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
41 | </vertices> | ||
42 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.1"> | ||
43 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
44 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
45 | </vertices> | ||
46 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.2"> | ||
47 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
48 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
49 | </vertices> | ||
50 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.1"> | ||
51 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/> | ||
52 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/> | ||
53 | </vertices> | ||
54 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.2"> | ||
55 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/> | ||
56 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/> | ||
57 | </vertices> | ||
58 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
59 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
60 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
61 | </vertices> | ||
62 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.2"> | ||
63 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
64 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
65 | </vertices> | ||
66 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.1"> | ||
67 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
68 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
69 | </vertices> | ||
70 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.2"> | ||
71 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
72 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
73 | </vertices> | ||
74 | </regions> | ||
75 | </vertices> | ||
76 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
77 | <outgoingTransitions target="//@regions.0/@vertices.0"/> | ||
78 | <regions> | ||
79 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
80 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2"/> | ||
81 | </vertices> | ||
82 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@outgoingTransitions.0"/> | ||
83 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
84 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.1"/> | ||
85 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3"/> | ||
86 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3"/> | ||
87 | <regions> | ||
88 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.1"> | ||
89 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.4"/> | ||
90 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
91 | </vertices> | ||
92 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.1"> | ||
93 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.1"/> | ||
94 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.5"/> | ||
95 | </vertices> | ||
96 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.0"> | ||
97 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
98 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.1"/> | ||
99 | </vertices> | ||
100 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
101 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.2"/> | ||
102 | </vertices> | ||
103 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
104 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.1"/> | ||
105 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.1"/> | ||
106 | </vertices> | ||
107 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.1"> | ||
108 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
109 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
110 | </vertices> | ||
111 | </regions> | ||
112 | </vertices> | ||
113 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.2/@outgoingTransitions.2"> | ||
114 | <regions> | ||
115 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.3/@regions.0/@vertices.2/@outgoingTransitions.1"/> | ||
116 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.3/@regions.0/@vertices.2/@outgoingTransitions.0"/> | ||
117 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.3/@regions.0/@vertices.3/@outgoingTransitions.0"> | ||
118 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3/@regions.0/@vertices.1"/> | ||
119 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3/@regions.0/@vertices.0"/> | ||
120 | </vertices> | ||
121 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
122 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3/@regions.0/@vertices.2"/> | ||
123 | </vertices> | ||
124 | </regions> | ||
125 | </vertices> | ||
126 | </regions> | ||
127 | </vertices> | ||
128 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
129 | <outgoingTransitions target="//@regions.0/@vertices.0"/> | ||
130 | </vertices> | ||
131 | </regions> | ||
132 | </hu.bme.mit.inf.yakindumm:Statechart> | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017131.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017131.xmi new file mode 100644 index 00000000..39780f72 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017131.xmi | |||
@@ -0,0 +1,149 @@ | |||
1 | <?xml version="1.0" encoding="ASCII"?> | ||
2 | <hu.bme.mit.inf.yakindumm:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hu.bme.mit.inf.yakindumm="hu.bme.mit.inf.yakindumm"> | ||
3 | <regions> | ||
4 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.1/@outgoingTransitions.0"> | ||
5 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
6 | <regions> | ||
7 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.0"> | ||
8 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/> | ||
9 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
10 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/> | ||
11 | </vertices> | ||
12 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.1"> | ||
13 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.10"/> | ||
14 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
15 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.9"/> | ||
16 | </vertices> | ||
17 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.11/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.11/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.12/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.12/@outgoingTransitions.1"> | ||
18 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
19 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.12"/> | ||
20 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.11"/> | ||
21 | </vertices> | ||
22 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.1"> | ||
23 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
24 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.7"/> | ||
25 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.6"/> | ||
26 | </vertices> | ||
27 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.2"> | ||
28 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
29 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
30 | </vertices> | ||
31 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
32 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
33 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
34 | </vertices> | ||
35 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.2"> | ||
36 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
37 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
38 | </vertices> | ||
39 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.1"> | ||
40 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
41 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/> | ||
42 | </vertices> | ||
43 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
44 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/> | ||
45 | </vertices> | ||
46 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.2"> | ||
47 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
48 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
49 | </vertices> | ||
50 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.0"> | ||
51 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
52 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/> | ||
53 | </vertices> | ||
54 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.2"> | ||
55 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
56 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
57 | </vertices> | ||
58 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.1"> | ||
59 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
60 | <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/> | ||
61 | </vertices> | ||
62 | </regions> | ||
63 | </vertices> | ||
64 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.4/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.0"> | ||
65 | <outgoingTransitions target="//@regions.0/@vertices.0"/> | ||
66 | <regions> | ||
67 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
68 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.1"/> | ||
69 | </vertices> | ||
70 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.2/@outgoingTransitions.2"> | ||
71 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2"/> | ||
72 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.4"/> | ||
73 | <outgoingTransitions target="//@regions.0/@vertices.3"/> | ||
74 | </vertices> | ||
75 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.1/@outgoingTransitions.0"> | ||
76 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.1"/> | ||
77 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3"/> | ||
78 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.1"/> | ||
79 | </vertices> | ||
80 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.5/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.2/@outgoingTransitions.1"/> | ||
81 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.5/@outgoingTransitions.2"> | ||
82 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.7"/> | ||
83 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.5"/> | ||
84 | </vertices> | ||
85 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.4/@outgoingTransitions.1"> | ||
86 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.4"/> | ||
87 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3"/> | ||
88 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.4"/> | ||
89 | </vertices> | ||
90 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.7/@outgoingTransitions.0"> | ||
91 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
92 | </vertices> | ||
93 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.4/@outgoingTransitions.0"> | ||
94 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.6"/> | ||
95 | <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.6"/> | ||
96 | </vertices> | ||
97 | </regions> | ||
98 | </vertices> | ||
99 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.3/@outgoingTransitions.0 //@regions.0/@vertices.3/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.6/@outgoingTransitions.0"> | ||
100 | <outgoingTransitions target="//@regions.0/@vertices.0"/> | ||
101 | <regions> | ||
102 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.0"> | ||
103 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/> | ||
104 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/> | ||
105 | <outgoingTransitions target="//@regions.0/@vertices.4"/> | ||
106 | </vertices> | ||
107 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.2 //@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.2"/> | ||
108 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
109 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
110 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
111 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/> | ||
112 | </vertices> | ||
113 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.1"> | ||
114 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.4"/> | ||
115 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.6"/> | ||
116 | </vertices> | ||
117 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.0"> | ||
118 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/> | ||
119 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/> | ||
120 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/> | ||
121 | </vertices> | ||
122 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.6/@outgoingTransitions.1"> | ||
123 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
124 | </vertices> | ||
125 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.1"> | ||
126 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.5"/> | ||
127 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.5"/> | ||
128 | </vertices> | ||
129 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
130 | <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/> | ||
131 | </vertices> | ||
132 | </regions> | ||
133 | </vertices> | ||
134 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.1/@outgoingTransitions.2"> | ||
135 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
136 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
137 | </vertices> | ||
138 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.2"> | ||
139 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
140 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
141 | </vertices> | ||
142 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@outgoingTransitions.0"> | ||
143 | <outgoingTransitions target="//@regions.0/@vertices.0"/> | ||
144 | </vertices> | ||
145 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
146 | <outgoingTransitions target="//@regions.0/@vertices.5"/> | ||
147 | </vertices> | ||
148 | </regions> | ||
149 | </hu.bme.mit.inf.yakindumm:Statechart> | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2016324.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/mpc_rep/R_2016324.xmi index 493a1731..493a1731 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2016324.xmi +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/mpc_rep/R_2016324.xmi | |||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017419.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/na_rep/R_2017419.xmi index 369760bf..369760bf 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017419.xmi +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/na_rep/R_2017419.xmi | |||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015225.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/out_d_rep/R_2015225.xmi index 21fee5a9..21fee5a9 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015225.xmi +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/out_d_rep/R_2015225.xmi | |||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015248.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015248.xmi new file mode 100644 index 00000000..e7fe8114 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015248.xmi | |||
@@ -0,0 +1,125 @@ | |||
1 | <?xml version="1.0" encoding="ASCII"?> | ||
2 | <hu.bme.mit.inf.yakindumm:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hu.bme.mit.inf.yakindumm="hu.bme.mit.inf.yakindumm"> | ||
3 | <regions> | ||
4 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
5 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
6 | </vertices> | ||
7 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.12/@outgoingTransitions.0 //@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.6/@outgoingTransitions.0"> | ||
8 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
9 | <outgoingTransitions target="//@regions.0/@vertices.6"/> | ||
10 | </vertices> | ||
11 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.4/@outgoingTransitions.1 //@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.7/@outgoingTransitions.1"> | ||
12 | <outgoingTransitions target="//@regions.0/@vertices.3"/> | ||
13 | <outgoingTransitions target="//@regions.0/@vertices.4"/> | ||
14 | <outgoingTransitions target="//@regions.0/@vertices.7"/> | ||
15 | </vertices> | ||
16 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.8/@outgoingTransitions.0 //@regions.0/@vertices.8/@outgoingTransitions.1 //@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.9/@outgoingTransitions.1"> | ||
17 | <outgoingTransitions target="//@regions.0/@vertices.8"/> | ||
18 | <outgoingTransitions target="//@regions.0/@vertices.5"/> | ||
19 | <outgoingTransitions target="//@regions.0/@vertices.9"/> | ||
20 | </vertices> | ||
21 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@outgoingTransitions.1"> | ||
22 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
23 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
24 | </vertices> | ||
25 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.11/@outgoingTransitions.0 //@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.10/@outgoingTransitions.1 //@regions.0/@vertices.3/@outgoingTransitions.1 //@regions.0/@vertices.11/@outgoingTransitions.1"> | ||
26 | <outgoingTransitions target="//@regions.0/@vertices.12"/> | ||
27 | <outgoingTransitions target="//@regions.0/@vertices.11"/> | ||
28 | <outgoingTransitions target="//@regions.0/@vertices.10"/> | ||
29 | </vertices> | ||
30 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@outgoingTransitions.1"> | ||
31 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
32 | <regions> | ||
33 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
34 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.1"/> | ||
35 | </vertices> | ||
36 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
37 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.3"/> | ||
38 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.2"/> | ||
39 | </vertices> | ||
40 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.2/@outgoingTransitions.1 //@regions.0/@vertices.6/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.6/@regions.0/@vertices.10/@outgoingTransitions.2 //@regions.0/@vertices.6/@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.13/@outgoingTransitions.1"> | ||
41 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.4"/> | ||
42 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.2"/> | ||
43 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.10"/> | ||
44 | </vertices> | ||
45 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.11/@outgoingTransitions.2 //@regions.0/@vertices.6/@regions.0/@vertices.11/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.3/@outgoingTransitions.2 //@regions.0/@vertices.6/@regions.0/@vertices.12/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.8/@outgoingTransitions.0"> | ||
46 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.11"/> | ||
47 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.5"/> | ||
48 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.3"/> | ||
49 | </vertices> | ||
50 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.2/@outgoingTransitions.0"> | ||
51 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.12"/> | ||
52 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.12"/> | ||
53 | </vertices> | ||
54 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.3/@outgoingTransitions.1"> | ||
55 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.13"/> | ||
56 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.13"/> | ||
57 | </vertices> | ||
58 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.11/@outgoingTransitions.1"/> | ||
59 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.10/@outgoingTransitions.1"/> | ||
60 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.12/@outgoingTransitions.1"> | ||
61 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.3"/> | ||
62 | </vertices> | ||
63 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.13/@outgoingTransitions.0"> | ||
64 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.2"/> | ||
65 | </vertices> | ||
66 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.2/@outgoingTransitions.2"> | ||
67 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.2"/> | ||
68 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.7"/> | ||
69 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.2"/> | ||
70 | </vertices> | ||
71 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.3/@outgoingTransitions.0"> | ||
72 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.3"/> | ||
73 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.6"/> | ||
74 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.3"/> | ||
75 | </vertices> | ||
76 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.4/@outgoingTransitions.1"> | ||
77 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.3"/> | ||
78 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.8"/> | ||
79 | </vertices> | ||
80 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.6/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.6/@regions.0/@vertices.5/@outgoingTransitions.1"> | ||
81 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.9"/> | ||
82 | <outgoingTransitions target="//@regions.0/@vertices.6/@regions.0/@vertices.2"/> | ||
83 | </vertices> | ||
84 | </regions> | ||
85 | </vertices> | ||
86 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@outgoingTransitions.2"> | ||
87 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
88 | <outgoingTransitions target="//@regions.0/@vertices.2"/> | ||
89 | </vertices> | ||
90 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@outgoingTransitions.0"> | ||
91 | <outgoingTransitions target="//@regions.0/@vertices.3"/> | ||
92 | <outgoingTransitions target="//@regions.0/@vertices.3"/> | ||
93 | </vertices> | ||
94 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@outgoingTransitions.2"> | ||
95 | <outgoingTransitions target="//@regions.0/@vertices.3"/> | ||
96 | <outgoingTransitions target="//@regions.0/@vertices.3"/> | ||
97 | </vertices> | ||
98 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.5/@outgoingTransitions.2"> | ||
99 | <outgoingTransitions target="//@regions.0/@vertices.5"/> | ||
100 | <outgoingTransitions target="//@regions.0/@vertices.5"/> | ||
101 | </vertices> | ||
102 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.5/@outgoingTransitions.1"> | ||
103 | <outgoingTransitions target="//@regions.0/@vertices.5"/> | ||
104 | <outgoingTransitions target="//@regions.0/@vertices.5"/> | ||
105 | </vertices> | ||
106 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.5/@outgoingTransitions.0"> | ||
107 | <outgoingTransitions target="//@regions.0/@vertices.1"/> | ||
108 | <regions> | ||
109 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry"> | ||
110 | <outgoingTransitions target="//@regions.0/@vertices.12/@regions.0/@vertices.1"/> | ||
111 | </vertices> | ||
112 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.12/@regions.0/@vertices.0/@outgoingTransitions.0"> | ||
113 | <outgoingTransitions target="//@regions.0/@vertices.12/@regions.0/@vertices.2"/> | ||
114 | <outgoingTransitions target="//@regions.0/@vertices.12/@regions.0/@vertices.3"/> | ||
115 | </vertices> | ||
116 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.12/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.12/@regions.0/@vertices.3/@outgoingTransitions.0"> | ||
117 | <outgoingTransitions target="//@regions.0/@vertices.12/@regions.0/@vertices.3"/> | ||
118 | </vertices> | ||
119 | <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.12/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.12/@regions.0/@vertices.2/@outgoingTransitions.0"> | ||
120 | <outgoingTransitions target="//@regions.0/@vertices.12/@regions.0/@vertices.2"/> | ||
121 | </vertices> | ||
122 | </regions> | ||
123 | </vertices> | ||
124 | </regions> | ||
125 | </hu.bme.mit.inf.yakindumm:Statechart> | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/.gitignore deleted file mode 100644 index 17126b28..00000000 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/.gitignore +++ /dev/null | |||
@@ -1,4 +0,0 @@ | |||
1 | # ignore everything in this folder except for this folder it self | ||
2 | |||
3 | * | ||
4 | !.gitignore \ No newline at end of file | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig new file mode 100644 index 00000000..2c83f94f --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig | |||
@@ -0,0 +1,34 @@ | |||
1 | import viatra "./queries/queries/ecore_pattern.vql" | ||
2 | import epackage "http://www.eclipse.org/emf/2002/Ecore" | ||
3 | |||
4 | generate { | ||
5 | metamodel = {package ecore excluding{EClassifier.instanceClass, EClassifier.defaultValue, | ||
6 | EEnumLiteral.instance, EStructuralFeature.defaultValue, EStructuralFeature.changeable, | ||
7 | EStructuralFeature.derived, ENamedElement.name, EClass.interface, EClass.abstract, EClassifier.instanceTypeName, | ||
8 | EClassifier.instanceClassName, EPackage.nsPrefix, EPackage.nsURI, EAnnotation.source, | ||
9 | EAttribute.iD, EDataType.serializable, EEnumLiteral.literal, EEnumLiteral.value, | ||
10 | EGenericType.eTypeParameter, EReference.resolveProxies, EStringToStringMapEntry.key, | ||
11 | EStringToStringMapEntry.value, EStructuralFeature.defaultValueLiteral, EStructuralFeature.transient, | ||
12 | EStructuralFeature.unsettable, EStructuralFeature.volatile, ETypedElement.lowerBound, | ||
13 | ETypedElement.many, ETypedElement.ordered, ETypedElement.required, ETypedElement.unique,ETypedElement.upperBound, | ||
14 | EPackage.eFactoryInstance}} | ||
15 | // metamodel = {EPackage, EClass, EClassifier, EObject, ENamedElement, EModelElement, EReference, EStructuralFeature, ETypedElement} | ||
16 | partial-model = { "inputs/ecore.xmi"} | ||
17 | constraints = { package queries } | ||
18 | |||
19 | |||
20 | solver = ViatraSolver | ||
21 | |||
22 | scope = { | ||
23 | #node = 75 | ||
24 | } | ||
25 | |||
26 | number = 1 | ||
27 | runs = 50 | ||
28 | config = { | ||
29 | log-level = none | ||
30 | } | ||
31 | |||
32 | debug = "debug" | ||
33 | output = "output/Ecore/" | ||
34 | } \ No newline at end of file | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/model/ecore.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/model/ecore.ecore new file mode 100644 index 00000000..eaaf3d11 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/model/ecore.ecore | |||
@@ -0,0 +1,1023 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
3 | xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="ecore" nsURI="http://www.eclipse.org/emf/2002/Ecore" nsPrefix="ecore"> | ||
4 | <eClassifiers xsi:type="ecore:EClass" name="EAnnotation" eSuperTypes="#//EModelElement"> | ||
5 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
6 | <details key="name" value="EAnnotation"/> | ||
7 | <details key="kind" value="elementOnly"/> | ||
8 | </eAnnotations> | ||
9 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
10 | <details key="constraints" value="WellFormedSourceURI"/> | ||
11 | </eAnnotations> | ||
12 | <eStructuralFeatures xsi:type="ecore:EReference" name="details" upperBound="-1" | ||
13 | eType="#//EStringToStringMapEntry" containment="true" resolveProxies="false"> | ||
14 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
15 | <details key="kind" value="element"/> | ||
16 | <details key="name" value="details"/> | ||
17 | </eAnnotations> | ||
18 | </eStructuralFeatures> | ||
19 | <eStructuralFeatures xsi:type="ecore:EReference" name="contents" upperBound="-1" | ||
20 | eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject" containment="true" | ||
21 | resolveProxies="false"> | ||
22 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
23 | <details key="kind" value="element"/> | ||
24 | <details key="name" value="contents"/> | ||
25 | </eAnnotations> | ||
26 | </eStructuralFeatures> | ||
27 | <eStructuralFeatures xsi:type="ecore:EReference" name="references" upperBound="-1" | ||
28 | eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"> | ||
29 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
30 | <details key="kind" value="attribute"/> | ||
31 | <details key="name" value="references"/> | ||
32 | </eAnnotations> | ||
33 | </eStructuralFeatures> | ||
34 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="source" eType="#//EString"> | ||
35 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
36 | <details key="kind" value="attribute"/> | ||
37 | <details key="name" value="source"/> | ||
38 | </eAnnotations> | ||
39 | </eStructuralFeatures> | ||
40 | <eStructuralFeatures xsi:type="ecore:EReference" name="eModelElement" eType="#//EModelElement" | ||
41 | transient="true" eOpposite="#//EModelElement/eAnnotations"/> | ||
42 | </eClassifiers> | ||
43 | <eClassifiers xsi:type="ecore:EClass" name="EAttribute" eSuperTypes="#//EStructuralFeature"> | ||
44 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
45 | <details key="name" value="EAttribute"/> | ||
46 | <details key="kind" value="elementOnly"/> | ||
47 | </eAnnotations> | ||
48 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
49 | <details key="constraints" value="ConsistentTransient"/> | ||
50 | </eAnnotations> | ||
51 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAttributeType" lowerBound="1" | ||
52 | eType="#//EDataType" changeable="false" volatile="true" transient="true" derived="true"> | ||
53 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
54 | <details key="kind" value="attribute"/> | ||
55 | <details key="name" value="eAttributeType"/> | ||
56 | </eAnnotations> | ||
57 | </eStructuralFeatures> | ||
58 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="iD" eType="#//EBoolean"> | ||
59 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
60 | <details key="kind" value="attribute"/> | ||
61 | <details key="name" value="iD"/> | ||
62 | </eAnnotations> | ||
63 | </eStructuralFeatures> | ||
64 | </eClassifiers> | ||
65 | <eClassifiers xsi:type="ecore:EDataType" name="EBigDecimal" instanceClassName="java.math.BigDecimal"> | ||
66 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
67 | <details key="name" value="EBigDecimal"/> | ||
68 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#decimal"/> | ||
69 | </eAnnotations> | ||
70 | </eClassifiers> | ||
71 | <eClassifiers xsi:type="ecore:EDataType" name="EBigInteger" instanceClassName="java.math.BigInteger"> | ||
72 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
73 | <details key="name" value="EBigInteger"/> | ||
74 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#integer"/> | ||
75 | </eAnnotations> | ||
76 | </eClassifiers> | ||
77 | <eClassifiers xsi:type="ecore:EDataType" name="EBoolean" instanceClassName="boolean"> | ||
78 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
79 | <details key="name" value="EBoolean"/> | ||
80 | </eAnnotations> | ||
81 | </eClassifiers> | ||
82 | <eClassifiers xsi:type="ecore:EDataType" name="EBooleanObject" instanceClassName="java.lang.Boolean"> | ||
83 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
84 | <details key="name" value="EBoolean:Object"/> | ||
85 | <details key="baseType" value="EBoolean"/> | ||
86 | </eAnnotations> | ||
87 | </eClassifiers> | ||
88 | <eClassifiers xsi:type="ecore:EDataType" name="EByte" instanceClassName="byte"> | ||
89 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
90 | <details key="name" value="EByte"/> | ||
91 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#byte"/> | ||
92 | </eAnnotations> | ||
93 | </eClassifiers> | ||
94 | <eClassifiers xsi:type="ecore:EDataType" name="EByteArray" instanceClassName="byte[]"> | ||
95 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
96 | <details key="name" value="EByteArray"/> | ||
97 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#hexBinary"/> | ||
98 | </eAnnotations> | ||
99 | </eClassifiers> | ||
100 | <eClassifiers xsi:type="ecore:EDataType" name="EByteObject" instanceClassName="java.lang.Byte"> | ||
101 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
102 | <details key="name" value="EByte:Object"/> | ||
103 | <details key="baseType" value="EByte"/> | ||
104 | </eAnnotations> | ||
105 | </eClassifiers> | ||
106 | <eClassifiers xsi:type="ecore:EDataType" name="EChar" instanceClassName="char"> | ||
107 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
108 | <details key="name" value="EChar"/> | ||
109 | </eAnnotations> | ||
110 | </eClassifiers> | ||
111 | <eClassifiers xsi:type="ecore:EDataType" name="ECharacterObject" instanceClassName="java.lang.Character"> | ||
112 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
113 | <details key="name" value="EChar:Object"/> | ||
114 | <details key="baseType" value="EChar"/> | ||
115 | </eAnnotations> | ||
116 | </eClassifiers> | ||
117 | <eClassifiers xsi:type="ecore:EClass" name="EClass" eSuperTypes="#//EClassifier"> | ||
118 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
119 | <details key="name" value="EClass"/> | ||
120 | <details key="kind" value="elementOnly"/> | ||
121 | </eAnnotations> | ||
122 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
123 | <details key="constraints" value="InterfaceIsAbstract AtMostOneID UniqueFeatureNames UniqueOperationSignatures NoCircularSuperTypes WellFormedMapEntryClass ConsistentSuperTypes DisjointFeatureAndOperationSignatures"/> | ||
124 | </eAnnotations> | ||
125 | <eOperations name="isSuperTypeOf" eType="#//EBoolean"> | ||
126 | <eParameters name="someClass" eType="#//EClass"/> | ||
127 | </eOperations> | ||
128 | <eOperations name="getFeatureCount" eType="#//EInt"/> | ||
129 | <eOperations name="getEStructuralFeature" eType="#//EStructuralFeature"> | ||
130 | <eParameters name="featureID" eType="#//EInt"/> | ||
131 | </eOperations> | ||
132 | <eOperations name="getFeatureID" eType="#//EInt"> | ||
133 | <eParameters name="feature" eType="#//EStructuralFeature"/> | ||
134 | </eOperations> | ||
135 | <eOperations name="getEStructuralFeature" eType="#//EStructuralFeature"> | ||
136 | <eParameters name="featureName" eType="#//EString"/> | ||
137 | </eOperations> | ||
138 | <eOperations name="getOperationCount" eType="#//EInt"/> | ||
139 | <eOperations name="getEOperation" eType="#//EOperation"> | ||
140 | <eParameters name="operationID" eType="#//EInt"/> | ||
141 | </eOperations> | ||
142 | <eOperations name="getOperationID" eType="#//EInt"> | ||
143 | <eParameters name="operation" eType="#//EOperation"/> | ||
144 | </eOperations> | ||
145 | <eOperations name="getOverride" eType="#//EOperation"> | ||
146 | <eParameters name="operation" eType="#//EOperation"/> | ||
147 | </eOperations> | ||
148 | <eStructuralFeatures xsi:type="ecore:EReference" name="eOperations" upperBound="-1" | ||
149 | eType="#//EOperation" containment="true" resolveProxies="false" eOpposite="#//EOperation/eContainingClass"> | ||
150 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
151 | <details key="kind" value="element"/> | ||
152 | <details key="name" value="eOperations"/> | ||
153 | </eAnnotations> | ||
154 | </eStructuralFeatures> | ||
155 | <eStructuralFeatures xsi:type="ecore:EReference" name="eStructuralFeatures" upperBound="-1" | ||
156 | eType="#//EStructuralFeature" containment="true" resolveProxies="false" eOpposite="#//EStructuralFeature/eContainingClass"> | ||
157 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
158 | <details key="kind" value="element"/> | ||
159 | <details key="name" value="eStructuralFeatures"/> | ||
160 | </eAnnotations> | ||
161 | </eStructuralFeatures> | ||
162 | <eStructuralFeatures xsi:type="ecore:EReference" name="eGenericSuperTypes" upperBound="-1" | ||
163 | eType="#//EGenericType" unsettable="true" containment="true" resolveProxies="false"> | ||
164 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
165 | <details key="kind" value="element"/> | ||
166 | <details key="name" value="eGenericSuperTypes"/> | ||
167 | </eAnnotations> | ||
168 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
169 | <details key="suppressedIsSetVisibility" value="true"/> | ||
170 | <details key="suppressedUnsetVisibility" value="true"/> | ||
171 | </eAnnotations> | ||
172 | </eStructuralFeatures> | ||
173 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="abstract" eType="#//EBoolean"> | ||
174 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
175 | <details key="kind" value="attribute"/> | ||
176 | <details key="name" value="abstract"/> | ||
177 | </eAnnotations> | ||
178 | </eStructuralFeatures> | ||
179 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllAttributes" upperBound="-1" | ||
180 | eType="#//EAttribute" changeable="false" volatile="true" transient="true" | ||
181 | derived="true"> | ||
182 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
183 | <details key="kind" value="attribute"/> | ||
184 | <details key="name" value="eAllAttributes"/> | ||
185 | </eAnnotations> | ||
186 | </eStructuralFeatures> | ||
187 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllContainments" upperBound="-1" | ||
188 | eType="#//EReference" changeable="false" volatile="true" transient="true" | ||
189 | derived="true"> | ||
190 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
191 | <details key="kind" value="attribute"/> | ||
192 | <details key="name" value="eAllContainments"/> | ||
193 | </eAnnotations> | ||
194 | </eStructuralFeatures> | ||
195 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllGenericSuperTypes" | ||
196 | upperBound="-1" eType="#//EGenericType" changeable="false" volatile="true" | ||
197 | transient="true" derived="true"> | ||
198 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
199 | <details key="kind" value="attribute"/> | ||
200 | <details key="name" value="eAllGenericSuperTypes"/> | ||
201 | </eAnnotations> | ||
202 | </eStructuralFeatures> | ||
203 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllOperations" upperBound="-1" | ||
204 | eType="#//EOperation" changeable="false" volatile="true" transient="true" | ||
205 | derived="true"> | ||
206 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
207 | <details key="kind" value="attribute"/> | ||
208 | <details key="name" value="eAllOperations"/> | ||
209 | </eAnnotations> | ||
210 | </eStructuralFeatures> | ||
211 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllReferences" upperBound="-1" | ||
212 | eType="#//EReference" changeable="false" volatile="true" transient="true" | ||
213 | derived="true"> | ||
214 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
215 | <details key="kind" value="attribute"/> | ||
216 | <details key="name" value="eAllReferences"/> | ||
217 | </eAnnotations> | ||
218 | </eStructuralFeatures> | ||
219 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllStructuralFeatures" | ||
220 | upperBound="-1" eType="#//EStructuralFeature" changeable="false" volatile="true" | ||
221 | transient="true" derived="true"> | ||
222 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
223 | <details key="kind" value="attribute"/> | ||
224 | <details key="name" value="eAllStructuralFeatures"/> | ||
225 | </eAnnotations> | ||
226 | </eStructuralFeatures> | ||
227 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAllSuperTypes" upperBound="-1" | ||
228 | eType="#//EClass" changeable="false" volatile="true" transient="true" derived="true"> | ||
229 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
230 | <details key="kind" value="attribute"/> | ||
231 | <details key="name" value="eAllSuperTypes"/> | ||
232 | </eAnnotations> | ||
233 | </eStructuralFeatures> | ||
234 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAttributes" upperBound="-1" | ||
235 | eType="#//EAttribute" changeable="false" volatile="true" transient="true" | ||
236 | derived="true"> | ||
237 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
238 | <details key="kind" value="attribute"/> | ||
239 | <details key="name" value="eAttributes"/> | ||
240 | </eAnnotations> | ||
241 | </eStructuralFeatures> | ||
242 | <eStructuralFeatures xsi:type="ecore:EReference" name="eIDAttribute" eType="#//EAttribute" | ||
243 | changeable="false" volatile="true" transient="true" derived="true" resolveProxies="false"> | ||
244 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
245 | <details key="kind" value="attribute"/> | ||
246 | <details key="name" value="eIDAttribute"/> | ||
247 | </eAnnotations> | ||
248 | </eStructuralFeatures> | ||
249 | <eStructuralFeatures xsi:type="ecore:EReference" name="eReferences" upperBound="-1" | ||
250 | eType="#//EReference" changeable="false" volatile="true" transient="true" | ||
251 | derived="true"> | ||
252 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
253 | <details key="kind" value="attribute"/> | ||
254 | <details key="name" value="eReferences"/> | ||
255 | </eAnnotations> | ||
256 | </eStructuralFeatures> | ||
257 | <eStructuralFeatures xsi:type="ecore:EReference" name="eSuperTypes" upperBound="-1" | ||
258 | eType="#//EClass" unsettable="true"> | ||
259 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
260 | <details key="kind" value="attribute"/> | ||
261 | <details key="name" value="eSuperTypes"/> | ||
262 | </eAnnotations> | ||
263 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
264 | <details key="suppressedIsSetVisibility" value="true"/> | ||
265 | <details key="suppressedUnsetVisibility" value="true"/> | ||
266 | </eAnnotations> | ||
267 | </eStructuralFeatures> | ||
268 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="interface" eType="#//EBoolean"> | ||
269 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
270 | <details key="kind" value="attribute"/> | ||
271 | <details key="name" value="interface"/> | ||
272 | </eAnnotations> | ||
273 | </eStructuralFeatures> | ||
274 | </eClassifiers> | ||
275 | <eClassifiers xsi:type="ecore:EClass" name="EClassifier" abstract="true" eSuperTypes="#//ENamedElement"> | ||
276 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
277 | <details key="name" value="EClassifier"/> | ||
278 | <details key="kind" value="elementOnly"/> | ||
279 | </eAnnotations> | ||
280 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
281 | <details key="constraints" value="WellFormedInstanceTypeName UniqueTypeParameterNames"/> | ||
282 | </eAnnotations> | ||
283 | <eOperations name="isInstance" eType="#//EBoolean"> | ||
284 | <eParameters name="object" eType="#//EJavaObject"/> | ||
285 | </eOperations> | ||
286 | <eOperations name="getClassifierID" eType="#//EInt"/> | ||
287 | <eStructuralFeatures xsi:type="ecore:EReference" name="eTypeParameters" upperBound="-1" | ||
288 | eType="#//ETypeParameter" containment="true"> | ||
289 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
290 | <details key="kind" value="element"/> | ||
291 | <details key="name" value="eTypeParameters"/> | ||
292 | </eAnnotations> | ||
293 | </eStructuralFeatures> | ||
294 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultValue" eType="#//EJavaObject" | ||
295 | changeable="false" volatile="true" transient="true" derived="true"> | ||
296 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
297 | <details key="kind" value="attribute"/> | ||
298 | <details key="name" value="defaultValue"/> | ||
299 | </eAnnotations> | ||
300 | </eStructuralFeatures> | ||
301 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="instanceClass" changeable="false" | ||
302 | volatile="true" transient="true" derived="true"> | ||
303 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
304 | <details key="kind" value="attribute"/> | ||
305 | <details key="name" value="instanceClass"/> | ||
306 | </eAnnotations> | ||
307 | <eGenericType eClassifier="#//EJavaClass"> | ||
308 | <eTypeArguments/> | ||
309 | </eGenericType> | ||
310 | </eStructuralFeatures> | ||
311 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="instanceClassName" eType="#//EString" | ||
312 | volatile="true" unsettable="true"> | ||
313 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
314 | <details key="kind" value="attribute"/> | ||
315 | <details key="name" value="instanceClassName"/> | ||
316 | </eAnnotations> | ||
317 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
318 | <details key="suppressedIsSetVisibility" value="true"/> | ||
319 | <details key="suppressedUnsetVisibility" value="true"/> | ||
320 | </eAnnotations> | ||
321 | </eStructuralFeatures> | ||
322 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="instanceTypeName" eType="#//EString" | ||
323 | volatile="true" unsettable="true"> | ||
324 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
325 | <details key="kind" value="attribute"/> | ||
326 | <details key="name" value="instanceTypeName"/> | ||
327 | </eAnnotations> | ||
328 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
329 | <details key="suppressedIsSetVisibility" value="true"/> | ||
330 | <details key="suppressedUnsetVisibility" value="true"/> | ||
331 | </eAnnotations> | ||
332 | </eStructuralFeatures> | ||
333 | <eStructuralFeatures xsi:type="ecore:EReference" name="ePackage" eType="#//EPackage" | ||
334 | transient="true" eOpposite="#//EPackage/eClassifiers"/> | ||
335 | </eClassifiers> | ||
336 | <eClassifiers xsi:type="ecore:EClass" name="EDataType" eSuperTypes="#//EClassifier"> | ||
337 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
338 | <details key="name" value="EDataType"/> | ||
339 | <details key="kind" value="elementOnly"/> | ||
340 | </eAnnotations> | ||
341 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="serializable" eType="#//EBoolean" | ||
342 | defaultValueLiteral="true"> | ||
343 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
344 | <details key="kind" value="attribute"/> | ||
345 | <details key="name" value="serializable"/> | ||
346 | </eAnnotations> | ||
347 | </eStructuralFeatures> | ||
348 | </eClassifiers> | ||
349 | <eClassifiers xsi:type="ecore:EDataType" name="EDate" instanceClassName="java.util.Date"> | ||
350 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
351 | <details key="name" value="EDate"/> | ||
352 | </eAnnotations> | ||
353 | </eClassifiers> | ||
354 | <eClassifiers xsi:type="ecore:EDataType" name="EDiagnosticChain" instanceClassName="org.eclipse.emf.common.util.DiagnosticChain" | ||
355 | serializable="false"> | ||
356 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
357 | <details key="name" value="EDiagnosticChain"/> | ||
358 | </eAnnotations> | ||
359 | </eClassifiers> | ||
360 | <eClassifiers xsi:type="ecore:EDataType" name="EDouble" instanceClassName="double"> | ||
361 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
362 | <details key="name" value="EDouble"/> | ||
363 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#double"/> | ||
364 | </eAnnotations> | ||
365 | </eClassifiers> | ||
366 | <eClassifiers xsi:type="ecore:EDataType" name="EDoubleObject" instanceClassName="java.lang.Double"> | ||
367 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
368 | <details key="name" value="EDouble:Object"/> | ||
369 | <details key="baseType" value="EDouble"/> | ||
370 | </eAnnotations> | ||
371 | </eClassifiers> | ||
372 | <eClassifiers xsi:type="ecore:EDataType" name="EEList" instanceClassName="org.eclipse.emf.common.util.EList" | ||
373 | serializable="false"> | ||
374 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
375 | <details key="name" value="EEList"/> | ||
376 | </eAnnotations> | ||
377 | <eTypeParameters name="E"/> | ||
378 | </eClassifiers> | ||
379 | <eClassifiers xsi:type="ecore:EClass" name="EEnum" eSuperTypes="#//EDataType"> | ||
380 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
381 | <details key="name" value="EEnum"/> | ||
382 | <details key="kind" value="elementOnly"/> | ||
383 | </eAnnotations> | ||
384 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
385 | <details key="constraints" value="UniqueEnumeratorNames UniqueEnumeratorLiterals"/> | ||
386 | </eAnnotations> | ||
387 | <eOperations name="getEEnumLiteral" eType="#//EEnumLiteral"> | ||
388 | <eParameters name="name" eType="#//EString"/> | ||
389 | </eOperations> | ||
390 | <eOperations name="getEEnumLiteral" eType="#//EEnumLiteral"> | ||
391 | <eParameters name="value" eType="#//EInt"/> | ||
392 | </eOperations> | ||
393 | <eOperations name="getEEnumLiteralByLiteral" eType="#//EEnumLiteral"> | ||
394 | <eParameters name="literal" eType="#//EString"/> | ||
395 | </eOperations> | ||
396 | <eStructuralFeatures xsi:type="ecore:EReference" name="eLiterals" upperBound="-1" | ||
397 | eType="#//EEnumLiteral" containment="true" resolveProxies="false" eOpposite="#//EEnumLiteral/eEnum"> | ||
398 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
399 | <details key="kind" value="element"/> | ||
400 | <details key="name" value="eLiterals"/> | ||
401 | </eAnnotations> | ||
402 | </eStructuralFeatures> | ||
403 | </eClassifiers> | ||
404 | <eClassifiers xsi:type="ecore:EDataType" name="EEnumerator" instanceClassName="org.eclipse.emf.common.util.Enumerator" | ||
405 | serializable="false"> | ||
406 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
407 | <details key="name" value="EEnumerator"/> | ||
408 | </eAnnotations> | ||
409 | </eClassifiers> | ||
410 | <eClassifiers xsi:type="ecore:EClass" name="EEnumLiteral" eSuperTypes="#//ENamedElement"> | ||
411 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
412 | <details key="name" value="EEnumLiteral"/> | ||
413 | <details key="kind" value="elementOnly"/> | ||
414 | </eAnnotations> | ||
415 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="instance" eType="#//EEnumerator" | ||
416 | transient="true"> | ||
417 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
418 | <details key="kind" value="attribute"/> | ||
419 | <details key="name" value="instance"/> | ||
420 | </eAnnotations> | ||
421 | </eStructuralFeatures> | ||
422 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="literal" eType="#//EString"> | ||
423 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
424 | <details key="kind" value="attribute"/> | ||
425 | <details key="name" value="literal"/> | ||
426 | </eAnnotations> | ||
427 | </eStructuralFeatures> | ||
428 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//EInt"> | ||
429 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
430 | <details key="kind" value="attribute"/> | ||
431 | <details key="name" value="value"/> | ||
432 | </eAnnotations> | ||
433 | </eStructuralFeatures> | ||
434 | <eStructuralFeatures xsi:type="ecore:EReference" name="eEnum" eType="#//EEnum" | ||
435 | transient="true" eOpposite="#//EEnum/eLiterals"/> | ||
436 | </eClassifiers> | ||
437 | <eClassifiers xsi:type="ecore:EClass" name="EFactory" eSuperTypes="#//EModelElement"> | ||
438 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
439 | <details key="name" value="EFactory"/> | ||
440 | <details key="kind" value="elementOnly"/> | ||
441 | </eAnnotations> | ||
442 | <eOperations name="create" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"> | ||
443 | <eParameters name="eClass" eType="#//EClass"/> | ||
444 | </eOperations> | ||
445 | <eOperations name="createFromString" eType="#//EJavaObject"> | ||
446 | <eParameters name="eDataType" eType="#//EDataType"/> | ||
447 | <eParameters name="literalValue" eType="#//EString"/> | ||
448 | </eOperations> | ||
449 | <eOperations name="convertToString" eType="#//EString"> | ||
450 | <eParameters name="eDataType" eType="#//EDataType"/> | ||
451 | <eParameters name="instanceValue" eType="#//EJavaObject"/> | ||
452 | </eOperations> | ||
453 | <eStructuralFeatures xsi:type="ecore:EReference" name="ePackage" lowerBound="1" | ||
454 | eType="#//EPackage" transient="true" resolveProxies="false" eOpposite="#//EPackage/eFactoryInstance"> | ||
455 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
456 | <details key="kind" value="attribute"/> | ||
457 | <details key="name" value="ePackage"/> | ||
458 | </eAnnotations> | ||
459 | </eStructuralFeatures> | ||
460 | </eClassifiers> | ||
461 | <eClassifiers xsi:type="ecore:EDataType" name="EFeatureMap" instanceClassName="org.eclipse.emf.ecore.util.FeatureMap" | ||
462 | serializable="false"> | ||
463 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
464 | <details key="name" value="EFeatureMap"/> | ||
465 | </eAnnotations> | ||
466 | </eClassifiers> | ||
467 | <eClassifiers xsi:type="ecore:EDataType" name="EFeatureMapEntry" instanceClassName="org.eclipse.emf.ecore.util.FeatureMap$Entry" | ||
468 | serializable="false"> | ||
469 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
470 | <details key="name" value="EFeatureMapEntry"/> | ||
471 | </eAnnotations> | ||
472 | </eClassifiers> | ||
473 | <eClassifiers xsi:type="ecore:EDataType" name="EFloat" instanceClassName="float"> | ||
474 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
475 | <details key="name" value="EFloat"/> | ||
476 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#float"/> | ||
477 | </eAnnotations> | ||
478 | </eClassifiers> | ||
479 | <eClassifiers xsi:type="ecore:EDataType" name="EFloatObject" instanceClassName="java.lang.Float"> | ||
480 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
481 | <details key="name" value="EFloat:Object"/> | ||
482 | <details key="baseType" value="EFloat"/> | ||
483 | </eAnnotations> | ||
484 | </eClassifiers> | ||
485 | <eClassifiers xsi:type="ecore:EClass" name="EGenericType"> | ||
486 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
487 | <details key="name" value="EGenericType"/> | ||
488 | <details key="kind" value="elementOnly"/> | ||
489 | </eAnnotations> | ||
490 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
491 | <details key="constraints" value="ConsistentType ConsistentBounds ConsistentArguments"/> | ||
492 | </eAnnotations> | ||
493 | <eStructuralFeatures xsi:type="ecore:EReference" name="eUpperBound" eType="#//EGenericType" | ||
494 | containment="true" resolveProxies="false"> | ||
495 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
496 | <details key="kind" value="element"/> | ||
497 | <details key="name" value="eUpperBound"/> | ||
498 | </eAnnotations> | ||
499 | </eStructuralFeatures> | ||
500 | <eStructuralFeatures xsi:type="ecore:EReference" name="eTypeArguments" upperBound="-1" | ||
501 | eType="#//EGenericType" containment="true" resolveProxies="false"> | ||
502 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
503 | <details key="kind" value="element"/> | ||
504 | <details key="name" value="eTypeArguments"/> | ||
505 | </eAnnotations> | ||
506 | </eStructuralFeatures> | ||
507 | <eStructuralFeatures xsi:type="ecore:EReference" name="eLowerBound" eType="#//EGenericType" | ||
508 | containment="true" resolveProxies="false"> | ||
509 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
510 | <details key="kind" value="element"/> | ||
511 | <details key="name" value="eLowerBound"/> | ||
512 | </eAnnotations> | ||
513 | </eStructuralFeatures> | ||
514 | <eStructuralFeatures xsi:type="ecore:EReference" name="eClassifier" eType="#//EClassifier"> | ||
515 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
516 | <details key="kind" value="attribute"/> | ||
517 | <details key="name" value="eClassifier"/> | ||
518 | </eAnnotations> | ||
519 | </eStructuralFeatures> | ||
520 | <eStructuralFeatures xsi:type="ecore:EReference" name="eRawType" lowerBound="1" | ||
521 | eType="#//EClassifier" changeable="false" transient="true" derived="true"> | ||
522 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
523 | <details key="kind" value="attribute"/> | ||
524 | <details key="name" value="eRawType"/> | ||
525 | </eAnnotations> | ||
526 | </eStructuralFeatures> | ||
527 | <eStructuralFeatures xsi:type="ecore:EReference" name="eTypeParameter" eType="#//ETypeParameter" | ||
528 | resolveProxies="false"> | ||
529 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
530 | <details key="kind" value="attribute"/> | ||
531 | <details key="name" value="eTypeParameter"/> | ||
532 | </eAnnotations> | ||
533 | </eStructuralFeatures> | ||
534 | </eClassifiers> | ||
535 | <eClassifiers xsi:type="ecore:EDataType" name="EInt" instanceClassName="int"> | ||
536 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
537 | <details key="name" value="EInt"/> | ||
538 | </eAnnotations> | ||
539 | </eClassifiers> | ||
540 | <eClassifiers xsi:type="ecore:EDataType" name="EIntegerObject" instanceClassName="java.lang.Integer"> | ||
541 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
542 | <details key="name" value="EInt:Object"/> | ||
543 | <details key="baseType" value="EInt"/> | ||
544 | </eAnnotations> | ||
545 | </eClassifiers> | ||
546 | <eClassifiers xsi:type="ecore:EDataType" name="EInvocationTargetException" instanceClassName="java.lang.reflect.InvocationTargetException" | ||
547 | serializable="false"> | ||
548 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
549 | <details key="name" value="EInvocationTargetException"/> | ||
550 | </eAnnotations> | ||
551 | </eClassifiers> | ||
552 | <eClassifiers xsi:type="ecore:EDataType" name="EJavaClass" instanceClassName="java.lang.Class"> | ||
553 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
554 | <details key="name" value="EJavaClass"/> | ||
555 | </eAnnotations> | ||
556 | <eTypeParameters name="T"/> | ||
557 | </eClassifiers> | ||
558 | <eClassifiers xsi:type="ecore:EDataType" name="EJavaObject" instanceClassName="java.lang.Object"> | ||
559 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
560 | <details key="name" value="EJavaObject"/> | ||
561 | </eAnnotations> | ||
562 | </eClassifiers> | ||
563 | <eClassifiers xsi:type="ecore:EDataType" name="ELong" instanceClassName="long"> | ||
564 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
565 | <details key="name" value="ELong"/> | ||
566 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#long"/> | ||
567 | </eAnnotations> | ||
568 | </eClassifiers> | ||
569 | <eClassifiers xsi:type="ecore:EDataType" name="ELongObject" instanceClassName="java.lang.Long"> | ||
570 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
571 | <details key="name" value="ELong:Object"/> | ||
572 | <details key="baseType" value="ELong"/> | ||
573 | </eAnnotations> | ||
574 | </eClassifiers> | ||
575 | <eClassifiers xsi:type="ecore:EDataType" name="EMap" instanceClassName="java.util.Map" | ||
576 | serializable="false"> | ||
577 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
578 | <details key="name" value="EMap"/> | ||
579 | </eAnnotations> | ||
580 | <eTypeParameters name="K"/> | ||
581 | <eTypeParameters name="V"/> | ||
582 | </eClassifiers> | ||
583 | <eClassifiers xsi:type="ecore:EClass" name="EModelElement" abstract="true"> | ||
584 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
585 | <details key="name" value="EModelElement"/> | ||
586 | <details key="kind" value="elementOnly"/> | ||
587 | </eAnnotations> | ||
588 | <eOperations name="getEAnnotation" eType="#//EAnnotation"> | ||
589 | <eParameters name="source" eType="#//EString"/> | ||
590 | </eOperations> | ||
591 | <eStructuralFeatures xsi:type="ecore:EReference" name="eAnnotations" upperBound="-1" | ||
592 | eType="#//EAnnotation" containment="true" resolveProxies="false" eOpposite="#//EAnnotation/eModelElement"> | ||
593 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
594 | <details key="kind" value="element"/> | ||
595 | <details key="name" value="eAnnotations"/> | ||
596 | </eAnnotations> | ||
597 | </eStructuralFeatures> | ||
598 | </eClassifiers> | ||
599 | <eClassifiers xsi:type="ecore:EClass" name="ENamedElement" abstract="true" eSuperTypes="#//EModelElement"> | ||
600 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
601 | <details key="name" value="ENamedElement"/> | ||
602 | <details key="kind" value="elementOnly"/> | ||
603 | </eAnnotations> | ||
604 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
605 | <details key="constraints" value="WellFormedName"/> | ||
606 | </eAnnotations> | ||
607 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="#//EString"> | ||
608 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
609 | <details key="kind" value="attribute"/> | ||
610 | <details key="name" value="name"/> | ||
611 | </eAnnotations> | ||
612 | </eStructuralFeatures> | ||
613 | </eClassifiers> | ||
614 | <eClassifiers xsi:type="ecore:EClass" name="EObject"> | ||
615 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
616 | <details key="name" value="EObject"/> | ||
617 | <details key="kind" value="empty"/> | ||
618 | </eAnnotations> | ||
619 | <eOperations name="eClass" eType="#//EClass"/> | ||
620 | <eOperations name="eIsProxy" eType="#//EBoolean"/> | ||
621 | <eOperations name="eResource" eType="#//EResource"/> | ||
622 | <eOperations name="eContainer" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"/> | ||
623 | <eOperations name="eContainingFeature" eType="#//EStructuralFeature"/> | ||
624 | <eOperations name="eContainmentFeature" eType="#//EReference"/> | ||
625 | <eOperations name="eContents"> | ||
626 | <eGenericType eClassifier="#//EEList"> | ||
627 | <eTypeArguments eClassifier="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"/> | ||
628 | </eGenericType> | ||
629 | </eOperations> | ||
630 | <eOperations name="eAllContents"> | ||
631 | <eGenericType eClassifier="#//ETreeIterator"> | ||
632 | <eTypeArguments eClassifier="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"/> | ||
633 | </eGenericType> | ||
634 | </eOperations> | ||
635 | <eOperations name="eCrossReferences"> | ||
636 | <eGenericType eClassifier="#//EEList"> | ||
637 | <eTypeArguments eClassifier="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject"/> | ||
638 | </eGenericType> | ||
639 | </eOperations> | ||
640 | <eOperations name="eGet" eType="#//EJavaObject"> | ||
641 | <eParameters name="feature" eType="#//EStructuralFeature"/> | ||
642 | </eOperations> | ||
643 | <eOperations name="eGet" eType="#//EJavaObject"> | ||
644 | <eParameters name="feature" eType="#//EStructuralFeature"/> | ||
645 | <eParameters name="resolve" eType="#//EBoolean"/> | ||
646 | </eOperations> | ||
647 | <eOperations name="eSet"> | ||
648 | <eParameters name="feature" eType="#//EStructuralFeature"/> | ||
649 | <eParameters name="newValue" eType="#//EJavaObject"/> | ||
650 | </eOperations> | ||
651 | <eOperations name="eIsSet" eType="#//EBoolean"> | ||
652 | <eParameters name="feature" eType="#//EStructuralFeature"/> | ||
653 | </eOperations> | ||
654 | <eOperations name="eUnset"> | ||
655 | <eParameters name="feature" eType="#//EStructuralFeature"/> | ||
656 | </eOperations> | ||
657 | <eOperations name="eInvoke" eType="#//EJavaObject" eExceptions="#//EInvocationTargetException"> | ||
658 | <eParameters name="operation" eType="#//EOperation"/> | ||
659 | <eParameters name="arguments"> | ||
660 | <eGenericType eClassifier="#//EEList"> | ||
661 | <eTypeArguments/> | ||
662 | </eGenericType> | ||
663 | </eParameters> | ||
664 | </eOperations> | ||
665 | </eClassifiers> | ||
666 | <eClassifiers xsi:type="ecore:EClass" name="EOperation" eSuperTypes="#//ETypedElement"> | ||
667 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
668 | <details key="name" value="EOperation"/> | ||
669 | <details key="kind" value="elementOnly"/> | ||
670 | </eAnnotations> | ||
671 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
672 | <details key="constraints" value="UniqueParameterNames UniqueTypeParameterNames NoRepeatingVoid"/> | ||
673 | </eAnnotations> | ||
674 | <eOperations name="getOperationID" eType="#//EInt"/> | ||
675 | <eOperations name="isOverrideOf" eType="#//EBoolean"> | ||
676 | <eParameters name="someOperation" eType="#//EOperation"/> | ||
677 | </eOperations> | ||
678 | <eStructuralFeatures xsi:type="ecore:EReference" name="eTypeParameters" upperBound="-1" | ||
679 | eType="#//ETypeParameter" containment="true"> | ||
680 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
681 | <details key="kind" value="element"/> | ||
682 | <details key="name" value="eTypeParameters"/> | ||
683 | </eAnnotations> | ||
684 | </eStructuralFeatures> | ||
685 | <eStructuralFeatures xsi:type="ecore:EReference" name="eParameters" upperBound="-1" | ||
686 | eType="#//EParameter" containment="true" resolveProxies="false" eOpposite="#//EParameter/eOperation"> | ||
687 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
688 | <details key="kind" value="element"/> | ||
689 | <details key="name" value="eParameters"/> | ||
690 | </eAnnotations> | ||
691 | </eStructuralFeatures> | ||
692 | <eStructuralFeatures xsi:type="ecore:EReference" name="eGenericExceptions" upperBound="-1" | ||
693 | eType="#//EGenericType" unsettable="true" containment="true" resolveProxies="false"> | ||
694 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
695 | <details key="kind" value="element"/> | ||
696 | <details key="name" value="eGenericExceptions"/> | ||
697 | </eAnnotations> | ||
698 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
699 | <details key="suppressedIsSetVisibility" value="true"/> | ||
700 | <details key="suppressedUnsetVisibility" value="true"/> | ||
701 | </eAnnotations> | ||
702 | </eStructuralFeatures> | ||
703 | <eStructuralFeatures xsi:type="ecore:EReference" name="eExceptions" upperBound="-1" | ||
704 | eType="#//EClassifier" unsettable="true"> | ||
705 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
706 | <details key="kind" value="attribute"/> | ||
707 | <details key="name" value="eExceptions"/> | ||
708 | </eAnnotations> | ||
709 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
710 | <details key="suppressedIsSetVisibility" value="true"/> | ||
711 | <details key="suppressedUnsetVisibility" value="true"/> | ||
712 | </eAnnotations> | ||
713 | </eStructuralFeatures> | ||
714 | <eStructuralFeatures xsi:type="ecore:EReference" name="eContainingClass" eType="#//EClass" | ||
715 | transient="true" eOpposite="#//EClass/eOperations"/> | ||
716 | </eClassifiers> | ||
717 | <eClassifiers xsi:type="ecore:EClass" name="EPackage" eSuperTypes="#//ENamedElement"> | ||
718 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
719 | <details key="name" value="EPackage"/> | ||
720 | <details key="kind" value="elementOnly"/> | ||
721 | </eAnnotations> | ||
722 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
723 | <details key="constraints" value="WellFormedNsURI WellFormedNsPrefix UniqueSubpackageNames UniqueClassifierNames UniqueNsURIs"/> | ||
724 | </eAnnotations> | ||
725 | <eOperations name="getEClassifier" eType="#//EClassifier"> | ||
726 | <eParameters name="name" eType="#//EString"/> | ||
727 | </eOperations> | ||
728 | <eStructuralFeatures xsi:type="ecore:EReference" name="eClassifiers" upperBound="-1" | ||
729 | eType="#//EClassifier" containment="true" eOpposite="#//EClassifier/ePackage"> | ||
730 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
731 | <details key="kind" value="element"/> | ||
732 | <details key="name" value="eClassifiers"/> | ||
733 | </eAnnotations> | ||
734 | </eStructuralFeatures> | ||
735 | <eStructuralFeatures xsi:type="ecore:EReference" name="eSubpackages" upperBound="-1" | ||
736 | eType="#//EPackage" containment="true" eOpposite="#//EPackage/eSuperPackage"> | ||
737 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
738 | <details key="kind" value="element"/> | ||
739 | <details key="name" value="eSubpackages"/> | ||
740 | </eAnnotations> | ||
741 | </eStructuralFeatures> | ||
742 | <eStructuralFeatures xsi:type="ecore:EReference" name="eFactoryInstance" lowerBound="1" | ||
743 | eType="#//EFactory" transient="true" resolveProxies="false" eOpposite="#//EFactory/ePackage"> | ||
744 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
745 | <details key="kind" value="attribute"/> | ||
746 | <details key="name" value="eFactoryInstance"/> | ||
747 | </eAnnotations> | ||
748 | </eStructuralFeatures> | ||
749 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="nsPrefix" eType="#//EString"> | ||
750 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
751 | <details key="kind" value="attribute"/> | ||
752 | <details key="name" value="nsPrefix"/> | ||
753 | </eAnnotations> | ||
754 | </eStructuralFeatures> | ||
755 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="nsURI" eType="#//EString"> | ||
756 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
757 | <details key="kind" value="attribute"/> | ||
758 | <details key="name" value="nsURI"/> | ||
759 | </eAnnotations> | ||
760 | </eStructuralFeatures> | ||
761 | <eStructuralFeatures xsi:type="ecore:EReference" name="eSuperPackage" eType="#//EPackage" | ||
762 | transient="true" eOpposite="#//EPackage/eSubpackages"/> | ||
763 | </eClassifiers> | ||
764 | <eClassifiers xsi:type="ecore:EClass" name="EParameter" eSuperTypes="#//ETypedElement"> | ||
765 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
766 | <details key="name" value="EParameter"/> | ||
767 | <details key="kind" value="elementOnly"/> | ||
768 | </eAnnotations> | ||
769 | <eStructuralFeatures xsi:type="ecore:EReference" name="eOperation" eType="#//EOperation" | ||
770 | transient="true" eOpposite="#//EOperation/eParameters"/> | ||
771 | </eClassifiers> | ||
772 | <eClassifiers xsi:type="ecore:EClass" name="EReference" eSuperTypes="#//EStructuralFeature"> | ||
773 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
774 | <details key="name" value="EReference"/> | ||
775 | <details key="kind" value="elementOnly"/> | ||
776 | </eAnnotations> | ||
777 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
778 | <details key="constraints" value="ConsistentOpposite SingleContainer ConsistentKeys ConsistentUnique ConsistentContainer"/> | ||
779 | </eAnnotations> | ||
780 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="container" eType="#//EBoolean" | ||
781 | changeable="false" volatile="true" transient="true" derived="true"> | ||
782 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
783 | <details key="kind" value="attribute"/> | ||
784 | <details key="name" value="container"/> | ||
785 | </eAnnotations> | ||
786 | </eStructuralFeatures> | ||
787 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="containment" eType="#//EBoolean"> | ||
788 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
789 | <details key="kind" value="attribute"/> | ||
790 | <details key="name" value="containment"/> | ||
791 | </eAnnotations> | ||
792 | </eStructuralFeatures> | ||
793 | <eStructuralFeatures xsi:type="ecore:EReference" name="eKeys" upperBound="-1" | ||
794 | eType="#//EAttribute"> | ||
795 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
796 | <details key="kind" value="attribute"/> | ||
797 | <details key="name" value="eKeys"/> | ||
798 | </eAnnotations> | ||
799 | </eStructuralFeatures> | ||
800 | <eStructuralFeatures xsi:type="ecore:EReference" name="eOpposite" eType="#//EReference"> | ||
801 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
802 | <details key="kind" value="attribute"/> | ||
803 | <details key="name" value="eOpposite"/> | ||
804 | </eAnnotations> | ||
805 | </eStructuralFeatures> | ||
806 | <eStructuralFeatures xsi:type="ecore:EReference" name="eReferenceType" lowerBound="1" | ||
807 | eType="#//EClass" changeable="false" volatile="true" transient="true" derived="true"> | ||
808 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
809 | <details key="kind" value="attribute"/> | ||
810 | <details key="name" value="eReferenceType"/> | ||
811 | </eAnnotations> | ||
812 | </eStructuralFeatures> | ||
813 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="resolveProxies" eType="#//EBoolean" | ||
814 | defaultValueLiteral="true"> | ||
815 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
816 | <details key="kind" value="attribute"/> | ||
817 | <details key="name" value="resolveProxies"/> | ||
818 | </eAnnotations> | ||
819 | </eStructuralFeatures> | ||
820 | </eClassifiers> | ||
821 | <eClassifiers xsi:type="ecore:EDataType" name="EResource" instanceClassName="org.eclipse.emf.ecore.resource.Resource" | ||
822 | serializable="false"> | ||
823 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
824 | <details key="name" value="EResource"/> | ||
825 | </eAnnotations> | ||
826 | </eClassifiers> | ||
827 | <eClassifiers xsi:type="ecore:EDataType" name="EResourceSet" instanceClassName="org.eclipse.emf.ecore.resource.ResourceSet" | ||
828 | serializable="false"> | ||
829 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
830 | <details key="name" value="EResourceSet"/> | ||
831 | </eAnnotations> | ||
832 | </eClassifiers> | ||
833 | <eClassifiers xsi:type="ecore:EDataType" name="EShort" instanceClassName="short"> | ||
834 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
835 | <details key="name" value="EShort"/> | ||
836 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#short"/> | ||
837 | </eAnnotations> | ||
838 | </eClassifiers> | ||
839 | <eClassifiers xsi:type="ecore:EDataType" name="EShortObject" instanceClassName="java.lang.Short"> | ||
840 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
841 | <details key="name" value="EShort:Object"/> | ||
842 | <details key="baseType" value="EShort"/> | ||
843 | </eAnnotations> | ||
844 | </eClassifiers> | ||
845 | <eClassifiers xsi:type="ecore:EDataType" name="EString" instanceClassName="java.lang.String"> | ||
846 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
847 | <details key="name" value="EString"/> | ||
848 | <details key="baseType" value="http://www.eclipse.org/emf/2003/XMLType#string"/> | ||
849 | </eAnnotations> | ||
850 | </eClassifiers> | ||
851 | <eClassifiers xsi:type="ecore:EClass" name="EStringToStringMapEntry" instanceClassName="java.util.Map$Entry"> | ||
852 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
853 | <details key="name" value="EStringToStringMapEntry"/> | ||
854 | <details key="kind" value="empty"/> | ||
855 | </eAnnotations> | ||
856 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="key" eType="#//EString"> | ||
857 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
858 | <details key="kind" value="attribute"/> | ||
859 | <details key="name" value="key"/> | ||
860 | </eAnnotations> | ||
861 | </eStructuralFeatures> | ||
862 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="#//EString"> | ||
863 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
864 | <details key="kind" value="attribute"/> | ||
865 | <details key="name" value="value"/> | ||
866 | </eAnnotations> | ||
867 | </eStructuralFeatures> | ||
868 | </eClassifiers> | ||
869 | <eClassifiers xsi:type="ecore:EClass" name="EStructuralFeature" abstract="true" | ||
870 | eSuperTypes="#//ETypedElement"> | ||
871 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
872 | <details key="name" value="EStructuralFeature"/> | ||
873 | <details key="kind" value="elementOnly"/> | ||
874 | </eAnnotations> | ||
875 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
876 | <details key="constraints" value="ValidDefaultValueLiteral"/> | ||
877 | </eAnnotations> | ||
878 | <eOperations name="getFeatureID" eType="#//EInt"/> | ||
879 | <eOperations name="getContainerClass"> | ||
880 | <eGenericType eClassifier="#//EJavaClass"> | ||
881 | <eTypeArguments/> | ||
882 | </eGenericType> | ||
883 | </eOperations> | ||
884 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="changeable" eType="#//EBoolean" | ||
885 | defaultValueLiteral="true"> | ||
886 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
887 | <details key="kind" value="attribute"/> | ||
888 | <details key="name" value="changeable"/> | ||
889 | </eAnnotations> | ||
890 | </eStructuralFeatures> | ||
891 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultValue" eType="#//EJavaObject" | ||
892 | changeable="false" volatile="true" transient="true" derived="true"> | ||
893 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
894 | <details key="kind" value="attribute"/> | ||
895 | <details key="name" value="defaultValue"/> | ||
896 | </eAnnotations> | ||
897 | </eStructuralFeatures> | ||
898 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="defaultValueLiteral" eType="#//EString"> | ||
899 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
900 | <details key="kind" value="attribute"/> | ||
901 | <details key="name" value="defaultValueLiteral"/> | ||
902 | </eAnnotations> | ||
903 | </eStructuralFeatures> | ||
904 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="derived" eType="#//EBoolean"> | ||
905 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
906 | <details key="kind" value="attribute"/> | ||
907 | <details key="name" value="derived"/> | ||
908 | </eAnnotations> | ||
909 | </eStructuralFeatures> | ||
910 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="transient" eType="#//EBoolean"> | ||
911 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
912 | <details key="kind" value="attribute"/> | ||
913 | <details key="name" value="transient"/> | ||
914 | </eAnnotations> | ||
915 | </eStructuralFeatures> | ||
916 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="unsettable" eType="#//EBoolean"> | ||
917 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
918 | <details key="kind" value="attribute"/> | ||
919 | <details key="name" value="unsettable"/> | ||
920 | </eAnnotations> | ||
921 | </eStructuralFeatures> | ||
922 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="volatile" eType="#//EBoolean"> | ||
923 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
924 | <details key="kind" value="attribute"/> | ||
925 | <details key="name" value="volatile"/> | ||
926 | </eAnnotations> | ||
927 | </eStructuralFeatures> | ||
928 | <eStructuralFeatures xsi:type="ecore:EReference" name="eContainingClass" eType="#//EClass" | ||
929 | transient="true" eOpposite="#//EClass/eStructuralFeatures"/> | ||
930 | </eClassifiers> | ||
931 | <eClassifiers xsi:type="ecore:EDataType" name="ETreeIterator" instanceClassName="org.eclipse.emf.common.util.TreeIterator" | ||
932 | serializable="false"> | ||
933 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
934 | <details key="name" value="ETreeIterator"/> | ||
935 | </eAnnotations> | ||
936 | <eTypeParameters name="E"/> | ||
937 | </eClassifiers> | ||
938 | <eClassifiers xsi:type="ecore:EClass" name="ETypedElement" abstract="true" eSuperTypes="#//ENamedElement"> | ||
939 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
940 | <details key="name" value="ETypedElement"/> | ||
941 | <details key="kind" value="elementOnly"/> | ||
942 | </eAnnotations> | ||
943 | <eAnnotations source="http://www.eclipse.org/emf/2002/Ecore"> | ||
944 | <details key="constraints" value="ValidLowerBound ValidUpperBound ConsistentBounds ValidType"/> | ||
945 | </eAnnotations> | ||
946 | <eStructuralFeatures xsi:type="ecore:EReference" name="eGenericType" eType="#//EGenericType" | ||
947 | volatile="true" unsettable="true" containment="true" resolveProxies="false"> | ||
948 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
949 | <details key="kind" value="element"/> | ||
950 | <details key="name" value="eGenericType"/> | ||
951 | </eAnnotations> | ||
952 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
953 | <details key="suppressedIsSetVisibility" value="true"/> | ||
954 | <details key="suppressedUnsetVisibility" value="true"/> | ||
955 | </eAnnotations> | ||
956 | </eStructuralFeatures> | ||
957 | <eStructuralFeatures xsi:type="ecore:EReference" name="eType" eType="#//EClassifier" | ||
958 | volatile="true" unsettable="true"> | ||
959 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
960 | <details key="kind" value="attribute"/> | ||
961 | <details key="name" value="eType"/> | ||
962 | </eAnnotations> | ||
963 | <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel"> | ||
964 | <details key="suppressedIsSetVisibility" value="true"/> | ||
965 | <details key="suppressedUnsetVisibility" value="true"/> | ||
966 | </eAnnotations> | ||
967 | </eStructuralFeatures> | ||
968 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="lowerBound" eType="#//EInt"> | ||
969 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
970 | <details key="kind" value="attribute"/> | ||
971 | <details key="name" value="lowerBound"/> | ||
972 | </eAnnotations> | ||
973 | </eStructuralFeatures> | ||
974 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="many" eType="#//EBoolean" | ||
975 | changeable="false" volatile="true" transient="true" derived="true"> | ||
976 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
977 | <details key="kind" value="attribute"/> | ||
978 | <details key="name" value="many"/> | ||
979 | </eAnnotations> | ||
980 | </eStructuralFeatures> | ||
981 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="ordered" eType="#//EBoolean" | ||
982 | defaultValueLiteral="true"> | ||
983 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
984 | <details key="kind" value="attribute"/> | ||
985 | <details key="name" value="ordered"/> | ||
986 | </eAnnotations> | ||
987 | </eStructuralFeatures> | ||
988 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="required" eType="#//EBoolean" | ||
989 | changeable="false" volatile="true" transient="true" derived="true"> | ||
990 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
991 | <details key="kind" value="attribute"/> | ||
992 | <details key="name" value="required"/> | ||
993 | </eAnnotations> | ||
994 | </eStructuralFeatures> | ||
995 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="unique" eType="#//EBoolean" | ||
996 | defaultValueLiteral="true"> | ||
997 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
998 | <details key="kind" value="attribute"/> | ||
999 | <details key="name" value="unique"/> | ||
1000 | </eAnnotations> | ||
1001 | </eStructuralFeatures> | ||
1002 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="upperBound" eType="#//EInt" | ||
1003 | defaultValueLiteral="1"> | ||
1004 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
1005 | <details key="kind" value="attribute"/> | ||
1006 | <details key="name" value="upperBound"/> | ||
1007 | </eAnnotations> | ||
1008 | </eStructuralFeatures> | ||
1009 | </eClassifiers> | ||
1010 | <eClassifiers xsi:type="ecore:EClass" name="ETypeParameter" eSuperTypes="#//ENamedElement"> | ||
1011 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
1012 | <details key="name" value="ETypeParameter"/> | ||
1013 | <details key="kind" value="elementOnly"/> | ||
1014 | </eAnnotations> | ||
1015 | <eStructuralFeatures xsi:type="ecore:EReference" name="eBounds" upperBound="-1" | ||
1016 | eType="#//EGenericType" containment="true" resolveProxies="false"> | ||
1017 | <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData"> | ||
1018 | <details key="kind" value="element"/> | ||
1019 | <details key="name" value="eBounds"/> | ||
1020 | </eAnnotations> | ||
1021 | </eStructuralFeatures> | ||
1022 | </eClassifiers> | ||
1023 | </ecore:EPackage> | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml index 6f4ab31b..6ac719c8 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml | |||
@@ -12,4 +12,9 @@ | |||
12 | <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.friendship"/> | 12 | <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.friendship"/> |
13 | </group> | 13 | </group> |
14 | </extension> | 14 | </extension> |
15 | <extension id="queries.Ecore_pattern" point="org.eclipse.viatra.query.runtime.queryspecification"> | ||
16 | <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore_pattern" id="queries.Ecore_pattern"> | ||
17 | <query-specification fqn="queries.sameSuperClass"/> | ||
18 | </group> | ||
19 | </extension> | ||
15 | </plugin> | 20 | </plugin> |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql new file mode 100644 index 00000000..a6f384d9 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | |||
@@ -0,0 +1,9 @@ | |||
1 | package queries | ||
2 | import epackage "http://www.eclipse.org/emf/2002/Ecore" | ||
3 | |||
4 | @Constraint(severity="error", message="error", key = {c}) | ||
5 | pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { | ||
6 | EClass.eSuperTypes(c, s1); | ||
7 | EClass.eSuperTypes(c, s2); | ||
8 | s1 == s2; | ||
9 | } \ No newline at end of file | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore new file mode 100644 index 00000000..121edf31 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore | |||
@@ -0,0 +1,3 @@ | |||
1 | /.Ecore_pattern.java._trace | ||
2 | /.MultipleTransitionFromEntry.java._trace | ||
3 | /.SameSuperClass.java._trace | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java new file mode 100644 index 00000000..e2627646 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java | |||
@@ -0,0 +1,53 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | ||
3 | */ | ||
4 | package queries; | ||
5 | |||
6 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
7 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; | ||
8 | import queries.SameSuperClass; | ||
9 | |||
10 | /** | ||
11 | * A pattern group formed of all public patterns defined in ecore_pattern.vql. | ||
12 | * | ||
13 | * <p>Use the static instance as any {@link interface org.eclipse.viatra.query.runtime.api.IQueryGroup}, to conveniently prepare | ||
14 | * a VIATRA Query engine for matching all patterns originally defined in file ecore_pattern.vql, | ||
15 | * in order to achieve better performance than one-by-one on-demand matcher initialization. | ||
16 | * | ||
17 | * <p> From package queries, the group contains the definition of the following patterns: <ul> | ||
18 | * <li>sameSuperClass</li> | ||
19 | * </ul> | ||
20 | * | ||
21 | * @see IQueryGroup | ||
22 | * | ||
23 | */ | ||
24 | @SuppressWarnings("all") | ||
25 | public final class Ecore_pattern extends BaseGeneratedPatternGroup { | ||
26 | /** | ||
27 | * Access the pattern group. | ||
28 | * | ||
29 | * @return the singleton instance of the group | ||
30 | * @throws ViatraQueryRuntimeException if there was an error loading the generated code of pattern specifications | ||
31 | * | ||
32 | */ | ||
33 | public static Ecore_pattern instance() { | ||
34 | if (INSTANCE == null) { | ||
35 | INSTANCE = new Ecore_pattern(); | ||
36 | } | ||
37 | return INSTANCE; | ||
38 | } | ||
39 | |||
40 | private static Ecore_pattern INSTANCE; | ||
41 | |||
42 | private Ecore_pattern() { | ||
43 | querySpecifications.add(SameSuperClass.instance()); | ||
44 | } | ||
45 | |||
46 | public SameSuperClass getSameSuperClass() { | ||
47 | return SameSuperClass.instance(); | ||
48 | } | ||
49 | |||
50 | public SameSuperClass.Matcher getSameSuperClass(final ViatraQueryEngine engine) { | ||
51 | return SameSuperClass.Matcher.on(engine); | ||
52 | } | ||
53 | } | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java new file mode 100644 index 00000000..2e8a19d8 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java | |||
@@ -0,0 +1,824 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | ||
3 | */ | ||
4 | package queries; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
19 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
20 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
21 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
25 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
40 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
41 | |||
42 | /** | ||
43 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
44 | * | ||
45 | * <p>Original source: | ||
46 | * <code><pre> | ||
47 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
48 | * pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { | ||
49 | * EClass.eSuperTypes(c, s1); | ||
50 | * EClass.eSuperTypes(c, s2); | ||
51 | * s1 == s2; | ||
52 | * } | ||
53 | * </pre></code> | ||
54 | * | ||
55 | * @see Matcher | ||
56 | * @see Match | ||
57 | * | ||
58 | */ | ||
59 | @SuppressWarnings("all") | ||
60 | public final class SameSuperClass extends BaseGeneratedEMFQuerySpecification<SameSuperClass.Matcher> { | ||
61 | /** | ||
62 | * Pattern-specific match representation of the queries.sameSuperClass pattern, | ||
63 | * to be used in conjunction with {@link Matcher}. | ||
64 | * | ||
65 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
66 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
67 | * usable to represent a match of the pattern in the result of a query, | ||
68 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
69 | * | ||
70 | * @see Matcher | ||
71 | * | ||
72 | */ | ||
73 | public static abstract class Match extends BasePatternMatch { | ||
74 | private EClass fC; | ||
75 | |||
76 | private EClass fS1; | ||
77 | |||
78 | private EClass fS2; | ||
79 | |||
80 | private static List<String> parameterNames = makeImmutableList("c", "s1", "s2"); | ||
81 | |||
82 | private Match(final EClass pC, final EClass pS1, final EClass pS2) { | ||
83 | this.fC = pC; | ||
84 | this.fS1 = pS1; | ||
85 | this.fS2 = pS2; | ||
86 | } | ||
87 | |||
88 | @Override | ||
89 | public Object get(final String parameterName) { | ||
90 | if ("c".equals(parameterName)) return this.fC; | ||
91 | if ("s1".equals(parameterName)) return this.fS1; | ||
92 | if ("s2".equals(parameterName)) return this.fS2; | ||
93 | return null; | ||
94 | } | ||
95 | |||
96 | public EClass getC() { | ||
97 | return this.fC; | ||
98 | } | ||
99 | |||
100 | public EClass getS1() { | ||
101 | return this.fS1; | ||
102 | } | ||
103 | |||
104 | public EClass getS2() { | ||
105 | return this.fS2; | ||
106 | } | ||
107 | |||
108 | @Override | ||
109 | public boolean set(final String parameterName, final Object newValue) { | ||
110 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
111 | if ("c".equals(parameterName) ) { | ||
112 | this.fC = (EClass) newValue; | ||
113 | return true; | ||
114 | } | ||
115 | if ("s1".equals(parameterName) ) { | ||
116 | this.fS1 = (EClass) newValue; | ||
117 | return true; | ||
118 | } | ||
119 | if ("s2".equals(parameterName) ) { | ||
120 | this.fS2 = (EClass) newValue; | ||
121 | return true; | ||
122 | } | ||
123 | return false; | ||
124 | } | ||
125 | |||
126 | public void setC(final EClass pC) { | ||
127 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
128 | this.fC = pC; | ||
129 | } | ||
130 | |||
131 | public void setS1(final EClass pS1) { | ||
132 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
133 | this.fS1 = pS1; | ||
134 | } | ||
135 | |||
136 | public void setS2(final EClass pS2) { | ||
137 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
138 | this.fS2 = pS2; | ||
139 | } | ||
140 | |||
141 | @Override | ||
142 | public String patternName() { | ||
143 | return "queries.sameSuperClass"; | ||
144 | } | ||
145 | |||
146 | @Override | ||
147 | public List<String> parameterNames() { | ||
148 | return SameSuperClass.Match.parameterNames; | ||
149 | } | ||
150 | |||
151 | @Override | ||
152 | public Object[] toArray() { | ||
153 | return new Object[]{fC, fS1, fS2}; | ||
154 | } | ||
155 | |||
156 | @Override | ||
157 | public SameSuperClass.Match toImmutable() { | ||
158 | return isMutable() ? newMatch(fC, fS1, fS2) : this; | ||
159 | } | ||
160 | |||
161 | @Override | ||
162 | public String prettyPrint() { | ||
163 | StringBuilder result = new StringBuilder(); | ||
164 | result.append("\"c\"=" + prettyPrintValue(fC) + ", "); | ||
165 | result.append("\"s1\"=" + prettyPrintValue(fS1) + ", "); | ||
166 | result.append("\"s2\"=" + prettyPrintValue(fS2)); | ||
167 | return result.toString(); | ||
168 | } | ||
169 | |||
170 | @Override | ||
171 | public int hashCode() { | ||
172 | return Objects.hash(fC, fS1, fS2); | ||
173 | } | ||
174 | |||
175 | @Override | ||
176 | public boolean equals(final Object obj) { | ||
177 | if (this == obj) | ||
178 | return true; | ||
179 | if (obj == null) { | ||
180 | return false; | ||
181 | } | ||
182 | if ((obj instanceof SameSuperClass.Match)) { | ||
183 | SameSuperClass.Match other = (SameSuperClass.Match) obj; | ||
184 | return Objects.equals(fC, other.fC) && Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2); | ||
185 | } else { | ||
186 | // this should be infrequent | ||
187 | if (!(obj instanceof IPatternMatch)) { | ||
188 | return false; | ||
189 | } | ||
190 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
191 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
192 | } | ||
193 | } | ||
194 | |||
195 | @Override | ||
196 | public SameSuperClass specification() { | ||
197 | return SameSuperClass.instance(); | ||
198 | } | ||
199 | |||
200 | /** | ||
201 | * Returns an empty, mutable match. | ||
202 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
203 | * | ||
204 | * @return the empty match. | ||
205 | * | ||
206 | */ | ||
207 | public static SameSuperClass.Match newEmptyMatch() { | ||
208 | return new Mutable(null, null, null); | ||
209 | } | ||
210 | |||
211 | /** | ||
212 | * Returns a mutable (partial) match. | ||
213 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
214 | * | ||
215 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
216 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
217 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
218 | * @return the new, mutable (partial) match object. | ||
219 | * | ||
220 | */ | ||
221 | public static SameSuperClass.Match newMutableMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
222 | return new Mutable(pC, pS1, pS2); | ||
223 | } | ||
224 | |||
225 | /** | ||
226 | * Returns a new (partial) match. | ||
227 | * This can be used e.g. to call the matcher with a partial match. | ||
228 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
229 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
230 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
231 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
232 | * @return the (partial) match object. | ||
233 | * | ||
234 | */ | ||
235 | public static SameSuperClass.Match newMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
236 | return new Immutable(pC, pS1, pS2); | ||
237 | } | ||
238 | |||
239 | private static final class Mutable extends SameSuperClass.Match { | ||
240 | Mutable(final EClass pC, final EClass pS1, final EClass pS2) { | ||
241 | super(pC, pS1, pS2); | ||
242 | } | ||
243 | |||
244 | @Override | ||
245 | public boolean isMutable() { | ||
246 | return true; | ||
247 | } | ||
248 | } | ||
249 | |||
250 | private static final class Immutable extends SameSuperClass.Match { | ||
251 | Immutable(final EClass pC, final EClass pS1, final EClass pS2) { | ||
252 | super(pC, pS1, pS2); | ||
253 | } | ||
254 | |||
255 | @Override | ||
256 | public boolean isMutable() { | ||
257 | return false; | ||
258 | } | ||
259 | } | ||
260 | } | ||
261 | |||
262 | /** | ||
263 | * Generated pattern matcher API of the queries.sameSuperClass pattern, | ||
264 | * providing pattern-specific query methods. | ||
265 | * | ||
266 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
267 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
268 | * | ||
269 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
270 | * | ||
271 | * <p>Original source: | ||
272 | * <code><pre> | ||
273 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
274 | * pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { | ||
275 | * EClass.eSuperTypes(c, s1); | ||
276 | * EClass.eSuperTypes(c, s2); | ||
277 | * s1 == s2; | ||
278 | * } | ||
279 | * </pre></code> | ||
280 | * | ||
281 | * @see Match | ||
282 | * @see SameSuperClass | ||
283 | * | ||
284 | */ | ||
285 | public static class Matcher extends BaseMatcher<SameSuperClass.Match> { | ||
286 | /** | ||
287 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
288 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
289 | * | ||
290 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
291 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
292 | * | ||
293 | */ | ||
294 | public static SameSuperClass.Matcher on(final ViatraQueryEngine engine) { | ||
295 | // check if matcher already exists | ||
296 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
297 | if (matcher == null) { | ||
298 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
299 | } | ||
300 | return matcher; | ||
301 | } | ||
302 | |||
303 | /** | ||
304 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
305 | * @return an initialized matcher | ||
306 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
307 | * | ||
308 | */ | ||
309 | public static SameSuperClass.Matcher create() { | ||
310 | return new Matcher(); | ||
311 | } | ||
312 | |||
313 | private static final int POSITION_C = 0; | ||
314 | |||
315 | private static final int POSITION_S1 = 1; | ||
316 | |||
317 | private static final int POSITION_S2 = 2; | ||
318 | |||
319 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(SameSuperClass.Matcher.class); | ||
320 | |||
321 | /** | ||
322 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
323 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
324 | * | ||
325 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
326 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
327 | * | ||
328 | */ | ||
329 | private Matcher() { | ||
330 | super(querySpecification()); | ||
331 | } | ||
332 | |||
333 | /** | ||
334 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
335 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
336 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
337 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
338 | * @return matches represented as a Match object. | ||
339 | * | ||
340 | */ | ||
341 | public Collection<SameSuperClass.Match> getAllMatches(final EClass pC, final EClass pS1, final EClass pS2) { | ||
342 | return rawStreamAllMatches(new Object[]{pC, pS1, pS2}).collect(Collectors.toSet()); | ||
343 | } | ||
344 | |||
345 | /** | ||
346 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
347 | * </p> | ||
348 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
349 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
350 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
351 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
352 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
353 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
354 | * @return a stream of matches represented as a Match object. | ||
355 | * | ||
356 | */ | ||
357 | public Stream<SameSuperClass.Match> streamAllMatches(final EClass pC, final EClass pS1, final EClass pS2) { | ||
358 | return rawStreamAllMatches(new Object[]{pC, pS1, pS2}); | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
363 | * Neither determinism nor randomness of selection is guaranteed. | ||
364 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
365 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
366 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
367 | * @return a match represented as a Match object, or null if no match is found. | ||
368 | * | ||
369 | */ | ||
370 | public Optional<SameSuperClass.Match> getOneArbitraryMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
371 | return rawGetOneArbitraryMatch(new Object[]{pC, pS1, pS2}); | ||
372 | } | ||
373 | |||
374 | /** | ||
375 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
376 | * under any possible substitution of the unspecified parameters (if any). | ||
377 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
378 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
379 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
380 | * @return true if the input is a valid (partial) match of the pattern. | ||
381 | * | ||
382 | */ | ||
383 | public boolean hasMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
384 | return rawHasMatch(new Object[]{pC, pS1, pS2}); | ||
385 | } | ||
386 | |||
387 | /** | ||
388 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
389 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
390 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
391 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
392 | * @return the number of pattern matches found. | ||
393 | * | ||
394 | */ | ||
395 | public int countMatches(final EClass pC, final EClass pS1, final EClass pS2) { | ||
396 | return rawCountMatches(new Object[]{pC, pS1, pS2}); | ||
397 | } | ||
398 | |||
399 | /** | ||
400 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
401 | * Neither determinism nor randomness of selection is guaranteed. | ||
402 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
403 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
404 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
405 | * @param processor the action that will process the selected match. | ||
406 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
407 | * | ||
408 | */ | ||
409 | public boolean forOneArbitraryMatch(final EClass pC, final EClass pS1, final EClass pS2, final Consumer<? super SameSuperClass.Match> processor) { | ||
410 | return rawForOneArbitraryMatch(new Object[]{pC, pS1, pS2}, processor); | ||
411 | } | ||
412 | |||
413 | /** | ||
414 | * Returns a new (partial) match. | ||
415 | * This can be used e.g. to call the matcher with a partial match. | ||
416 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
417 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
418 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
419 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
420 | * @return the (partial) match object. | ||
421 | * | ||
422 | */ | ||
423 | public SameSuperClass.Match newMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
424 | return SameSuperClass.Match.newMatch(pC, pS1, pS2); | ||
425 | } | ||
426 | |||
427 | /** | ||
428 | * Retrieve the set of values that occur in matches for c. | ||
429 | * @return the Set of all values or empty set if there are no matches | ||
430 | * | ||
431 | */ | ||
432 | protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) { | ||
433 | return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast); | ||
434 | } | ||
435 | |||
436 | /** | ||
437 | * Retrieve the set of values that occur in matches for c. | ||
438 | * @return the Set of all values or empty set if there are no matches | ||
439 | * | ||
440 | */ | ||
441 | public Set<EClass> getAllValuesOfc() { | ||
442 | return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet()); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * Retrieve the set of values that occur in matches for c. | ||
447 | * @return the Set of all values or empty set if there are no matches | ||
448 | * | ||
449 | */ | ||
450 | public Stream<EClass> streamAllValuesOfc() { | ||
451 | return rawStreamAllValuesOfc(emptyArray()); | ||
452 | } | ||
453 | |||
454 | /** | ||
455 | * Retrieve the set of values that occur in matches for c. | ||
456 | * </p> | ||
457 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
458 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
459 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
460 | * | ||
461 | * @return the Stream of all values or empty set if there are no matches | ||
462 | * | ||
463 | */ | ||
464 | public Stream<EClass> streamAllValuesOfc(final SameSuperClass.Match partialMatch) { | ||
465 | return rawStreamAllValuesOfc(partialMatch.toArray()); | ||
466 | } | ||
467 | |||
468 | /** | ||
469 | * Retrieve the set of values that occur in matches for c. | ||
470 | * </p> | ||
471 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
472 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
473 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
474 | * | ||
475 | * @return the Stream of all values or empty set if there are no matches | ||
476 | * | ||
477 | */ | ||
478 | public Stream<EClass> streamAllValuesOfc(final EClass pS1, final EClass pS2) { | ||
479 | return rawStreamAllValuesOfc(new Object[]{null, pS1, pS2}); | ||
480 | } | ||
481 | |||
482 | /** | ||
483 | * Retrieve the set of values that occur in matches for c. | ||
484 | * @return the Set of all values or empty set if there are no matches | ||
485 | * | ||
486 | */ | ||
487 | public Set<EClass> getAllValuesOfc(final SameSuperClass.Match partialMatch) { | ||
488 | return rawStreamAllValuesOfc(partialMatch.toArray()).collect(Collectors.toSet()); | ||
489 | } | ||
490 | |||
491 | /** | ||
492 | * Retrieve the set of values that occur in matches for c. | ||
493 | * @return the Set of all values or empty set if there are no matches | ||
494 | * | ||
495 | */ | ||
496 | public Set<EClass> getAllValuesOfc(final EClass pS1, final EClass pS2) { | ||
497 | return rawStreamAllValuesOfc(new Object[]{null, pS1, pS2}).collect(Collectors.toSet()); | ||
498 | } | ||
499 | |||
500 | /** | ||
501 | * Retrieve the set of values that occur in matches for s1. | ||
502 | * @return the Set of all values or empty set if there are no matches | ||
503 | * | ||
504 | */ | ||
505 | protected Stream<EClass> rawStreamAllValuesOfs1(final Object[] parameters) { | ||
506 | return rawStreamAllValues(POSITION_S1, parameters).map(EClass.class::cast); | ||
507 | } | ||
508 | |||
509 | /** | ||
510 | * Retrieve the set of values that occur in matches for s1. | ||
511 | * @return the Set of all values or empty set if there are no matches | ||
512 | * | ||
513 | */ | ||
514 | public Set<EClass> getAllValuesOfs1() { | ||
515 | return rawStreamAllValuesOfs1(emptyArray()).collect(Collectors.toSet()); | ||
516 | } | ||
517 | |||
518 | /** | ||
519 | * Retrieve the set of values that occur in matches for s1. | ||
520 | * @return the Set of all values or empty set if there are no matches | ||
521 | * | ||
522 | */ | ||
523 | public Stream<EClass> streamAllValuesOfs1() { | ||
524 | return rawStreamAllValuesOfs1(emptyArray()); | ||
525 | } | ||
526 | |||
527 | /** | ||
528 | * Retrieve the set of values that occur in matches for s1. | ||
529 | * </p> | ||
530 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
531 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
532 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
533 | * | ||
534 | * @return the Stream of all values or empty set if there are no matches | ||
535 | * | ||
536 | */ | ||
537 | public Stream<EClass> streamAllValuesOfs1(final SameSuperClass.Match partialMatch) { | ||
538 | return rawStreamAllValuesOfs1(partialMatch.toArray()); | ||
539 | } | ||
540 | |||
541 | /** | ||
542 | * Retrieve the set of values that occur in matches for s1. | ||
543 | * </p> | ||
544 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
545 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
546 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
547 | * | ||
548 | * @return the Stream of all values or empty set if there are no matches | ||
549 | * | ||
550 | */ | ||
551 | public Stream<EClass> streamAllValuesOfs1(final EClass pC, final EClass pS2) { | ||
552 | return rawStreamAllValuesOfs1(new Object[]{pC, null, pS2}); | ||
553 | } | ||
554 | |||
555 | /** | ||
556 | * Retrieve the set of values that occur in matches for s1. | ||
557 | * @return the Set of all values or empty set if there are no matches | ||
558 | * | ||
559 | */ | ||
560 | public Set<EClass> getAllValuesOfs1(final SameSuperClass.Match partialMatch) { | ||
561 | return rawStreamAllValuesOfs1(partialMatch.toArray()).collect(Collectors.toSet()); | ||
562 | } | ||
563 | |||
564 | /** | ||
565 | * Retrieve the set of values that occur in matches for s1. | ||
566 | * @return the Set of all values or empty set if there are no matches | ||
567 | * | ||
568 | */ | ||
569 | public Set<EClass> getAllValuesOfs1(final EClass pC, final EClass pS2) { | ||
570 | return rawStreamAllValuesOfs1(new Object[]{pC, null, pS2}).collect(Collectors.toSet()); | ||
571 | } | ||
572 | |||
573 | /** | ||
574 | * Retrieve the set of values that occur in matches for s2. | ||
575 | * @return the Set of all values or empty set if there are no matches | ||
576 | * | ||
577 | */ | ||
578 | protected Stream<EClass> rawStreamAllValuesOfs2(final Object[] parameters) { | ||
579 | return rawStreamAllValues(POSITION_S2, parameters).map(EClass.class::cast); | ||
580 | } | ||
581 | |||
582 | /** | ||
583 | * Retrieve the set of values that occur in matches for s2. | ||
584 | * @return the Set of all values or empty set if there are no matches | ||
585 | * | ||
586 | */ | ||
587 | public Set<EClass> getAllValuesOfs2() { | ||
588 | return rawStreamAllValuesOfs2(emptyArray()).collect(Collectors.toSet()); | ||
589 | } | ||
590 | |||
591 | /** | ||
592 | * Retrieve the set of values that occur in matches for s2. | ||
593 | * @return the Set of all values or empty set if there are no matches | ||
594 | * | ||
595 | */ | ||
596 | public Stream<EClass> streamAllValuesOfs2() { | ||
597 | return rawStreamAllValuesOfs2(emptyArray()); | ||
598 | } | ||
599 | |||
600 | /** | ||
601 | * Retrieve the set of values that occur in matches for s2. | ||
602 | * </p> | ||
603 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
604 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
605 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
606 | * | ||
607 | * @return the Stream of all values or empty set if there are no matches | ||
608 | * | ||
609 | */ | ||
610 | public Stream<EClass> streamAllValuesOfs2(final SameSuperClass.Match partialMatch) { | ||
611 | return rawStreamAllValuesOfs2(partialMatch.toArray()); | ||
612 | } | ||
613 | |||
614 | /** | ||
615 | * Retrieve the set of values that occur in matches for s2. | ||
616 | * </p> | ||
617 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
618 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
619 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
620 | * | ||
621 | * @return the Stream of all values or empty set if there are no matches | ||
622 | * | ||
623 | */ | ||
624 | public Stream<EClass> streamAllValuesOfs2(final EClass pC, final EClass pS1) { | ||
625 | return rawStreamAllValuesOfs2(new Object[]{pC, pS1, null}); | ||
626 | } | ||
627 | |||
628 | /** | ||
629 | * Retrieve the set of values that occur in matches for s2. | ||
630 | * @return the Set of all values or empty set if there are no matches | ||
631 | * | ||
632 | */ | ||
633 | public Set<EClass> getAllValuesOfs2(final SameSuperClass.Match partialMatch) { | ||
634 | return rawStreamAllValuesOfs2(partialMatch.toArray()).collect(Collectors.toSet()); | ||
635 | } | ||
636 | |||
637 | /** | ||
638 | * Retrieve the set of values that occur in matches for s2. | ||
639 | * @return the Set of all values or empty set if there are no matches | ||
640 | * | ||
641 | */ | ||
642 | public Set<EClass> getAllValuesOfs2(final EClass pC, final EClass pS1) { | ||
643 | return rawStreamAllValuesOfs2(new Object[]{pC, pS1, null}).collect(Collectors.toSet()); | ||
644 | } | ||
645 | |||
646 | @Override | ||
647 | protected SameSuperClass.Match tupleToMatch(final Tuple t) { | ||
648 | try { | ||
649 | return SameSuperClass.Match.newMatch((EClass) t.get(POSITION_C), (EClass) t.get(POSITION_S1), (EClass) t.get(POSITION_S2)); | ||
650 | } catch(ClassCastException e) { | ||
651 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
652 | return null; | ||
653 | } | ||
654 | } | ||
655 | |||
656 | @Override | ||
657 | protected SameSuperClass.Match arrayToMatch(final Object[] match) { | ||
658 | try { | ||
659 | return SameSuperClass.Match.newMatch((EClass) match[POSITION_C], (EClass) match[POSITION_S1], (EClass) match[POSITION_S2]); | ||
660 | } catch(ClassCastException e) { | ||
661 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
662 | return null; | ||
663 | } | ||
664 | } | ||
665 | |||
666 | @Override | ||
667 | protected SameSuperClass.Match arrayToMatchMutable(final Object[] match) { | ||
668 | try { | ||
669 | return SameSuperClass.Match.newMutableMatch((EClass) match[POSITION_C], (EClass) match[POSITION_S1], (EClass) match[POSITION_S2]); | ||
670 | } catch(ClassCastException e) { | ||
671 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
672 | return null; | ||
673 | } | ||
674 | } | ||
675 | |||
676 | /** | ||
677 | * @return the singleton instance of the query specification of this pattern | ||
678 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
679 | * | ||
680 | */ | ||
681 | public static IQuerySpecification<SameSuperClass.Matcher> querySpecification() { | ||
682 | return SameSuperClass.instance(); | ||
683 | } | ||
684 | } | ||
685 | |||
686 | private SameSuperClass() { | ||
687 | super(GeneratedPQuery.INSTANCE); | ||
688 | } | ||
689 | |||
690 | /** | ||
691 | * @return the singleton instance of the query specification | ||
692 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
693 | * | ||
694 | */ | ||
695 | public static SameSuperClass instance() { | ||
696 | try{ | ||
697 | return LazyHolder.INSTANCE; | ||
698 | } catch (ExceptionInInitializerError err) { | ||
699 | throw processInitializerError(err); | ||
700 | } | ||
701 | } | ||
702 | |||
703 | @Override | ||
704 | protected SameSuperClass.Matcher instantiate(final ViatraQueryEngine engine) { | ||
705 | return SameSuperClass.Matcher.on(engine); | ||
706 | } | ||
707 | |||
708 | @Override | ||
709 | public SameSuperClass.Matcher instantiate() { | ||
710 | return SameSuperClass.Matcher.create(); | ||
711 | } | ||
712 | |||
713 | @Override | ||
714 | public SameSuperClass.Match newEmptyMatch() { | ||
715 | return SameSuperClass.Match.newEmptyMatch(); | ||
716 | } | ||
717 | |||
718 | @Override | ||
719 | public SameSuperClass.Match newMatch(final Object... parameters) { | ||
720 | return SameSuperClass.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1], (org.eclipse.emf.ecore.EClass) parameters[2]); | ||
721 | } | ||
722 | |||
723 | /** | ||
724 | * Inner class allowing the singleton instance of {@link JvmGenericType: queries.SameSuperClass (visibility: PUBLIC, simpleName: SameSuperClass, identifier: queries.SameSuperClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
725 | * <b>not</b> at the class load time of the outer class, | ||
726 | * but rather at the first call to {@link JvmGenericType: queries.SameSuperClass (visibility: PUBLIC, simpleName: SameSuperClass, identifier: queries.SameSuperClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
727 | * | ||
728 | * <p> This workaround is required e.g. to support recursion. | ||
729 | * | ||
730 | */ | ||
731 | private static class LazyHolder { | ||
732 | private static final SameSuperClass INSTANCE = new SameSuperClass(); | ||
733 | |||
734 | /** | ||
735 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
736 | * This initialization order is required to support indirect recursion. | ||
737 | * | ||
738 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
739 | * | ||
740 | */ | ||
741 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
742 | |||
743 | public static Object ensureInitialized() { | ||
744 | INSTANCE.ensureInitializedInternal(); | ||
745 | return null; | ||
746 | } | ||
747 | } | ||
748 | |||
749 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
750 | private static final SameSuperClass.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
751 | |||
752 | private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
753 | |||
754 | private final PParameter parameter_s1 = new PParameter("s1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
755 | |||
756 | private final PParameter parameter_s2 = new PParameter("s2", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
757 | |||
758 | private final List<PParameter> parameters = Arrays.asList(parameter_c, parameter_s1, parameter_s2); | ||
759 | |||
760 | private GeneratedPQuery() { | ||
761 | super(PVisibility.PUBLIC); | ||
762 | } | ||
763 | |||
764 | @Override | ||
765 | public String getFullyQualifiedName() { | ||
766 | return "queries.sameSuperClass"; | ||
767 | } | ||
768 | |||
769 | @Override | ||
770 | public List<String> getParameterNames() { | ||
771 | return Arrays.asList("c","s1","s2"); | ||
772 | } | ||
773 | |||
774 | @Override | ||
775 | public List<PParameter> getParameters() { | ||
776 | return parameters; | ||
777 | } | ||
778 | |||
779 | @Override | ||
780 | public Set<PBody> doGetContainedBodies() { | ||
781 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
782 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
783 | { | ||
784 | PBody body = new PBody(this); | ||
785 | PVariable var_c = body.getOrCreateVariableByName("c"); | ||
786 | PVariable var_s1 = body.getOrCreateVariableByName("s1"); | ||
787 | PVariable var_s2 = body.getOrCreateVariableByName("s2"); | ||
788 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
789 | new TypeConstraint(body, Tuples.flatTupleOf(var_s1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
790 | new TypeConstraint(body, Tuples.flatTupleOf(var_s2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
791 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
792 | new ExportedParameter(body, var_c, parameter_c), | ||
793 | new ExportedParameter(body, var_s1, parameter_s1), | ||
794 | new ExportedParameter(body, var_s2, parameter_s2) | ||
795 | )); | ||
796 | // EClass.eSuperTypes(c, s1) | ||
797 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
798 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
799 | new TypeConstraint(body, Tuples.flatTupleOf(var_c, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
800 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
801 | new Equality(body, var__virtual_0_, var_s1); | ||
802 | // EClass.eSuperTypes(c, s2) | ||
803 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
804 | PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); | ||
805 | new TypeConstraint(body, Tuples.flatTupleOf(var_c, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
806 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
807 | new Equality(body, var__virtual_1_, var_s2); | ||
808 | // s1 == s2 | ||
809 | new Equality(body, var_s1, var_s2); | ||
810 | bodies.add(body); | ||
811 | } | ||
812 | { | ||
813 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
814 | annotation.addAttribute("severity", "error"); | ||
815 | annotation.addAttribute("message", "error"); | ||
816 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
817 | new ParameterReference("c") | ||
818 | })); | ||
819 | addAnnotation(annotation); | ||
820 | } | ||
821 | return bodies; | ||
822 | } | ||
823 | } | ||
824 | } | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java index 261f32cc..9b426200 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java | |||
@@ -11,6 +11,7 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistan | |||
11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph; | 11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph; |
12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter; | 12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter; |
13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader; | 13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader; |
14 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader; | ||
14 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup; | 15 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup; |
15 | import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; | 16 | import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; |
16 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.validation.ViolationCheck; | 17 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.validation.ViolationCheck; |
@@ -24,8 +25,8 @@ public class Main { | |||
24 | return message; | 25 | return message; |
25 | } | 26 | } |
26 | 27 | ||
27 | private static String configFolder = "yakinduum/config15/"; | 28 | private static String configFolder = "yakinduum/config22/"; |
28 | private static String configFileName = configFolder + "info_new_metric.csv"; | 29 | private static String configFileName = configFolder + "info_old_metric.csv"; |
29 | private static String aggregateViolationMeasureFileName = configFolder + "aggregateInfo.csv"; | 30 | private static String aggregateViolationMeasureFileName = configFolder + "aggregateInfo.csv"; |
30 | private static String fileReadFolder = "output/Viatra_100/"; | 31 | private static String fileReadFolder = "output/Viatra_100/"; |
31 | 32 | ||
@@ -33,29 +34,30 @@ public class Main { | |||
33 | 34 | ||
34 | 35 | ||
35 | long begin = System.currentTimeMillis(); | 36 | long begin = System.currentTimeMillis(); |
36 | String message = runWithPath("yakinduGeneration.vsconfig"); | 37 | String message = runWithPath("ecore.vsconfig"); |
37 | long elapsed = System.currentTimeMillis() - begin; | 38 | long elapsed = System.currentTimeMillis() - begin; |
38 | 39 | ||
39 | if(message != null) { | 40 | if(message != null) { |
41 | System.out.println(message); | ||
40 | return; | 42 | return; |
41 | } | 43 | } |
42 | ArrayList<ArrayList<String>> output = new ArrayList<ArrayList<String>>(); | 44 | // ArrayList<ArrayList<String>> output = new ArrayList<ArrayList<String>>(); |
43 | String time = formatTime(elapsed); | 45 | // String time = formatTime(elapsed); |
44 | ArrayList<String> infoOutput = new ArrayList<String>(); | 46 | // ArrayList<String> infoOutput = new ArrayList<String>(); |
45 | infoOutput.add(time); | 47 | // infoOutput.add(time); |
46 | output.add(infoOutput); | 48 | // output.add(infoOutput); |
47 | System.out.println(time); | 49 | // System.out.println(time); |
48 | CsvFileWriter.write(output, configFileName); | 50 | // CsvFileWriter.write(output, configFileName); |
49 | 51 | // | |
50 | 52 | // | |
51 | output = new ArrayList<ArrayList<String>>(); | 53 | // output = new ArrayList<ArrayList<String>>(); |
52 | output.add(prepareInfo()); | 54 | // output.add(prepareInfo()); |
53 | CsvFileWriter.append(output, configFileName); | 55 | // CsvFileWriter.append(output, configFileName); |
54 | 56 | // | |
55 | for(int i = 0; i < 50; i++) { | 57 | // for(int i = 0; i < 50; i++) { |
56 | generateModel(i+1); | 58 | // generateModel(i+1); |
57 | } | 59 | // } |
58 | //aggregateViolationMeasure(50); | 60 | // aggregateViolationMeasure(50); |
59 | System.out.println("Finished"); | 61 | System.out.println("Finished"); |
60 | } | 62 | } |
61 | 63 | ||
@@ -86,7 +88,7 @@ public class Main { | |||
86 | ArrayList<String> infoOutput = new ArrayList<String>(); | 88 | ArrayList<String> infoOutput = new ArrayList<String>(); |
87 | infoOutput.add(run+ ""); | 89 | infoOutput.add(run+ ""); |
88 | 90 | ||
89 | YakinduumModel model = new YakinduumModel("output/Viatra_100/run"+run+"/"+ filename); | 91 | YakinduumModel model = new YakinduumModel(fileReadFolder+"/run"+run+"/"+ filename); |
90 | 92 | ||
91 | //parse map of violation counts to two list and add them to the result list | 93 | //parse map of violation counts to two list and add them to the result list |
92 | Map<String, Integer> map = ViolationCheck.violationMaps(model.yakinduum); | 94 | Map<String, Integer> map = ViolationCheck.violationMaps(model.yakinduum); |
@@ -110,7 +112,7 @@ public class Main { | |||
110 | ArrayList<String> violationNames = null; | 112 | ArrayList<String> violationNames = null; |
111 | for(int run = 1; run < size+1; run++) { | 113 | for(int run = 1; run < size+1; run++) { |
112 | String filename = run+"_1.xmi"; | 114 | String filename = run+"_1.xmi"; |
113 | YakinduumModel model = new YakinduumModel("output/Viatra_100/run"+run+"/"+ filename); | 115 | YakinduumModel model = new YakinduumModel(fileReadFolder+"/run"+run+"/"+ filename); |
114 | 116 | ||
115 | Map<String, Integer> map = ViolationCheck.violationMaps(model.yakinduum); | 117 | Map<String, Integer> map = ViolationCheck.violationMaps(model.yakinduum); |
116 | if(run == 1) { | 118 | if(run == 1) { |
@@ -143,11 +145,11 @@ public class Main { | |||
143 | public static ArrayList<String> calculateMetric(int run) { | 145 | public static ArrayList<String> calculateMetric(int run) { |
144 | //read model and metric | 146 | //read model and metric |
145 | ArrayList<String> output = new ArrayList<String>(); | 147 | ArrayList<String> output = new ArrayList<String>(); |
146 | GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE); | 148 | GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE, ".xmi"); |
147 | EMFGraph graph = reader.readModel(fileReadFolder+"/run"+run, run + "_1.xmi"); | 149 | EMFGraph graph = reader.readModel(fileReadFolder+"/run"+run, run + "_1.xmi"); |
148 | 150 | MetricSampleGroup metrics = RepMetricsReader.read(Domain.Yakinduum); | |
149 | //KS distance | 151 | //KS distance |
150 | KSDistance ks = new KSDistance(Domain.Yakinduum); | 152 | KSDistance ks = new KSDistance(metrics); |
151 | 153 | ||
152 | //calculate and put metric data to output array | 154 | //calculate and put metric data to output array |
153 | MetricSampleGroup samples = graph.evaluateAllMetricsToSamples(); | 155 | MetricSampleGroup samples = graph.evaluateAllMetricsToSamples(); |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig index 14e1a3f7..d2414e87 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig | |||
@@ -9,11 +9,11 @@ generate { | |||
9 | solver = ViatraSolver | 9 | solver = ViatraSolver |
10 | 10 | ||
11 | scope = { | 11 | scope = { |
12 | #node = 100 | 12 | #node = 1 |
13 | } | 13 | } |
14 | 14 | ||
15 | number = 1 | 15 | number = 1 |
16 | runs = 50 | 16 | runs = 1 |
17 | config = { | 17 | config = { |
18 | log-level = none | 18 | log-level = none |
19 | } | 19 | } |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend index b1986d50..062d69fa 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend | |||
@@ -5,6 +5,7 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter | |||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader | 5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader |
6 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl | 6 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl |
7 | import java.util.ArrayList | 7 | import java.util.ArrayList |
8 | import org.eclipse.emf.ecore.EcorePackage | ||
8 | 9 | ||
9 | //import yakindumm2.impl.Yakindumm2PackageImpl | 10 | //import yakindumm2.impl.Yakindumm2PackageImpl |
10 | 11 | ||
@@ -24,18 +25,19 @@ class Main { | |||
24 | def static void main(String[] args){ | 25 | def static void main(String[] args){ |
25 | //init model | 26 | //init model |
26 | YakindummPackageImpl.eINSTANCE.eClass; | 27 | YakindummPackageImpl.eINSTANCE.eClass; |
28 | EcorePackage.eINSTANCE.eClass; | ||
27 | // Yakindumm2PackageImpl.eINSTANCE.eClass; | 29 | // Yakindumm2PackageImpl.eINSTANCE.eClass; |
28 | //val infos = initData(); | 30 | //val infos = initData(); |
29 | 31 | ||
30 | println("Start Reading Models..."); | 32 | println("Start Reading Models..."); |
31 | var reader = new GraphReader(YakindummPackageImpl.eINSTANCE); | 33 | var reader = new GraphReader(EcorePackage.eINSTANCE, ".xmi"); |
32 | // for(info : infos){ | 34 | // for(info : infos){ |
33 | // calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader); | 35 | // calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader); |
34 | // } | 36 | // } |
35 | 37 | ||
36 | //human input has different package declaration | 38 | //human input has different package declaration |
37 | // reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); | 39 | // reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); |
38 | val human = new RWInformation("Inputs/config15/", "outputs/", 1); | 40 | val human = new RWInformation("Inputs/viatra75/", "outputs/", 50); |
39 | calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader); | 41 | calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader); |
40 | 42 | ||
41 | 43 | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend index d68eb9d2..66dcdff6 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend | |||
@@ -5,11 +5,13 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.JSDistan | |||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance | 5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance |
6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData | 6 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData |
7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph | 7 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph |
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
8 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric | 9 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric |
10 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | ||
9 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric | 11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric |
10 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric | 12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric |
13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric | ||
11 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric | 14 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric |
12 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedOutDegree | ||
13 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel | 15 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel |
14 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation | 16 | import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation |
15 | import java.util.ArrayList | 17 | import java.util.ArrayList |
@@ -18,7 +20,6 @@ import java.util.List | |||
18 | import java.util.Map | 20 | import java.util.Map |
19 | import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression | 21 | import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression |
20 | import org.eclipse.xtend.lib.annotations.Accessors | 22 | import org.eclipse.xtend.lib.annotations.Accessors |
21 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric | ||
22 | 23 | ||
23 | class PartialInterpretationMetricDistance { | 24 | class PartialInterpretationMetricDistance { |
24 | 25 | ||
@@ -28,15 +29,17 @@ class PartialInterpretationMetricDistance { | |||
28 | var Map<Object, StateData> stateAndHistory; | 29 | var Map<Object, StateData> stateAndHistory; |
29 | var OLSMultipleLinearRegression regression; | 30 | var OLSMultipleLinearRegression regression; |
30 | List<StateData> samples; | 31 | List<StateData> samples; |
31 | 32 | var MetricSampleGroup g; | |
32 | @Accessors(PUBLIC_GETTER) | 33 | @Accessors(PUBLIC_GETTER) |
33 | var LinearModel linearModel; | 34 | var LinearModel linearModel; |
34 | 35 | ||
35 | 36 | ||
36 | new(){ | 37 | new(){ |
37 | ks = new KSDistance(Domain.Yakinduum); | 38 | var metrics = RepMetricsReader.read(Domain.Yakinduum); |
38 | js = new JSDistance(Domain.Yakinduum); | 39 | this.g = metrics; |
39 | ed = new EuclideanDistance(Domain.Yakinduum); | 40 | ks = new KSDistance(g); |
41 | js = new JSDistance(g); | ||
42 | ed = new EuclideanDistance(g); | ||
40 | regression = new OLSMultipleLinearRegression(); | 43 | regression = new OLSMultipleLinearRegression(); |
41 | regression.noIntercept = false; | 44 | regression.noIntercept = false; |
42 | stateAndHistory = new HashMap<Object, StateData>(); | 45 | stateAndHistory = new HashMap<Object, StateData>(); |
@@ -56,8 +59,9 @@ class PartialInterpretationMetricDistance { | |||
56 | var mpc = ks.mpcDistance(metricSamples.mpcSamples); | 59 | var mpc = ks.mpcDistance(metricSamples.mpcSamples); |
57 | var na = ks.naDistance(metricSamples.naSamples); | 60 | var na = ks.naDistance(metricSamples.naSamples); |
58 | var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples); | 61 | var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples); |
62 | var nodeType = ks.nodeTypeDistance(metricSamples.nodeTypeSamples); | ||
59 | //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); | 63 | //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); |
60 | var distance = new MetricDistanceGroup(mpc, na, outDegree); | 64 | var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); |
61 | distance.nodeTypeInfo = metricSamples.nodeTypeSamples; | 65 | distance.nodeTypeInfo = metricSamples.nodeTypeSamples; |
62 | return distance; | 66 | return distance; |
63 | } | 67 | } |
@@ -171,14 +175,14 @@ class MetricDistanceGroup{ | |||
171 | var double mpcDistance; | 175 | var double mpcDistance; |
172 | var double naDistance; | 176 | var double naDistance; |
173 | var double outDegreeDistance; | 177 | var double outDegreeDistance; |
174 | var double typedOutDegreeDistance; | 178 | var double nodeTypeDistance; |
175 | protected var HashMap<String, Double> nodeTypeInfo; | 179 | protected var HashMap<String, Double> nodeTypeInfo; |
176 | 180 | ||
177 | new(double mpcDistance, double naDistance, double outDegreeDistance, double typedOutDegreeDistance){ | 181 | new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ |
178 | this.mpcDistance = mpcDistance; | 182 | this.mpcDistance = mpcDistance; |
179 | this.naDistance = naDistance; | 183 | this.naDistance = naDistance; |
180 | this.outDegreeDistance = outDegreeDistance; | 184 | this.outDegreeDistance = outDegreeDistance; |
181 | this.typedOutDegreeDistance = typedOutDegreeDistance; | 185 | this.nodeTypeDistance = nodeTypeDistance; |
182 | } | 186 | } |
183 | 187 | ||
184 | new(double mpcDistance, double naDistance, double outDegreeDistance){ | 188 | new(double mpcDistance, double naDistance, double outDegreeDistance){ |
@@ -187,8 +191,8 @@ class MetricDistanceGroup{ | |||
187 | this.outDegreeDistance = outDegreeDistance; | 191 | this.outDegreeDistance = outDegreeDistance; |
188 | } | 192 | } |
189 | 193 | ||
190 | def double getTypedOutDegreeDistance(){ | 194 | def double getNodeTypeDistance(){ |
191 | return this.typedOutDegreeDistance; | 195 | return this.nodeTypeDistance; |
192 | } | 196 | } |
193 | 197 | ||
194 | def double getMPCDistance(){ | 198 | def double getMPCDistance(){ |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend index b945d97b..d6adcc9a 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend | |||
@@ -18,13 +18,12 @@ class EuclideanDistance extends CostDistance{ | |||
18 | var HashMap<String, Double> outDegreePMF; | 18 | var HashMap<String, Double> outDegreePMF; |
19 | var DecimalFormat formatter; | 19 | var DecimalFormat formatter; |
20 | 20 | ||
21 | new(Domain d){ | 21 | new(MetricSampleGroup g){ |
22 | var metrics = RepMetricsReader.read(d); | 22 | this.g = g; |
23 | this.g = metrics; | ||
24 | 23 | ||
25 | var mpcSamples = metrics.mpcSamples; | 24 | var mpcSamples = g.mpcSamples; |
26 | var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); | 25 | var naSamples = g.naSamples.stream.mapToDouble([it]).toArray(); |
27 | var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); | 26 | var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray(); |
28 | 27 | ||
29 | //needs to format the number to string avoid precision issue | 28 | //needs to format the number to string avoid precision issue |
30 | formatter = new DecimalFormat("#0.00000"); | 29 | formatter = new DecimalFormat("#0.00000"); |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend index df65b81f..4a0a0dc3 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend | |||
@@ -1,7 +1,6 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance | 1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
5 | import com.google.common.collect.Sets | 4 | import com.google.common.collect.Sets |
6 | import java.text.DecimalFormat | 5 | import java.text.DecimalFormat |
7 | import java.util.HashMap | 6 | import java.util.HashMap |
@@ -11,13 +10,13 @@ class JSDistance extends CostDistance { | |||
11 | var HashMap<String, Double> mpcPMF; | 10 | var HashMap<String, Double> mpcPMF; |
12 | var HashMap<String, Double> naPMF; | 11 | var HashMap<String, Double> naPMF; |
13 | var HashMap<String, Double> outDegreePMF; | 12 | var HashMap<String, Double> outDegreePMF; |
13 | var HashMap<String, Double> nodeTypesPMF; | ||
14 | var DecimalFormat formatter; | 14 | var DecimalFormat formatter; |
15 | 15 | ||
16 | new(Domain d){ | 16 | new(MetricSampleGroup g){ |
17 | var metrics = RepMetricsReader.read(d); | 17 | var mpcSamples = g.mpcSamples; |
18 | var mpcSamples = metrics.mpcSamples; | 18 | var naSamples = g.naSamples.stream.mapToDouble([it]).toArray(); |
19 | var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); | 19 | var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray(); |
20 | var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); | ||
21 | 20 | ||
22 | //needs to format the number to string avoid precision issue | 21 | //needs to format the number to string avoid precision issue |
23 | formatter = new DecimalFormat("#0.00000"); | 22 | formatter = new DecimalFormat("#0.00000"); |
@@ -25,6 +24,7 @@ class JSDistance extends CostDistance { | |||
25 | mpcPMF = pmfFromSamples(mpcSamples, formatter); | 24 | mpcPMF = pmfFromSamples(mpcSamples, formatter); |
26 | naPMF = pmfFromSamples(naSamples, formatter); | 25 | naPMF = pmfFromSamples(naSamples, formatter); |
27 | outDegreePMF = pmfFromSamples(outDegreeSamples, formatter); | 26 | outDegreePMF = pmfFromSamples(outDegreeSamples, formatter); |
27 | nodeTypesPMF = g.nodeTypeSamples; | ||
28 | } | 28 | } |
29 | 29 | ||
30 | def private combinePMF(HashMap<String, Double> pmf1, HashMap<String, Double> pmf2){ | 30 | def private combinePMF(HashMap<String, Double> pmf1, HashMap<String, Double> pmf2){ |
@@ -81,4 +81,8 @@ class JSDistance extends CostDistance { | |||
81 | if(map.size < 2) return 1; | 81 | if(map.size < 2) return 1; |
82 | return jsDivergence(map, outDegreePMF); | 82 | return jsDivergence(map, outDegreePMF); |
83 | } | 83 | } |
84 | |||
85 | def nodeTypeDistance(HashMap<String, Double> samples){ | ||
86 | return klDivergence(samples, nodeTypesPMF); | ||
87 | } | ||
84 | } \ No newline at end of file | 88 | } \ No newline at end of file |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend index 86f5f23c..08d8704a 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend | |||
@@ -1,22 +1,18 @@ | |||
1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance | 1 | package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance |
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | ||
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader | ||
5 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
6 | import java.util.HashMap | 4 | import java.util.HashMap |
7 | import java.util.HashSet | 5 | import java.util.HashSet |
8 | import java.util.List | 6 | import java.util.List |
9 | import java.util.Set | ||
10 | import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest | 7 | import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest |
11 | 8 | ||
12 | class KSDistance extends CostDistance { | 9 | class KSDistance extends CostDistance { |
13 | var static ksTester = new KolmogorovSmirnovTest(); | 10 | var static ksTester = new KolmogorovSmirnovTest(); |
14 | var MetricSampleGroup g; | 11 | var MetricSampleGroup g; |
15 | new(Domain d){ | ||
16 | var metrics = RepMetricsReader.read(d); | ||
17 | this.g = metrics; | ||
18 | } | ||
19 | 12 | ||
13 | new(MetricSampleGroup g){ | ||
14 | this.g = g; | ||
15 | } | ||
20 | override double mpcDistance(List<Double> samples){ | 16 | override double mpcDistance(List<Double> samples){ |
21 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 | 17 | //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 |
22 | if(samples.size < 2) return 1; | 18 | if(samples.size < 2) return 1; |
@@ -63,4 +59,27 @@ class KSDistance extends CostDistance { | |||
63 | 59 | ||
64 | return value; | 60 | return value; |
65 | } | 61 | } |
62 | |||
63 | def nodeTypeDistance(HashMap<String, Double> samples){ | ||
64 | var typesDistMap = g.nodeTypeSamples; | ||
65 | var sourceDist = newArrayList(); | ||
66 | var instanceDist = newArrayList(); | ||
67 | |||
68 | for(key : typesDistMap.keySet()){ | ||
69 | sourceDist.add(typesDistMap.get(key)); | ||
70 | instanceDist.add(samples.getOrDefault(key, 0.0)); | ||
71 | } | ||
72 | |||
73 | // Since we already know the pdf, we compute the ks-test manully | ||
74 | var ksStatistics = 0.0; | ||
75 | var sum1 = 0.0; | ||
76 | var sum2 = 0.0; | ||
77 | for(var i = 0; i < sourceDist.size(); i++){ | ||
78 | sum1 += sourceDist.get(i); | ||
79 | sum2 += instanceDist.get(i); | ||
80 | |||
81 | ksStatistics = Math.max(ksStatistics, Math.abs(sum1 - sum2)); | ||
82 | } | ||
83 | return ksStatistics; | ||
84 | } | ||
66 | } \ No newline at end of file | 85 | } \ No newline at end of file |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend index 4ebd59b7..959006f4 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend | |||
@@ -24,7 +24,8 @@ class EMFGraph extends Graph{ | |||
24 | */ | 24 | */ |
25 | def void init(List<EObject> objects, List<Metric> metrics, String name, List<EReference> referenceTypes){ | 25 | def void init(List<EObject> objects, List<Metric> metrics, String name, List<EReference> referenceTypes){ |
26 | objects.forEach[it| | 26 | objects.forEach[it| |
27 | var types = new HashSet(it.eClass.EAllSuperTypes.map[it|it.name]); | 27 | // TODO: Maybe want to consider all the super types as well |
28 | var types = new HashSet(); | ||
28 | types.add(it.eClass.name); | 29 | types.add(it.eClass.name); |
29 | statistic.addNodeWithAllTypes(it, types); | 30 | statistic.addNodeWithAllTypes(it, types); |
30 | ] | 31 | ] |
@@ -38,18 +39,13 @@ class EMFGraph extends Graph{ | |||
38 | // )){ | 39 | // )){ |
39 | // typeToAdd = it.EOpposite; | 40 | // typeToAdd = it.EOpposite; |
40 | // } | 41 | // } |
41 | //if(!typeToAdd.name.equals('incomingTransitions')){ | 42 | // |
42 | statistic.addEdgeType(typeToAdd.name); | 43 | statistic.addEdgeType(typeToAdd.name); |
43 | //} | ||
44 | ]; | 44 | ]; |
45 | 45 | ||
46 | objects.forEach[source| | 46 | objects.forEach[source| |
47 | source.eClass.EAllReferences.forEach[r| | 47 | source.eClass.EAllReferences.forEach[r| |
48 | //add the type first (if it is not added already) | ||
49 | //many references | 48 | //many references |
50 | // if(r.name.equals('incomingTransitions')){ | ||
51 | // return; | ||
52 | // } | ||
53 | if(r.isMany){ | 49 | if(r.isMany){ |
54 | source.getNeighbours(r).forEach[target| | 50 | source.getNeighbours(r).forEach[target| |
55 | addEdge(source, target, r); | 51 | addEdge(source, target, r); |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend index bb679bf6..ef68f366 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend | |||
@@ -21,16 +21,19 @@ class PartialInterpretationGraph extends Graph{ | |||
21 | //only need the name of the reference type (remove everything with and after "reference") | 21 | //only need the name of the reference type (remove everything with and after "reference") |
22 | var n = it.name.split(" ").get(0); | 22 | var n = it.name.split(" ").get(0); |
23 | // TODO: Here is to only consider one part of opposite edges | 23 | // TODO: Here is to only consider one part of opposite edges |
24 | //if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){ | 24 | if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){ |
25 | this.statistic.addEdgeType(n); | 25 | this.statistic.addEdgeType(n); |
26 | //} | 26 | } |
27 | ] | 27 | ] |
28 | // add all elements | 28 | // add all elements |
29 | val typeInterpretations = getTypes(partial); | 29 | val typeInterpretations = getTypes(partial); |
30 | for(type : typeInterpretations){ | 30 | for(type : typeInterpretations){ |
31 | var typeName = type.interpretationOf.name.replace(classSuffix, ''); | 31 | //Only consider the most concrete class |
32 | for(node : type.elements){ | 32 | if(type.interpretationOf.subtypes.size == 0){ |
33 | this.statistic.addNodeWithType(node, typeName); | 33 | var typeName = type.interpretationOf.name.replace(classSuffix, ''); |
34 | for(node : type.elements){ | ||
35 | this.statistic.addNodeWithType(node, typeName); | ||
36 | } | ||
34 | } | 37 | } |
35 | } | 38 | } |
36 | 39 | ||
@@ -38,11 +41,11 @@ class PartialInterpretationGraph extends Graph{ | |||
38 | //only need the name of the reference type (remove everything with and after "reference") | 41 | //only need the name of the reference type (remove everything with and after "reference") |
39 | val type = relationInterpretation.interpretationOf.name.split(" ").get(0); | 42 | val type = relationInterpretation.interpretationOf.name.split(" ").get(0); |
40 | // TODO: Here is to only consider one part of opposite edges | 43 | // TODO: Here is to only consider one part of opposite edges |
41 | //if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){ | 44 | if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){ |
42 | for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ | 45 | for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ |
43 | statistic.addEdge(edge.param1, edge.param2, type); | 46 | statistic.addEdge(edge.param1, edge.param2, type); |
44 | } | 47 | } |
45 | //} | 48 | } |
46 | } | 49 | } |
47 | 50 | ||
48 | this.name = name; | 51 | this.name = name; |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend index ffec372b..491501b0 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend | |||
@@ -24,9 +24,11 @@ import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl | |||
24 | class GraphReader{ | 24 | class GraphReader{ |
25 | val ResourceSet resSet = new ResourceSetImpl(); | 25 | val ResourceSet resSet = new ResourceSetImpl(); |
26 | val referenceTypes = new ArrayList<EReference>(); | 26 | val referenceTypes = new ArrayList<EReference>(); |
27 | var String suffix; | ||
27 | 28 | ||
28 | new(EPackage metaModel) { | 29 | new(EPackage metaModel, String suffix) { |
29 | Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl) | 30 | Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl) |
31 | this.suffix = suffix; | ||
30 | 32 | ||
31 | //find all reference types in the meta model | 33 | //find all reference types in the meta model |
32 | metaModel.eAllContents.forEach[ | 34 | metaModel.eAllContents.forEach[ |
@@ -52,14 +54,14 @@ class GraphReader{ | |||
52 | metrics.add(new NodeTypeMetric()); | 54 | metrics.add(new NodeTypeMetric()); |
53 | metrics.add(new EdgeTypeMetric()); | 55 | metrics.add(new EdgeTypeMetric()); |
54 | 56 | ||
55 | //check all files in the directory with xmi | 57 | //check all files in the directory with suffix |
56 | for(String name : dir.list.filter[it| it.endsWith(".xmi")]){ | 58 | for(String name : dir.list.filter[it| it.endsWith(suffix)]){ |
57 | val file = new File(name); | 59 | val file = new File(name); |
58 | val roots = readModel(EObject, path, file.name); | 60 | val roots = readModel(EObject, path, file.name); |
59 | //add a list of metrics | 61 | //add a list of metrics |
60 | val g = new EMFGraph(); | 62 | val g = new EMFGraph(); |
61 | for(root : roots){ | 63 | for(root : roots){ |
62 | g.init(root, metrics, name.replaceFirst(".xmi", ""), referenceTypes); | 64 | g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes); |
63 | } | 65 | } |
64 | 66 | ||
65 | graphs.add(g); | 67 | graphs.add(g); |
@@ -82,7 +84,7 @@ class GraphReader{ | |||
82 | //add a list of metrics | 84 | //add a list of metrics |
83 | val g = new EMFGraph(); | 85 | val g = new EMFGraph(); |
84 | for(root : roots){ | 86 | for(root : roots){ |
85 | g.init(root, metrics, filename.replaceFirst(".xmi", ""), referenceTypes); | 87 | g.init(root, metrics, filename.replaceFirst(suffix, ""), referenceTypes); |
86 | } | 88 | } |
87 | return g | 89 | return g |
88 | } | 90 | } |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend index 2ea12581..6af0b6c7 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend | |||
@@ -3,13 +3,14 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io | |||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain |
4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup | 4 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup |
5 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl | 5 | import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl |
6 | import java.util.HashMap | ||
6 | 7 | ||
7 | /** | 8 | /** |
8 | * Read the sample of the distribution of a metric provided the csv file of the metric | 9 | * Read the sample of the distribution of a metric provided the csv file of the metric |
9 | */ | 10 | */ |
10 | class RepMetricsReader { | 11 | class RepMetricsReader { |
11 | static def read(Domain d){ | 12 | static def read(Domain d){ |
12 | var reader = new GraphReader(YakindummPackageImpl.eINSTANCE); | 13 | var reader = new GraphReader(YakindummPackageImpl.eINSTANCE, '.xmi'); |
13 | 14 | ||
14 | 15 | ||
15 | var domainRepPath = DataName.REP_PATH + d.name + '/'; | 16 | var domainRepPath = DataName.REP_PATH + d.name + '/'; |
@@ -20,7 +21,20 @@ class RepMetricsReader { | |||
20 | rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples; | 21 | rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples; |
21 | rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples; | 22 | rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples; |
22 | rep.edgeTypeSamples = out_d.edgeTypeSamples; | 23 | rep.edgeTypeSamples = out_d.edgeTypeSamples; |
23 | rep.nodeTypeSamples = out_d.nodeTypeSamples; | 24 | |
25 | //TODO: Parameterize the prior node distribution | ||
26 | var nodeTypeSamples = new HashMap<String, Double>(); | ||
27 | nodeTypeSamples.put('Entry', 0.04257802080554814); | ||
28 | nodeTypeSamples.put('Choice', 0.1267671379034409); | ||
29 | nodeTypeSamples.put('State', 0.1596092291277674); | ||
30 | nodeTypeSamples.put('Transition', 0.6138636969858629); | ||
31 | nodeTypeSamples.put('Statechart', 0.010136036276340358); | ||
32 | nodeTypeSamples.put('Region', 0.04467858095492131); | ||
33 | nodeTypeSamples.put('Exit', 0.0018338223526273673); | ||
34 | nodeTypeSamples.put('FinalState', 0.0005334755934915977); | ||
35 | |||
36 | |||
37 | rep.nodeTypeSamples = nodeTypeSamples; | ||
24 | return rep; | 38 | return rep; |
25 | } | 39 | } |
26 | 40 | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png new file mode 100644 index 00000000..1d17b819 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png new file mode 100644 index 00000000..64eee192 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png new file mode 100644 index 00000000..eb298324 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/MPC.png deleted file mode 100644 index 9b0863ae..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Node Activity.png deleted file mode 100644 index 499c83a2..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Out Degree.png deleted file mode 100644 index 1816c3e6..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/MPC.png deleted file mode 100644 index 7d317bb4..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/Node Activity.png deleted file mode 100644 index 323635f2..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/Out Degree.png deleted file mode 100644 index aaf2d258..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/MPC.png deleted file mode 100644 index 05e0f430..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/Node Activity.png deleted file mode 100644 index c1e23deb..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/Out Degree.png deleted file mode 100644 index 8bb96d31..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (30 nodes)-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/MPC.png new file mode 100644 index 00000000..9333cd3c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/Node Activity.png new file mode 100644 index 00000000..a019eabb --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/Out Degree.png new file mode 100644 index 00000000..591db64a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/MPC.png new file mode 100644 index 00000000..7ec6c3f7 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/Node Activity.png new file mode 100644 index 00000000..70e3f8b1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/Out Degree.png new file mode 100644 index 00000000..3751722b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (75 nodes)-Human rep-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/MPC.png new file mode 100644 index 00000000..d7ed3bbb --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Node Activity.png new file mode 100644 index 00000000..8a20963d --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Out Degree.png new file mode 100644 index 00000000..4354656c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png new file mode 100644 index 00000000..df162a5a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..703f9c56 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..873a40c1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Human rep-Viatra consistent (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png new file mode 100644 index 00000000..826b797f --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..babf7266 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..31f74863 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png new file mode 100644 index 00000000..a4717b87 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..946f2aa1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..668423cc --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/MPC.png new file mode 100644 index 00000000..f4301083 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Node Activity.png new file mode 100644 index 00000000..fd27fdd4 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Out Degree.png new file mode 100644 index 00000000..39fc0cf9 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Alloy (30 nodes)-Realistic Viatra with Node Type KS (100 nodes)-Human-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png new file mode 100644 index 00000000..545aab79 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..6e92f726 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..a57f399b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Human rep-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/MPC.png new file mode 100644 index 00000000..30d74805 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..2e34fead --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..bc9d6016 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Realistic Viatra no Exit (100 nodes)-Realistic Viatra consistent (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/MPC.png index 39e1c4ec..39e1c4ec 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Node Activity.png index 16ac54dd..16ac54dd 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Out Degree.png index 99ebd383..99ebd383 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/MPC.png index 08983af2..08983af2 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Node Activity.png index 704ac0f4..704ac0f4 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Out Degree.png index 93ba4a66..93ba4a66 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra V2 (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png index e0d5b199..e0d5b199 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png index ddcc2451..ddcc2451 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png index e0ea1c75..e0ea1c75 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra containers (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png index 430e7279..430e7279 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png index fc15d7f5..fc15d7f5 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png index 20499e22..20499e22 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra new (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/MPC.png new file mode 100644 index 00000000..ab519eaa --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..7726b292 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..5416c350 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Realistic Viatra no Exit (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/MPC.png index 601fc7f1..601fc7f1 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Node Activity.png index 76773aa4..76773aa4 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Out Degree.png index 2e459f1a..2e459f1a 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra (100 nodes)-Viatra Consistent (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/MPC.png new file mode 100644 index 00000000..9d12c2d8 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..56745bc0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..24f29731 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra no Exit Final (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/MPC.png new file mode 100644 index 00000000..dcd1eaa2 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..ac912936 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..4c9abbcb --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png new file mode 100644 index 00000000..ffd0079e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png new file mode 100644 index 00000000..bda5f52e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png new file mode 100644 index 00000000..e223ad4a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/KS Distance/Human-Viatra consistent (100 nodes)-Realistic Viatra (100 nodes)-Realistic Viatra with Node Type KS (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png index 4f8e97e2..4f8e97e2 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png index 7c2b5752..7c2b5752 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png index 3cf659b2..3cf659b2 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/MPC.png index 50b882da..50b882da 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Node Activity.png index 4e9a68d5..4e9a68d5 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Out Degree.png index bfa4b537..bfa4b537 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/MPC.png index 33176821..33176821 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png index 53c46e6f..53c46e6f 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png index abf45ff1..abf45ff1 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/Euclidean_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png index 07c97401..07c97401 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png index f2fb5229..f2fb5229 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png index d2677e99..d2677e99 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-/MPC.png index a375c676..a375c676 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Node Activity.png index d69cd298..d69cd298 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Out Degree.png index 0584ac99..0584ac99 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png index 016cc2a3..016cc2a3 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png index 55d32444..55d32444 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png index 99cbbae4..99cbbae4 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/JS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png index b8480ae0..b8480ae0 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png index 82268167..82268167 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png index 41bcd510..41bcd510 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Realistic Viatra With Some Constraints (100 nodes)-Viatra (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-/MPC.png index b19bb958..b19bb958 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Node Activity.png index cccabc4e..cccabc4e 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Out Degree.png index 947ebdd2..947ebdd2 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/MPC.png index 0ff4ee89..0ff4ee89 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Node Activity.png index 1f9e2e18..1f9e2e18 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Out Degree.png index 2c63cc3a..2c63cc3a 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Alloy (30 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png index 8d76fed9..8d76fed9 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png index daa7929a..daa7929a 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png index e56b1b6e..e56b1b6e 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/MPC.png index 8705cee2..8705cee2 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Node Activity.png index bdab3741..bdab3741 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Out Degree.png index e4269f6e..e4269f6e 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Random-Viatra (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/MPC.png index e4b6b527..e4b6b527 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Node Activity.png index e067ad66..e067ad66 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Out Degree.png index 9b89e4f9..9b89e4f9 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra (30 nodes)-Viatra (60 nodes)-Viatra (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/MPC.png index 820df5c7..820df5c7 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Node Activity.png index b6aa957a..b6aa957a 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Out Degree.png index 161041d9..161041d9 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/Human-Viatra consistent (100 nodes)-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/real vs viatra vs alloy/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/real vs viatra vs alloy/MPC.png index 4f189578..4f189578 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/real vs viatra vs alloy/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/real vs viatra vs alloy/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/real vs viatra vs alloy/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/real vs viatra vs alloy/Node Activity.png index add3c0f8..add3c0f8 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/real vs viatra vs alloy/Node Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/real vs viatra vs alloy/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/real vs viatra vs alloy/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/real vs viatra vs alloy/Out Degree.png index f4717a1a..f4717a1a 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/old measurements/KS_Distance/real vs viatra vs alloy/Out Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/old measurements/KS_Distance/real vs viatra vs alloy/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py index 1ac7af75..d761ef82 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py | |||
@@ -12,26 +12,36 @@ import DistributionMetrics as metrics | |||
12 | 12 | ||
13 | def main(): | 13 | def main(): |
14 | # read models | 14 | # read models |
15 | human = GraphCollection('../input/humanOutput/', 500, 'Human') | 15 | human = GraphCollection('../input/yakindumm/human_output_100/', 500, 'Human') |
16 | human_na = GraphCollection('../input/yakindumm/human_output_100/na_rep/', 1, 'Human rep') | ||
17 | human_mpc = GraphCollection('../input/yakindumm/human_output_100/mpc_rep/', 1, 'Human rep') | ||
18 | human_od = GraphCollection('../input/yakindumm/human_output_100/od_rep/', 1, 'Human rep') | ||
19 | |||
20 | #viatra75 = GraphCollection('../input/viatra_75/', 500, 'Viatra (75 nodes)') | ||
16 | # viatra30 = GraphCollection('../input/viatraOutput30/', 500,'Viatra (30 nodes)') | 21 | # viatra30 = GraphCollection('../input/viatraOutput30/', 500,'Viatra (30 nodes)') |
17 | # viatra60 = GraphCollection('../input/viatraOutput60/', 500, 'Viatra (60 nodes)') | 22 | # viatra60 = GraphCollection('../input/viatraOutput60/', 500, 'Viatra (60 nodes)') |
18 | viatra100 = GraphCollection('../input/viatraOutput100/', 500, 'Viatra (100 nodes)') | 23 | # viatra100 = GraphCollection('../input/viatraOutput100/', 500, 'Viatra (100 nodes)') |
19 | viatra100R = GraphCollection('../input/realisticViatraOutput_container/', 500, 'Realistic Viatra containers (100 nodes)') | 24 | # viatra100R = GraphCollection('../input/realisticViatraOutput_newMetric/', 500, 'Realistic Viatra (100 nodes)') |
20 | viatra100C = GraphCollection('../input/viatraOutput100C/', 500, 'Realistic Viatra consistent (100 nodes)') | 25 | viatra100C = GraphCollection('../input/yakindumm/viatraOutput100C/', 500, 'Viatra consistent (100 nodes)') |
21 | viatra100EE = GraphCollection('../input/realisticViatra_excludeExit/', 500, 'Realistic Viatra no Exit (100 nodes)') | 26 | # viatra100EE = GraphCollection('../input/realisticViatra_excludeExit/', 500, 'Realistic Viatra no Exit (100 nodes)') |
27 | # viatra100EEF = GraphCollection('../input/realisticViatra_excludeExitFinal/', 500, 'Realistic Viatra no Exit Final (100 nodes)') | ||
28 | viatra100NT = GraphCollection('../input/yakindumm/realisticVIatraOutput_nodeTypeKS/', 500, 'Realistic Viatra with Node Type KS (100 nodes)') | ||
29 | |||
22 | # random = GraphCollection('../input/randomOutput/', 500, 'Random') | 30 | # random = GraphCollection('../input/randomOutput/', 500, 'Random') |
23 | # alloy = GraphCollection('../input/alloyOutput/', 500, 'Alloy (30 nodes)') | 31 | # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)') |
24 | # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)') | 32 | # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)') |
25 | # human100 = GraphCollection('../input/human_output_100/', 304, 'Human') | 33 | # human100 = GraphCollection('../input/human_output_100/', 304, 'Human') |
26 | models_to_compare = [human, viatra100EE,viatra100C] | 34 | models_to_compare_na = [human, human_na, viatra100C,viatra100NT] |
35 | models_to_compare_mpc = [human, human_mpc ,viatra100C,viatra100NT] | ||
36 | models_to_compare_od = [human, human_od, viatra100C,viatra100NT] | ||
27 | 37 | ||
28 | # define output folder | 38 | # define output folder |
29 | outputFolder = '../output/' | 39 | outputFolder = '../output/Yakindumm/' |
30 | 40 | ||
31 | #calculate metrics | 41 | #calculate metrics |
32 | metricStat(models_to_compare, 'Node Activity', nodeActivity, 0, outputFolder) | 42 | metricStat(models_to_compare_na, 'Node Activity', nodeActivity, 0, outputFolder) |
33 | metricStat(models_to_compare, 'Out Degree', outDegree, 1, outputFolder) | 43 | metricStat(models_to_compare_od, 'Out Degree', outDegree, 1, outputFolder) |
34 | metricStat(models_to_compare, 'MPC', mpc, 2, outputFolder) | 44 | metricStat(models_to_compare_mpc, 'MPC', mpc, 2, outputFolder) |
35 | 45 | ||
36 | def calculateKSMatrix(dists): | 46 | def calculateKSMatrix(dists): |
37 | dist = [] | 47 | dist = [] |
@@ -43,7 +53,7 @@ def calculateKSMatrix(dists): | |||
43 | for i in range(len(dist)): | 53 | for i in range(len(dist)): |
44 | matrix[i,i] = 0 | 54 | matrix[i,i] = 0 |
45 | for j in range(i+1, len(dist)): | 55 | for j in range(i+1, len(dist)): |
46 | value, p = metrics.ks_distance(dist[i], dist[j]) | 56 | value, p= metrics.ks_distance(dist[i], dist[j]) |
47 | matrix[i, j] = value | 57 | matrix[i, j] = value |
48 | matrix[j, i] = value | 58 | matrix[j, i] = value |
49 | return matrix | 59 | return matrix |
@@ -55,7 +65,7 @@ def calculateMDS(dissimilarities): | |||
55 | return trans | 65 | return trans |
56 | 66 | ||
57 | def plot(graphTypes, coords, title='',index = 0, savePath = ''): | 67 | def plot(graphTypes, coords, title='',index = 0, savePath = ''): |
58 | color = ['blue', 'red', 'green', 'yellow'] | 68 | color = ['blue', 'red', 'yellow', 'green', 'k'] |
59 | plt.figure(index, figsize=(7, 4)) | 69 | plt.figure(index, figsize=(7, 4)) |
60 | plt.title(title) | 70 | plt.title(title) |
61 | index = 0 | 71 | index = 0 |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb index 329a46f6..543b0ab7 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb | |||
@@ -16,7 +16,7 @@ | |||
16 | }, | 16 | }, |
17 | { | 17 | { |
18 | "cell_type": "code", | 18 | "cell_type": "code", |
19 | "execution_count": 11, | 19 | "execution_count": 1, |
20 | "metadata": {}, | 20 | "metadata": {}, |
21 | "outputs": [], | 21 | "outputs": [], |
22 | "source": [ | 22 | "source": [ |
@@ -70,7 +70,7 @@ | |||
70 | { | 70 | { |
71 | "data": { | 71 | "data": { |
72 | "text/plain": [ | 72 | "text/plain": [ |
73 | "304" | 73 | "231" |
74 | ] | 74 | ] |
75 | }, | 75 | }, |
76 | "execution_count": 3, | 76 | "execution_count": 3, |
@@ -90,8 +90,7 @@ | |||
90 | " orientation='horizontal'\n", | 90 | " orientation='horizontal'\n", |
91 | ")\n", | 91 | ")\n", |
92 | "\n", | 92 | "\n", |
93 | "\n", | 93 | "humanFiles = reader.readmultiplefiles('../input/human_models_75/', 1300, False)\n", |
94 | "humanFiles = reader.readmultiplefiles('../input/human_output_100/', 1300, False)\n", | ||
95 | "modelToFileName = {}\n", | 94 | "modelToFileName = {}\n", |
96 | "for name in humanFiles:\n", | 95 | "for name in humanFiles:\n", |
97 | " modelToFileName[GraphStat(name)] = name\n", | 96 | " modelToFileName[GraphStat(name)] = name\n", |
@@ -138,20 +137,29 @@ | |||
138 | "cell_type": "markdown", | 137 | "cell_type": "markdown", |
139 | "metadata": {}, | 138 | "metadata": {}, |
140 | "source": [ | 139 | "source": [ |
141 | "### Find representative for out degree" | 140 | "## Find representative for out degree" |
142 | ] | 141 | ] |
143 | }, | 142 | }, |
144 | { | 143 | { |
145 | "cell_type": "markdown", | 144 | "cell_type": "markdown", |
146 | "metadata": {}, | 145 | "metadata": {}, |
147 | "source": [ | 146 | "source": [ |
147 | "### For Yakindumm\n", | ||
148 | "#### For all human models\n", | 148 | "#### For all human models\n", |
149 | "* the rep found is ../input/humanOutput\\R_20158_run_1.csv\n", | 149 | "* the rep found is ../input/humanOutput\\R_20158_run_1.csv\n", |
150 | "* the average distance between it and others is 0.05515988287586802\n", | 150 | "* the average distance between it and others is 0.05515988287586802\n", |
151 | "\n", | 151 | "\n", |
152 | "#### For human models with $100 \\pm 10$ nodes\n", | 152 | "#### For human models with $100 \\pm 10$ nodes\n", |
153 | "* the rep found is ../input/human_output_100\\R_2015225_run_1.csv\n", | 153 | "* the rep found is ../input/human_output_100\\R_2015225_run_1.csv\n", |
154 | "* the average distance between it and others is $0.046150929558524685$" | 154 | "* the average distance between it and others is $0.046150929558524685$\n", |
155 | "\n", | ||
156 | "#### for human model with $100 \\pm 10$ nodes and new metric\n", | ||
157 | "* the rep found is ../input/human_output_100\\R_2015248_run_1.csv\n", | ||
158 | "* average distance: 0.052753778714861366\n", | ||
159 | "* median: 0.0468131868131868\n", | ||
160 | "* std: 0.0246917800149673\n", | ||
161 | "* max: 0.15993907083015996\n", | ||
162 | "* min: 0.0" | ||
155 | ] | 163 | ] |
156 | }, | 164 | }, |
157 | { | 165 | { |
@@ -163,8 +171,8 @@ | |||
163 | "name": "stdout", | 171 | "name": "stdout", |
164 | "output_type": "stream", | 172 | "output_type": "stream", |
165 | "text": [ | 173 | "text": [ |
166 | "../input/human_output_100\\R_2015225_run_1.csv\n", | 174 | "../input/human_models_75\\146.csv\n", |
167 | "../input/human_output_100\\R_2015225_run_1.csv\n" | 175 | "../input/human_models_75\\146.csv\n" |
168 | ] | 176 | ] |
169 | } | 177 | } |
170 | ], | 178 | ], |
@@ -177,16 +185,17 @@ | |||
177 | }, | 185 | }, |
178 | { | 186 | { |
179 | "cell_type": "code", | 187 | "cell_type": "code", |
180 | "execution_count": 15, | 188 | "execution_count": 6, |
181 | "metadata": {}, | 189 | "metadata": {}, |
182 | "outputs": [ | 190 | "outputs": [ |
183 | { | 191 | { |
184 | "name": "stdout", | 192 | "name": "stdout", |
185 | "output_type": "stream", | 193 | "output_type": "stream", |
186 | "text": [ | 194 | "text": [ |
187 | "average distance: 0.04615092955852465\n", | 195 | "average distance: 0.14846721554626746\n", |
188 | "std: 0.017305709419913242\n", | 196 | "median: 0.11344781014856264\n", |
189 | "max: 0.1411706837186424\n", | 197 | "std: 0.0839789139821567\n", |
198 | "max: 0.40999194198227235\n", | ||
190 | "min: 0.0\n" | 199 | "min: 0.0\n" |
191 | ] | 200 | ] |
192 | } | 201 | } |
@@ -196,6 +205,7 @@ | |||
196 | "for model in models:\n", | 205 | "for model in models:\n", |
197 | " distances.append(ks_value(od_rep_model.out_d, model.out_d))\n", | 206 | " distances.append(ks_value(od_rep_model.out_d, model.out_d))\n", |
198 | "print('average distance: ', np.mean(distances))\n", | 207 | "print('average distance: ', np.mean(distances))\n", |
208 | "print('median: ', np.median(distances))\n", | ||
199 | "print('std: ', np.std(distances))\n", | 209 | "print('std: ', np.std(distances))\n", |
200 | "print('max:', max(distances))\n", | 210 | "print('max:', max(distances))\n", |
201 | "print('min:', min(distances))" | 211 | "print('min:', min(distances))" |
@@ -205,20 +215,29 @@ | |||
205 | "cell_type": "markdown", | 215 | "cell_type": "markdown", |
206 | "metadata": {}, | 216 | "metadata": {}, |
207 | "source": [ | 217 | "source": [ |
208 | "### Find Representative for node activities" | 218 | "## Find Representative for node activities" |
209 | ] | 219 | ] |
210 | }, | 220 | }, |
211 | { | 221 | { |
212 | "cell_type": "markdown", | 222 | "cell_type": "markdown", |
213 | "metadata": {}, | 223 | "metadata": {}, |
214 | "source": [ | 224 | "source": [ |
225 | "### For Yakindumm\n", | ||
215 | "#### For all human models\n", | 226 | "#### For all human models\n", |
216 | "* the rep found is ../input/humanOutput\\R_2016176_run_1.csv\n", | 227 | "* the rep found is ../input/humanOutput\\R_2016176_run_1.csv\n", |
217 | "* the average distance between it and others is 0.05275267434589047\n", | 228 | "* the average distance between it and others is 0.05275267434589047\n", |
218 | "\n", | 229 | "\n", |
219 | "#### For human models with $100 \\pm 10$ nodes\n", | 230 | "#### For human models with $100 \\pm 10$ nodes\n", |
220 | "* the rep found is ../input/human_output_100\\R_2017419_run_1.csv\n", | 231 | "* the rep found is ../input/human_output_100\\R_2017419_run_1.csv\n", |
221 | "* the average distance between it and others is $0.04679429311806747$" | 232 | "* the average distance between it and others is $0.04679429311806747$\n", |
233 | "\n", | ||
234 | "#### for human model with $100 \\pm 10$ nodes and new metric\n", | ||
235 | "* the rep found is ../input/human_output_100\\R_2017131_run_1.csv\n", | ||
236 | "* average distance: 0.024629205820449567\n", | ||
237 | "* median: 0.023787888564682946\n", | ||
238 | "* std: 0.013845547883198073\n", | ||
239 | "* max: 0.09044674910251294\n", | ||
240 | "* min: 0.0" | ||
222 | ] | 241 | ] |
223 | }, | 242 | }, |
224 | { | 243 | { |
@@ -230,8 +249,8 @@ | |||
230 | "name": "stdout", | 249 | "name": "stdout", |
231 | "output_type": "stream", | 250 | "output_type": "stream", |
232 | "text": [ | 251 | "text": [ |
233 | "../input/human_output_100\\R_2017419_run_1.csv\n", | 252 | "../input/human_models_75\\97.csv\n", |
234 | "../input/human_output_100\\R_2017419_run_1.csv\n" | 253 | "../input/human_models_75\\97.csv\n" |
235 | ] | 254 | ] |
236 | } | 255 | } |
237 | ], | 256 | ], |
@@ -244,16 +263,17 @@ | |||
244 | }, | 263 | }, |
245 | { | 264 | { |
246 | "cell_type": "code", | 265 | "cell_type": "code", |
247 | "execution_count": 14, | 266 | "execution_count": 8, |
248 | "metadata": {}, | 267 | "metadata": {}, |
249 | "outputs": [ | 268 | "outputs": [ |
250 | { | 269 | { |
251 | "name": "stdout", | 270 | "name": "stdout", |
252 | "output_type": "stream", | 271 | "output_type": "stream", |
253 | "text": [ | 272 | "text": [ |
254 | "average distance: 0.046794293118067494\n", | 273 | "average distance: 0.16296252607812808\n", |
255 | "std: 0.02880119213919405\n", | 274 | "median: 0.11606886657101867\n", |
256 | "max: 0.18702970297029703\n", | 275 | "std: 0.1196590575339798\n", |
276 | "max: 0.49411764705882355\n", | ||
257 | "min: 0.0\n" | 277 | "min: 0.0\n" |
258 | ] | 278 | ] |
259 | } | 279 | } |
@@ -263,6 +283,7 @@ | |||
263 | "for model in models:\n", | 283 | "for model in models:\n", |
264 | " distances.append(ks_value(na_rep_model.na, model.na))\n", | 284 | " distances.append(ks_value(na_rep_model.na, model.na))\n", |
265 | "print('average distance: ', np.mean(distances))\n", | 285 | "print('average distance: ', np.mean(distances))\n", |
286 | "print('median: ', np.median(distances))\n", | ||
266 | "print('std: ', np.std(distances))\n", | 287 | "print('std: ', np.std(distances))\n", |
267 | "print('max:', max(distances))\n", | 288 | "print('max:', max(distances))\n", |
268 | "print('min:', min(distances))" | 289 | "print('min:', min(distances))" |
@@ -272,20 +293,29 @@ | |||
272 | "cell_type": "markdown", | 293 | "cell_type": "markdown", |
273 | "metadata": {}, | 294 | "metadata": {}, |
274 | "source": [ | 295 | "source": [ |
275 | "### Find Representative for MPC" | 296 | "## Find Representative for MPC" |
276 | ] | 297 | ] |
277 | }, | 298 | }, |
278 | { | 299 | { |
279 | "cell_type": "markdown", | 300 | "cell_type": "markdown", |
280 | "metadata": {}, | 301 | "metadata": {}, |
281 | "source": [ | 302 | "source": [ |
303 | "### For Yakindumm\n", | ||
304 | "\n", | ||
282 | "#### For all human models\n", | 305 | "#### For all human models\n", |
283 | "* the rep found is ../input/humanOutput\\R_2015246_run_1.csv\n", | 306 | "* the rep found is ../input/humanOutput\\R_2015246_run_1.csv\n", |
284 | "* the average distance between it and others is 0.08556632702185384\n", | 307 | "* the average distance between it and others is 0.08556632702185384\n", |
285 | "\n", | 308 | "\n", |
286 | "#### For human models with $100 \\pm 10$ nodes\n", | 309 | "#### For human models with $100 \\pm 10$ nodes\n", |
287 | "* the rep found is ../input/human_output_100\\R_2016324_run_1.csv\n", | 310 | "* the rep found is ../input/human_output_100\\R_2016324_run_1.csv\n", |
288 | "* the average distance between it and others is $0.07028909225833631$" | 311 | "* the average distance between it and others is $0.07028909225833631$\n", |
312 | "\n", | ||
313 | "#### for human model with $100 \\pm 10$ nodes and new metric\n", | ||
314 | "* average distance: 0.054782550772603904\n", | ||
315 | "* median: 0.048330503678551184\n", | ||
316 | "* std: 0.028208257424907526\n", | ||
317 | "* max: 0.21181525241675614\n", | ||
318 | "* min: 0.0" | ||
289 | ] | 319 | ] |
290 | }, | 320 | }, |
291 | { | 321 | { |
@@ -297,8 +327,8 @@ | |||
297 | "name": "stdout", | 327 | "name": "stdout", |
298 | "output_type": "stream", | 328 | "output_type": "stream", |
299 | "text": [ | 329 | "text": [ |
300 | "../input/human_output_100\\R_2016324_run_1.csv\n", | 330 | "../input/human_models_75\\151.csv\n", |
301 | "../input/human_output_100\\R_2016324_run_1.csv\n" | 331 | "../input/human_models_75\\151.csv\n" |
302 | ] | 332 | ] |
303 | } | 333 | } |
304 | ], | 334 | ], |
@@ -311,16 +341,17 @@ | |||
311 | }, | 341 | }, |
312 | { | 342 | { |
313 | "cell_type": "code", | 343 | "cell_type": "code", |
314 | "execution_count": 16, | 344 | "execution_count": 10, |
315 | "metadata": {}, | 345 | "metadata": {}, |
316 | "outputs": [ | 346 | "outputs": [ |
317 | { | 347 | { |
318 | "name": "stdout", | 348 | "name": "stdout", |
319 | "output_type": "stream", | 349 | "output_type": "stream", |
320 | "text": [ | 350 | "text": [ |
321 | "average distance: 0.07028909225833632\n", | 351 | "average distance: 0.18751521685526348\n", |
322 | "std: 0.03728189051222417\n", | 352 | "median: 0.13400833829660508\n", |
323 | "max: 0.21961550993809065\n", | 353 | "std: 0.13829078925748192\n", |
354 | "max: 0.5745366639806608\n", | ||
324 | "min: 0.0\n" | 355 | "min: 0.0\n" |
325 | ] | 356 | ] |
326 | } | 357 | } |
@@ -330,6 +361,7 @@ | |||
330 | "for model in models:\n", | 361 | "for model in models:\n", |
331 | " distances.append(ks_value(mpc_rep_model.mpc, model.mpc))\n", | 362 | " distances.append(ks_value(mpc_rep_model.mpc, model.mpc))\n", |
332 | "print('average distance: ', np.mean(distances))\n", | 363 | "print('average distance: ', np.mean(distances))\n", |
364 | "print('median: ', np.median(distances))\n", | ||
333 | "print('std: ', np.std(distances))\n", | 365 | "print('std: ', np.std(distances))\n", |
334 | "print('max:', max(distances))\n", | 366 | "print('max:', max(distances))\n", |
335 | "print('min:', min(distances))" | 367 | "print('min:', min(distances))" |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/type_analysis/input/.gitignore b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/input/.gitignore new file mode 100644 index 00000000..b3934b01 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/input/.gitignore | |||
@@ -0,0 +1,3 @@ | |||
1 | # ignore everything in this folder | ||
2 | * | ||
3 | !.gitignore \ No newline at end of file | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb new file mode 100644 index 00000000..ba62c3b1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb | |||
@@ -0,0 +1,610 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "code", | ||
5 | "execution_count": 9, | ||
6 | "metadata": {}, | ||
7 | "outputs": [], | ||
8 | "source": [ | ||
9 | "import os, sys\n", | ||
10 | "import glob\n", | ||
11 | "lib_path = os.path.abspath(os.path.join('..', '..', 'utils'))\n", | ||
12 | "sys.path.append(lib_path)\n", | ||
13 | "import matplotlib.pyplot as plt\n", | ||
14 | "from GraphType import GraphStat\n", | ||
15 | "import readCSV as reader\n", | ||
16 | "import constants" | ||
17 | ] | ||
18 | }, | ||
19 | { | ||
20 | "cell_type": "code", | ||
21 | "execution_count": 10, | ||
22 | "metadata": {}, | ||
23 | "outputs": [], | ||
24 | "source": [ | ||
25 | "def getModels(folderName, numberOfModels):\n", | ||
26 | " filenames = reader.readmultiplefiles(folderName, numberOfModels, False)\n", | ||
27 | " graphStats = [GraphStat(filename) for filename in filenames]\n", | ||
28 | " return graphStats" | ||
29 | ] | ||
30 | }, | ||
31 | { | ||
32 | "cell_type": "code", | ||
33 | "execution_count": 11, | ||
34 | "metadata": {}, | ||
35 | "outputs": [], | ||
36 | "source": [ | ||
37 | "def drawTypeDistributions(folderName, numberOfModels):\n", | ||
38 | " graphStats = getModels(folderName, numberOfModels)\n", | ||
39 | " typeMap = {}\n", | ||
40 | " keys = set()\n", | ||
41 | " for g in graphStats:\n", | ||
42 | " keys = keys.union(set(g.nodeTypeStat.keys()))\n", | ||
43 | " for key in keys:\n", | ||
44 | " typeMap[key] = [float(g.nodeTypeStat.get(key,0)) for g in graphStats]\n", | ||
45 | " print(list(typeMap.keys()))\n", | ||
46 | " for i, key in enumerate(typeMap.keys()):\n", | ||
47 | " plt.figure(i)\n", | ||
48 | " plt.hist(typeMap[key], range = (0,1), bins=50)\n", | ||
49 | " plt.title(key)\n", | ||
50 | " plt.plot()" | ||
51 | ] | ||
52 | }, | ||
53 | { | ||
54 | "cell_type": "code", | ||
55 | "execution_count": 12, | ||
56 | "metadata": { | ||
57 | "scrolled": true | ||
58 | }, | ||
59 | "outputs": [ | ||
60 | { | ||
61 | "name": "stdout", | ||
62 | "output_type": "stream", | ||
63 | "text": [ | ||
64 | "['EAttribute', 'EGenericType', 'ETypeParameter', 'EPackage', 'EOperation', 'EStringToStringMapEntry', 'EEnum', 'EDataType', 'EClass', 'EReference', 'EObject', 'EEnumLiteral', 'EAnnotation', 'EParameter']\n" | ||
65 | ] | ||
66 | }, | ||
67 | { | ||
68 | "data": { | ||
69 | "image/png": "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\n", | ||
70 | "text/plain": [ | ||
71 | "<Figure size 432x288 with 1 Axes>" | ||
72 | ] | ||
73 | }, | ||
74 | "metadata": { | ||
75 | "needs_background": "light" | ||
76 | }, | ||
77 | "output_type": "display_data" | ||
78 | }, | ||
79 | { | ||
80 | "data": { | ||
81 | "image/png": "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\n", | ||
82 | "text/plain": [ | ||
83 | "<Figure size 432x288 with 1 Axes>" | ||
84 | ] | ||
85 | }, | ||
86 | "metadata": { | ||
87 | "needs_background": "light" | ||
88 | }, | ||
89 | "output_type": "display_data" | ||
90 | }, | ||
91 | { | ||
92 | "data": { | ||
93 | "image/png": "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\n", | ||
94 | "text/plain": [ | ||
95 | "<Figure size 432x288 with 1 Axes>" | ||
96 | ] | ||
97 | }, | ||
98 | "metadata": { | ||
99 | "needs_background": "light" | ||
100 | }, | ||
101 | "output_type": "display_data" | ||
102 | }, | ||
103 | { | ||
104 | "data": { | ||
105 | "image/png": "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\n", | ||
106 | "text/plain": [ | ||
107 | "<Figure size 432x288 with 1 Axes>" | ||
108 | ] | ||
109 | }, | ||
110 | "metadata": { | ||
111 | "needs_background": "light" | ||
112 | }, | ||
113 | "output_type": "display_data" | ||
114 | }, | ||
115 | { | ||
116 | "data": { | ||
117 | "image/png": "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\n", | ||
118 | "text/plain": [ | ||
119 | "<Figure size 432x288 with 1 Axes>" | ||
120 | ] | ||
121 | }, | ||
122 | "metadata": { | ||
123 | "needs_background": "light" | ||
124 | }, | ||
125 | "output_type": "display_data" | ||
126 | }, | ||
127 | { | ||
128 | "data": { | ||
129 | "image/png": "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\n", | ||
130 | "text/plain": [ | ||
131 | "<Figure size 432x288 with 1 Axes>" | ||
132 | ] | ||
133 | }, | ||
134 | "metadata": { | ||
135 | "needs_background": "light" | ||
136 | }, | ||
137 | "output_type": "display_data" | ||
138 | }, | ||
139 | { | ||
140 | "data": { | ||
141 | "image/png": "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\n", | ||
142 | "text/plain": [ | ||
143 | "<Figure size 432x288 with 1 Axes>" | ||
144 | ] | ||
145 | }, | ||
146 | "metadata": { | ||
147 | "needs_background": "light" | ||
148 | }, | ||
149 | "output_type": "display_data" | ||
150 | }, | ||
151 | { | ||
152 | "data": { | ||
153 | "image/png": "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\n", | ||
154 | "text/plain": [ | ||
155 | "<Figure size 432x288 with 1 Axes>" | ||
156 | ] | ||
157 | }, | ||
158 | "metadata": { | ||
159 | "needs_background": "light" | ||
160 | }, | ||
161 | "output_type": "display_data" | ||
162 | }, | ||
163 | { | ||
164 | "data": { | ||
165 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAQ70lEQVR4nO3de4yldX3H8fengEIVBWSkGy6uF6wSWhczrlgSL1wMQiuY2FZaFRPiikqj0TSlmrRg2wRNhcTUqEugbL2gFC9Q0VpEKNUIusgKiysFcavIhh1FblYpl2//OM+acZjZeXbmnDP7m32/kpN5zu95znm+vz0zn/3N7zy/OakqJEnt+a2lLkCStDAGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxw7bKSVJLnLHUd0kIZ4Gpaks1JfpnkwWm3f+r2rUhyQZItSR5I8v0kZyd50lLXLQ2DAa7l4I+q6snTbmck2Q/4JrAX8JKq2hs4DtgHePZSFisNiwGu5epdwAPA66tqM0BV/biq3lFVN808OMmJSW5Mcn+SHyc5a9q+PZN8IsnPktyb5NtJDuj2vSnJHd0I/4dJ/nw83ZNg96UuQBqRY4HPVdVjPY//BfBG4BbgcODKJBuq6gvAqcBTgYOBh4BVwC+7qZgPAS+qqluTrAD2G3I/pDk5Atdy8IVuZLzt9mbgacCWvk9QVddU1c1V9Vg3Qr8YeFm3++Hu+Z5TVY9W1Q1VdX+37zHg8CR7VdWWqrpliP2StssA13JwclXtM+12PvAzYEXfJ0jy4iRXJ5lKch9wOrB/t/vjwFeATye5K8kHkuxRVb8A/rQ7dkuSK5I8b7hdk+ZmgGu5+irwmiR9v8c/BVwOHFxVTwU+CgSgqh6uqrOr6jDgD4A/ZDDdQlV9paqOY/CfxfeB84fbDWluBriWq3OBpwDrkjwDIMmBSc5N8vuzHL83cE9V/SrJauDPtu1I8ookv5dkN+B+BlMqjyY5IMmru7nwh4AHgUdH3C/p1wxwLQf/NuM68M9X1T0MRssPA9cneQC4CrgPuH2W53gb8L7uuL8BLpm273eASxmE9ybgP4FPMPj5eTdwF3APgznzt42ig9Js4gc6SFKbHIFLUqMMcElqlAEuSY0ywCWpUWNdSr///vvXypUrx3lKSWreDTfc8NOqmpjZPtYAX7lyJevXrx/nKSWpeUn+Z7Z2p1AkqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRfir9GK0884pZ2zefc+KYK5G0HDgCl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUfMGeJI9k3wryXeT3JLk7K79oiQ/TLKhu60afbmSpG36LOR5CDi6qh5Msgfw9SRf7vb9ZVVdOrryJElzmTfAq6qAB7u7e3S3GmVRkqT59ZoDT7Jbkg3AVuDKqrq+2/UPSW5Kcl6SJ87x2DVJ1idZPzU1NaSyJUm9AryqHq2qVcBBwOokhwN/DTwPeBGwH/BXczx2bVVNVtXkxMTEkMqWJO3QVShVdS9wDXB8VW2pgYeAfwZWj6A+SdIc+lyFMpFkn257L+BY4PtJVnRtAU4GNo6yUEnSb+pzFcoKYF2S3RgE/iVV9cUkX0syAQTYAJw+wjolSTP0uQrlJuCIWdqPHklFkqReXIkpSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNarPp9LvmeRbSb6b5JYkZ3ftz0xyfZLbknwmyRNGX64kaZs+I/CHgKOr6gXAKuD4JEcC7wfOq6pDgZ8Dp42uTEnSTPMGeA082N3do7sVcDRwade+Djh5JBVKkmbVaw48yW5JNgBbgSuBHwD3VtUj3SF3AgfO8dg1SdYnWT81NTWMmiVJ9Azwqnq0qlYBBwGrgefPdtgcj11bVZNVNTkxMbHwSiVJv2GHrkKpqnuBa4AjgX2S7N7tOgi4a7ilSZK2p89VKBNJ9um29wKOBTYBVwOv7Q47FbhsVEVKkh5v9/kPYQWwLsluDAL/kqr6YpLvAZ9O8vfAjcAFI6xTkjTDvAFeVTcBR8zSfgeD+XBJ0hJwJaYkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktSoPn/MSiO28swrZm3ffM6JY65EUkscgUtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1Kg+n0p/cJKrk2xKckuSd3TtZyX5SZIN3e2E0ZcrSdqmz0KeR4B3V9V3kuwN3JDkym7feVX1j6MrT5I0lz6fSr8F2NJtP5BkE3DgqAuTJG3fDi2lT7ISOAK4HjgKOCPJG4H1DEbpP5/lMWuANQCHHHLIIssdLZe0S2pJ7zcxkzwZ+Czwzqq6H/gI8GxgFYMR+gdne1xVra2qyaqanJiYGELJkiToGeBJ9mAQ3p+sqs8BVNXdVfVoVT0GnA+sHl2ZkqSZ+lyFEuACYFNVnTutfcW0w14DbBx+eZKkufSZAz8KeANwc5INXdt7gFOSrAIK2Ay8ZSQVSpJm1ecqlK8DmWXXl4ZfjiSpL1diSlKjDHBJapQBLkmNMsAlqVEGuCQ1atl+Kr3L4iUtd47AJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDVq2S6lHweX60taSo7AJalRBrgkNarPp9IfnOTqJJuS3JLkHV37fkmuTHJb93Xf0ZcrSdqmzwj8EeDdVfV84Ejg7UkOA84ErqqqQ4GruvuSpDGZN8CraktVfafbfgDYBBwInASs6w5bB5w8qiIlSY+3Q3PgSVYCRwDXAwdU1RYYhDzw9DkesybJ+iTrp6amFletJOnXegd4kicDnwXeWVX3931cVa2tqsmqmpyYmFhIjZKkWfQK8CR7MAjvT1bV57rmu5Os6PavALaOpkRJ0mz6XIUS4AJgU1WdO23X5cCp3fapwGXDL0+SNJc+KzGPAt4A3JxkQ9f2HuAc4JIkpwE/Av54NCVKkmYzb4BX1deBzLH7mOGWszzMtcRekobJlZiS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSo/p8Kv2FSbYm2Tit7awkP0myobudMNoyJUkz9RmBXwQcP0v7eVW1qrt9abhlSZLmM2+AV9W1wD1jqEWStAMWMwd+RpKbuimWfec6KMmaJOuTrJ+amlrE6SRJ0y00wD8CPBtYBWwBPjjXgVW1tqomq2pyYmJigaeTJM20oACvqrur6tGqegw4H1g93LIkSfNZUIAnWTHt7muAjXMdK0kajd3nOyDJxcDLgf2T3An8LfDyJKuAAjYDbxlhjZKkWcwb4FV1yizNF4ygFs2w8swrZm3ffM6JY65E0s7IlZiS1CgDXJIaZYBLUqMMcElqlAEuSY2a9yoUzX01iCQtJUfgktQoA1ySGmWAS1KjDHBJapQBLkmN2uWuQvGKEknLhSNwSWqUAS5JjTLAJalRBrgkNWqXexNzOfCDHiSBI3BJapYBLkmNmjfAk1yYZGuSjdPa9ktyZZLbuq/7jrZMSdJMfUbgFwHHz2g7E7iqqg4FruruS5LGaN4Ar6prgXtmNJ8ErOu21wEnD7kuSdI8FjoHfkBVbQHovj59rgOTrEmyPsn6qampBZ5OkjTTyN/ErKq1VTVZVZMTExOjPp0k7TIWGuB3J1kB0H3dOrySJEl9LDTALwdO7bZPBS4bTjmSpL76XEZ4MfBN4HeT3JnkNOAc4LgktwHHdfclSWM071L6qjpljl3HDLkWSdIOcCWmJDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalR836gg5avlWdeMWv75nNOHHMlkhbCEbgkNcoAl6RGLWoKJclm4AHgUeCRqpocRlGSpPkNYw78FVX10yE8jyRpBziFIkmNWuwIvID/SFLAx6pq7cwDkqwB1gAccsghizzd4811JcWuyH8Ladey2BH4UVX1QuBVwNuTvHTmAVW1tqomq2pyYmJikaeTJG2zqACvqru6r1uBzwOrh1GUJGl+Cw7wJE9Ksve2beCVwMZhFSZJ2r7FzIEfAHw+ybbn+VRV/ftQqpIkzWvBAV5VdwAvGGItkqQd4GWEktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSo4bxkWrSnOb6kInN55w45kqk5ccRuCQ1ygCXpEYZ4JLUKANckhrlm5h6nO19uv1cbz5u7zHDOH5Y5/XNUy0njsAlqVEGuCQ1alEBnuT4JLcmuT3JmcMqSpI0vwUHeJLdgA8DrwIOA05JctiwCpMkbd9iRuCrgdur6o6q+j/g08BJwylLkjSfxVyFciDw42n37wRePPOgJGuANd3dB5PcusDz7Q/8dIGPbdVO1+e8f+SnmLXPwzrvGOpfiJ3udR4D+7xjnjFb42ICPLO01eMaqtYCaxdxnsHJkvVVNbnY52mJfd412Oddwyj6vJgplDuBg6fdPwi4a3HlSJL6WkyAfxs4NMkzkzwBeB1w+XDKkiTNZ8FTKFX1SJIzgK8AuwEXVtUtQ6vs8RY9DdMg+7xrsM+7hqH3OVWPm7aWJDXAlZiS1CgDXJIatdMF+HzL85M8Mclnuv3XJ1k5/iqHq0ef35Xke0luSnJVklmvCW1J3z/DkOS1SSpJ05ec9elvkj/pXudbknxq3DUOW4/v60OSXJ3kxu57+4SlqHOYklyYZGuSjXPsT5IPdf8mNyV54aJOWFU7zY3Bm6E/AJ4FPAH4LnDYjGPeBny0234d8JmlrnsMfX4F8Nvd9lt3hT53x+0NXAtcB0wudd0jfo0PBW4E9u3uP32p6x5Dn9cCb+22DwM2L3XdQ+j3S4EXAhvn2H8C8GUG62iOBK5fzPl2thF4n+X5JwHruu1LgWOSzLaoqBXz9rmqrq6q/+3uXsfgmvuW9f0zDH8HfAD41TiLG4E+/X0z8OGq+jlAVW0dc43D1qfPBTyl234qy2AdSVVdC9yznUNOAv6lBq4D9kmyYqHn29kCfLbl+QfOdUxVPQLcBzxtLNWNRp8+T3cag//BWzZvn5McARxcVV8cZ2Ej0uc1fi7w3CTfSHJdkuPHVt1o9OnzWcDrk9wJfAn4i/GUtqR29Od9u3a2T+Tpszy/1xL+hvTuT5LXA5PAy0Za0ehtt89Jfgs4D3jTuAoasT6v8e4MplFezuA3rP9KcnhV3Tvi2kalT59PAS6qqg8meQnw8a7Pj42+vCUz1Pza2UbgfZbn//qYJLsz+NVre7+y7Ox6/UmCJMcC7wVeXVUPjam2UZmvz3sDhwPXJNnMYK7w8obfyOz7fX1ZVT1cVT8EbmUQ6K3q0+fTgEsAquqbwJ4M/uDTcjbUP0GyswV4n+X5lwOndtuvBb5W3bsDjZq3z910wscYhHfrc6MwT5+r6r6q2r+qVlbVSgbz/q+uqvVLU+6i9fm+/gKDN6tJsj+DKZU7xlrlcPXp84+AYwCSPJ9BgE+Ntcrxuxx4Y3c1ypHAfVW1ZcHPttTv2s7xLu1/M3gH+71d2/sY/ADD4EX+V+B24FvAs5a65jH0+avA3cCG7nb5Utc86j7POPYaGr4KpedrHOBc4HvAzcDrlrrmMfT5MOAbDK5Q2QC8cqlrHkKfLwa2AA8zGG2fBpwOnD7tdf5w929y82K/r11KL0mN2tmmUCRJPRngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVH/DzRgzDxR2nPqAAAAAElFTkSuQmCC\n", | ||
166 | "text/plain": [ | ||
167 | "<Figure size 432x288 with 1 Axes>" | ||
168 | ] | ||
169 | }, | ||
170 | "metadata": { | ||
171 | "needs_background": "light" | ||
172 | }, | ||
173 | "output_type": "display_data" | ||
174 | }, | ||
175 | { | ||
176 | "data": { | ||
177 | "image/png": "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\n", | ||
178 | "text/plain": [ | ||
179 | "<Figure size 432x288 with 1 Axes>" | ||
180 | ] | ||
181 | }, | ||
182 | "metadata": { | ||
183 | "needs_background": "light" | ||
184 | }, | ||
185 | "output_type": "display_data" | ||
186 | }, | ||
187 | { | ||
188 | "data": { | ||
189 | "image/png": "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\n", | ||
190 | "text/plain": [ | ||
191 | "<Figure size 432x288 with 1 Axes>" | ||
192 | ] | ||
193 | }, | ||
194 | "metadata": { | ||
195 | "needs_background": "light" | ||
196 | }, | ||
197 | "output_type": "display_data" | ||
198 | }, | ||
199 | { | ||
200 | "data": { | ||
201 | "image/png": "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\n", | ||
202 | "text/plain": [ | ||
203 | "<Figure size 432x288 with 1 Axes>" | ||
204 | ] | ||
205 | }, | ||
206 | "metadata": { | ||
207 | "needs_background": "light" | ||
208 | }, | ||
209 | "output_type": "display_data" | ||
210 | }, | ||
211 | { | ||
212 | "data": { | ||
213 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAUIElEQVR4nO3df5TldX3f8ecrrEDRmEV28ODuxsGcxUpoopwJxaZJUZIGUFl6gjlwTNhYjnswaNPaVqGchKRpWrRNTDwh2lUokCKCxMpqTBOCEKJH1g7KbySsiLDyY4ciNMYUJLz7x/1ueh3v7NyZe2dm57PPxzn3zP1+vp/v/b4/e2df9zuf+73fm6pCktSW71vpAiRJ42e4S1KDDHdJapDhLkkNMtwlqUGGuyQ1yHCXlkmSDyX5lZWuQ/sHw137nCQPJvmbJN/qu/1e3/oTklSSdy9jTZcl+Q8L6P+LST7X31ZV51TVb4y/Oul7Ge7aV72pql7Ud3tH37otwJPdT0kDGO5aVZIcApwOnAtsSjLVt26yO6LfkuShJE8kuaBv/a8luSbJFUn+Ksnds7Z/VZKbkjzVrTu1a98KvAV4d/dXxKe69vOSfLV7rHuS/LM9jwN8CHht1/+prv27jv6TvC3JziRPJtme5GV96yrJOUnuT/LNJBcnyZL8o6pJhrtWm58FvgV8HPgT4KwBff4x8ErgROBXu7Dd41TgY8BaYDvwewBJXgB8CvhT4HDgncCVSV5ZVduAK4H3dX9FvKl7rK8CPwH8APDrwH9PckRV3QucA3yh6792doFJXg/8J+DngCOAr3d19Xsj8GPAj3b9fmaofyEJw137rk92R9B7bm/r2rcAV1fV3wIfBc7sgrnfr1fV31TV7cDt9MJxj89V1We67f+gb93xwIuAi6rq2ar6LPBp4My5Cqyqj1fVI1X1fFVdDdwPHDfk+N4CXFpVX6qqZ4Dz6R3pT/b1uaiqnqqqh4AbgVcP+diS4a591mlVtbbv9uEkG4HX0TuKBrgOOBh4w6xtH+u7/216oT3XuoOTrAFeBjxcVc/3rf86sH6uApOcleS2PS9AwDHAuiHH97Lu8QGoqm8B/3vW/vY2DmmvDHetJr9A73f2U0keAx6gF+6DpmYW6hFgY5L+/xM/CHyju/9dl09N8nLgw8A7gMO6qZe7gAzqP8f+Xt73eC8EDuvbnzQSw12ryVn05rZf3Xf7WeANSQ4b8bF3AH9N703TFyQ5AXgT/38e/HHgFX39X0gvwGcAkryV3pE7ff03JDlwjv19FHhrklcnOQj4j8COqnpwxHFIgOGufdenZp3nfiMwCVxcVY/13bYDO9nL3PgwqupZem+2ngw8Afw+cFZVfaXrcglwdDcF88mqugf4LeAL9IL8HwCf73vIzwJ3A48leWLA/m4AfgX4Q+BR4IeAM0YZg9QvflmHJLXHI3dJapDhLkkNMtwlqUGGuyQ1aM1KFwCwbt26mpycXOkyJGlVufXWW5+oqolB6/aJcJ+cnGR6enqly5CkVSXJ1+daN++0TJJLk+xOctes9ncmua+7et77+trP7650d18SL3QkSStgmCP3y+hdOe+KPQ1JXgdsBn6kqp5JcnjXfjS9D2L8ML1rZ/xZkqO6izRJkpbJvEfuVXUzvS9G6Pd2elese6brs7tr3wx8rKqeqaqv0fvk4LBXyZMkjcliz5Y5CviJJDuS/HmSH+va1wMP9/XbxRxX1UuyNcl0kumZmZlFliFJGmSx4b4GOJTeNbD/LXBN9y0xg74pZuD1DapqW1VNVdXUxMTAN3slSYu02HDfBXyier4IPE/vOta7gI19/TbQu7SpJGkZLTbcPwm8HiDJUcCB9K6ktx04I8lBSY4ENgFfHEehkqThzXu2TJKrgBOAdUl2ARcClwKXdqdHPgtsqd7lJe9Ocg1wD/AccK5nykjS8tsnLvk7NTVVfohJkhYmya1VNTVo3T7xCdVRTJ73R3Oue/Ci2V+tKUn7By8cJkkNMtwlqUGGuyQ1yHCXpAYZ7pLUIMNdkhpkuEtSgwx3SWqQ4S5JDTLcJalBhrskNchwl6QGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ2aN9yTXJpkd/d9qbPX/ZsklWRdt5wkH0iyM8kdSY5diqIlSXs3zJH7ZcBJsxuTbAR+Gnior/lkYFN32wp8cPQSJUkLNW+4V9XNwJMDVr0feDfQ/w3bm4ErqucWYG2SI8ZSqSRpaIuac09yKvCNqrp91qr1wMN9y7u6tkGPsTXJdJLpmZmZxZQhSZrDgsM9ySHABcCvDlo9oK0GtFFV26pqqqqmJiYmFlqGJGkv1iximx8CjgRuTwKwAfhSkuPoHalv7Ou7AXhk1CIlSQuz4CP3qrqzqg6vqsmqmqQX6MdW1WPAduCs7qyZ44Gnq+rR8ZYsSZrPMKdCXgV8AXhlkl1Jzt5L988ADwA7gQ8DvzSWKiVJCzLvtExVnTnP+sm++wWcO3pZkqRR+AlVSWqQ4S5JDTLcJalBhrskNchwl6QGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ0y3CWpQYa7JDXIcJekBhnuktQgw12SGmS4S1KDDHdJatAwX7N3aZLdSe7qa/vPSb6S5I4k/yPJ2r515yfZmeS+JD+zVIVLkuY2zJH7ZcBJs9quB46pqh8B/hI4HyDJ0cAZwA932/x+kgPGVq0kaSjzhntV3Qw8OavtT6vquW7xFmBDd38z8LGqeqaqvkbvi7KPG2O9kqQhjGPO/Z8Df9zdXw883LduV9cmSVpGI4V7kguA54Ar9zQN6FZzbLs1yXSS6ZmZmVHKkCTNsuhwT7IFeCPwlqraE+C7gI193TYAjwzavqq2VdVUVU1NTEwstgxJ0gCLCvckJwHvAU6tqm/3rdoOnJHkoCRHApuAL45epiRpIdbM1yHJVcAJwLoku4AL6Z0dcxBwfRKAW6rqnKq6O8k1wD30pmvOraq/XariJUmDzRvuVXXmgOZL9tL/N4HfHKUoSdJo/ISqJDXIcJekBhnuktQgw12SGmS4S1KDDHdJapDhLkkNMtwlqUGGuyQ1yHCXpAYZ7pLUIMNdkhpkuEtSgwx3SWqQ4S5JDTLcJalBhrskNchwl6QGzRvuSS5NsjvJXX1tL0lyfZL7u5+Hdu1J8oEkO5PckeTYpSxekjTYMEfulwEnzWo7D7ihqjYBN3TLACcDm7rbVuCD4ylTkrQQ84Z7Vd0MPDmreTNweXf/cuC0vvYrqucWYG2SI8ZVrCRpOIudc39pVT0K0P08vGtfDzzc129X1/Y9kmxNMp1kemZmZpFlSJIGGfcbqhnQVoM6VtW2qpqqqqmJiYkxlyFJ+7fFhvvje6Zbup+7u/ZdwMa+fhuARxZfniRpMRYb7tuBLd39LcB1fe1ndWfNHA88vWf6RpK0fNbM1yHJVcAJwLoku4ALgYuAa5KcDTwEvLnr/hngFGAn8G3grUtQsyRpHvOGe1WdOceqEwf0LeDcUYuSJI3GT6hKUoMMd0lqkOEuSQ0y3CWpQYa7JDXIcJekBhnuktQgw12SGmS4S1KDDHdJapDhLkkNMtwlqUGGuyQ1yHCXpAYZ7pLUIMNdkhpkuEtSg0YK9yT/KsndSe5KclWSg5McmWRHkvuTXJ3kwHEVK0kazqLDPcl64F8AU1V1DHAAcAbwXuD9VbUJ+CZw9jgKlSQNb9RpmTXA30uyBjgEeBR4PXBtt/5y4LQR9yFJWqBFh3tVfQP4L8BD9EL9aeBW4Kmqeq7rtgtYP2qRkqSFGWVa5lBgM3Ak8DLghcDJA7rWHNtvTTKdZHpmZmaxZUiSBhhlWuangK9V1UxVfQf4BPCPgLXdNA3ABuCRQRtX1baqmqqqqYmJiRHKkCTNNkq4PwQcn+SQJAFOBO4BbgRO7/psAa4brURJ0kKNMue+g94bp18C7uweaxvwHuBdSXYChwGXjKFOSdICrJm/y9yq6kLgwlnNDwDHjfK4kqTR+AlVSWqQ4S5JDTLcJalBhrskNchwl6QGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ0y3CWpQYa7JDXIcJekBhnuktQgw12SGmS4S1KDDHdJapDhLkkNGinck6xNcm2SryS5N8lrk7wkyfVJ7u9+HjquYiVJwxn1yP13gf9ZVX8f+FHgXuA84Iaq2gTc0C1LkpbRosM9yYuBnwQuAaiqZ6vqKWAzcHnX7XLgtFGLlCQtzChH7q8AZoD/luTLST6S5IXAS6vqUYDu5+GDNk6yNcl0kumZmZkRypAkzTZKuK8BjgU+WFWvAf6aBUzBVNW2qpqqqqmJiYkRypAkzTZKuO8CdlXVjm75Wnph/3iSIwC6n7tHK1GStFCLDveqegx4OMkru6YTgXuA7cCWrm0LcN1IFUqSFmzNiNu/E7gyyYHAA8Bb6b1gXJPkbOAh4M0j7kOStEAjhXtV3QZMDVh14iiPK0kajZ9QlaQGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ0y3CWpQYa7JDXIcJekBhnuktQgw12SGmS4S1KDDHdJapDhLkkNMtwlqUGGuyQ1yHCXpAYZ7pLUoJHDPckBSb6c5NPd8pFJdiS5P8nV3ferSpKW0TiO3H8ZuLdv+b3A+6tqE/BN4Owx7EOStAAjhXuSDcAbgI90ywFeD1zbdbkcOG2UfUiSFm7UI/ffAd4NPN8tHwY8VVXPdcu7gPWDNkyyNcl0kumZmZkRy5Ak9Vt0uCd5I7C7qm7tbx7QtQZtX1XbqmqqqqYmJiYWW4YkaYA1I2z748CpSU4BDgZeTO9Ifm2SNd3R+wbgkdHLlCQtxKKP3Kvq/KraUFWTwBnAZ6vqLcCNwOldty3AdSNXKUlakKU4z/09wLuS7KQ3B3/JEuxDkrQXo0zL/J2qugm4qbv/AHDcOB5XkrQ4fkJVkhpkuEtSgwx3SWqQ4S5JDTLcJalBhrskNchwl6QGGe6S1CDDXZIaZLhLUoMMd0lqkOEuSQ0y3CWpQYa7JDXIcJekBhnuktQgw12SGrTocE+yMcmNSe5NcneSX+7aX5Lk+iT3dz8PHV+5kqRhjHLk/hzwr6vqVcDxwLlJjgbOA26oqk3ADd2yJGkZLTrcq+rRqvpSd/+vgHuB9cBm4PKu2+XAaaMWKUlamLHMuSeZBF4D7ABeWlWPQu8FADh8jm22JplOMj0zMzOOMiRJnZHDPcmLgD8E/mVV/Z9ht6uqbVU1VVVTExMTo5YhSeozUrgneQG9YL+yqj7RNT+e5Ihu/RHA7tFKlCQt1ChnywS4BLi3qn67b9V2YEt3fwtw3eLLkyQtxpoRtv1x4BeAO5Pc1rX9O+Ai4JokZwMPAW8erURJ0kItOtyr6nNA5lh94mIfV5I0Oj+hKkkNMtwlqUGGuyQ1yHCXpAYZ7pLUoFFOhdQKmTzvjwa2P3jRG5a5Ekn7KsO9j6EpqRVOy0hSgwx3SWqQ4S5JDWp6zt05dEn7K4/cJalBTR+5j4t/AUhabfbLcJ8rrJf68X0xkLRc9stwH5elfpGQpMUy3PcBvkhIGjffUJWkBnnkvoyc65e0XJYs3JOcBPwucADwkaq6aKn2pb0b54uKLxTS6rAk0zJJDgAuBk4GjgbOTHL0UuxLkvS9lmrO/ThgZ1U9UFXPAh8DNi/RviRJsyzVtMx64OG+5V3AP+zvkGQrsLVb/FaS+xa5r3XAE4vcdrVasTHnvSuxV8DneX/hmBfm5XOtWKpwz4C2+q6Fqm3AtpF3lExX1dSoj7OaOOb9g2PePyzVmJdqWmYXsLFveQPwyBLtS5I0y1KF+/8CNiU5MsmBwBnA9iXalyRpliWZlqmq55K8A/gTeqdCXlpVdy/FvhjD1M4q5Jj3D455/7AkY05Vzd9LkrSqePkBSWqQ4S5JDVo14Z7kpCT3JdmZ5LwB6w9KcnW3fkeSyeWvcryGGPO7ktyT5I4kNySZ85zX1WK+Mff1Oz1JJVn1p80NM+YkP9c913cn+ehy1zhuQ/xu/2CSG5N8ufv9PmUl6hyXJJcm2Z3krjnWJ8kHun+PO5IcO/JOq2qfv9F7U/arwCuAA4HbgaNn9fkl4EPd/TOAq1e67mUY8+uAQ7r7b98fxtz1+37gZuAWYGql616G53kT8GXg0G758JWuexnGvA14e3f/aODBla57xDH/JHAscNcc608B/pjeZ4SOB3aMus/VcuQ+zOUMNgOXd/evBU5MMujDVKvFvGOuqhur6tvd4i30Pk+wmg172YrfAN4H/N/lLG6JDDPmtwEXV9U3Aapq9zLXOG7DjLmAF3f3f4BV/jmZqroZeHIvXTYDV1TPLcDaJEeMss/VEu6DLmewfq4+VfUc8DRw2LJUtzSGGXO/s+m98q9m8445yWuAjVX16eUsbAkN8zwfBRyV5PNJbumuuLqaDTPmXwN+Psku4DPAO5entBWz0P/v81ot13Of93IGQ/ZZTYYeT5KfB6aAf7KkFS29vY45yfcB7wd+cbkKWgbDPM9r6E3NnEDvr7O/SHJMVT21xLUtlWHGfCZwWVX9VpLXAn/Qjfn5pS9vRYw9v1bLkfswlzP4uz5J1tD7U25vfwbt64a6hEOSnwIuAE6tqmeWqbalMt+Yvx84BrgpyYP05ia3r/I3VYf93b6uqr5TVV8D7qMX9qvVMGM+G7gGoKq+ABxM7wJbrRr7JVtWS7gPczmD7cCW7v7pwGere6dilZp3zN0UxX+lF+yrfR4W5hlzVT1dVeuqarKqJum9z3BqVU2vTLljMczv9ifpvXlOknX0pmkeWNYqx2uYMT8EnAiQ5FX0wn1mWatcXtuBs7qzZo4Hnq6qR0d6xJV+F3kB7zafAvwlvXfZL+ja/j29/9zQe/I/DuwEvgi8YqVrXoYx/xnwOHBbd9u+0jUv9Zhn9b2JVX62zJDPc4DfBu4B7gTOWOmal2HMRwOfp3cmzW3AP13pmkcc71XAo8B36B2lnw2cA5zT9xxf3P173DmO32svPyBJDVot0zKSpAUw3CWpQYa7JDXIcJekBhnuktQgw12SGmS4S1KD/h933v3pa7EOOgAAAABJRU5ErkJggg==\n", | ||
214 | "text/plain": [ | ||
215 | "<Figure size 432x288 with 1 Axes>" | ||
216 | ] | ||
217 | }, | ||
218 | "metadata": { | ||
219 | "needs_background": "light" | ||
220 | }, | ||
221 | "output_type": "display_data" | ||
222 | }, | ||
223 | { | ||
224 | "data": { | ||
225 | "image/png": "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\n", | ||
226 | "text/plain": [ | ||
227 | "<Figure size 432x288 with 1 Axes>" | ||
228 | ] | ||
229 | }, | ||
230 | "metadata": { | ||
231 | "needs_background": "light" | ||
232 | }, | ||
233 | "output_type": "display_data" | ||
234 | } | ||
235 | ], | ||
236 | "source": [ | ||
237 | "drawTypeDistributions('../input/human_models_75/', 1500)" | ||
238 | ] | ||
239 | }, | ||
240 | { | ||
241 | "cell_type": "code", | ||
242 | "execution_count": 13, | ||
243 | "metadata": { | ||
244 | "scrolled": true | ||
245 | }, | ||
246 | "outputs": [ | ||
247 | { | ||
248 | "name": "stdout", | ||
249 | "output_type": "stream", | ||
250 | "text": [ | ||
251 | "['EAttribute', 'EGenericType', 'ETypeParameter', 'EPackage', 'EOperation', 'EStringToStringMapEntry', 'EEnum', 'EDataType', 'EClass', 'EReference', 'EObject', 'EEnumLiteral', 'EAnnotation', 'EParameter']\n" | ||
252 | ] | ||
253 | }, | ||
254 | { | ||
255 | "data": { | ||
256 | "image/png": "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\n", | ||
257 | "text/plain": [ | ||
258 | "<Figure size 432x288 with 1 Axes>" | ||
259 | ] | ||
260 | }, | ||
261 | "metadata": { | ||
262 | "needs_background": "light" | ||
263 | }, | ||
264 | "output_type": "display_data" | ||
265 | }, | ||
266 | { | ||
267 | "data": { | ||
268 | "image/png": "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\n", | ||
269 | "text/plain": [ | ||
270 | "<Figure size 432x288 with 1 Axes>" | ||
271 | ] | ||
272 | }, | ||
273 | "metadata": { | ||
274 | "needs_background": "light" | ||
275 | }, | ||
276 | "output_type": "display_data" | ||
277 | }, | ||
278 | { | ||
279 | "data": { | ||
280 | "image/png": "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\n", | ||
281 | "text/plain": [ | ||
282 | "<Figure size 432x288 with 1 Axes>" | ||
283 | ] | ||
284 | }, | ||
285 | "metadata": { | ||
286 | "needs_background": "light" | ||
287 | }, | ||
288 | "output_type": "display_data" | ||
289 | }, | ||
290 | { | ||
291 | "data": { | ||
292 | "image/png": "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\n", | ||
293 | "text/plain": [ | ||
294 | "<Figure size 432x288 with 1 Axes>" | ||
295 | ] | ||
296 | }, | ||
297 | "metadata": { | ||
298 | "needs_background": "light" | ||
299 | }, | ||
300 | "output_type": "display_data" | ||
301 | }, | ||
302 | { | ||
303 | "data": { | ||
304 | "image/png": "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\n", | ||
305 | "text/plain": [ | ||
306 | "<Figure size 432x288 with 1 Axes>" | ||
307 | ] | ||
308 | }, | ||
309 | "metadata": { | ||
310 | "needs_background": "light" | ||
311 | }, | ||
312 | "output_type": "display_data" | ||
313 | }, | ||
314 | { | ||
315 | "data": { | ||
316 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAS40lEQVR4nO3deZRkZX3G8e8jAwKKYpxBBBlHIi6ISTQd45JjFDSiRiCRJBARNBxHNBKNMR6MEreoaNyP5OgEUTQGUBQd3EXFLYIOQmRzITDgsA6iuIAC8ssf97aWPT3dNV3V3fMy3885dabqrr+3quept957b1WqCklSe+6w2AVIkubGAJekRhngktQoA1ySGmWAS1KjDHBJapQBrjlLsjzJz5Jstdi1jCrJe5O8eLHrkDaFAX47l2Rtkpv6oJ28vSPJNknelGRdP+3SJG+Zst7jZtp2VV1eVXeuql+NWOM7B2q7OcktA48/NcT6j0lyZpIbkvwwyVeS/H4/74gkp8+2jap6RlW9YZR29PvbNkkl+UGSOwxMv2OSHyX5xaj76Ld3UpJfTnldvzHkusckOW4cdWhxGeBbhqf0QTt5ex7wEmACeBiwA/BY4JxhN5hkybiKq6ojJmsDXgucPFDrE2ep4+7Ax4B/B+4G7NZv45Zh9z9PnyBuBPYZeLw/cO2Y9/HqKa/rw8ax0SR3GHzz0ebLF2nL9UfAqVV1ZXXWVtX7AJK8H1gOnNb37F6cZEXfszw8yeXAFwamLenXOyPJq5N8LclPk3w2ydLJHSY5NMllfS/56GF6+QPrPjXJhUl+nOT0JHv0sx4I3FRVH66q26rqxqr6VFVdmOQhwFuBx/TtuLrf1klJ3t7X93PgEf20l/Xz901ycZJ/SbI+yRVJnjZQy05JPpXkJ33P/5hpevnvBw4deHwo8L4pbXp2ku/0z9XFSf5uYN5kDa9Mcn2SS5L81ZDP1QOS3Jrkmf0nrPVJ/rmfdwDwQuCwwV57345XJTmL7s3naUm+NmW7L01y0jA1aGEY4FuuM4EXJnlukgcnyeSMqno6cDm/6bkPDi38KV1oPmEj2/1b4JnATsA2wIsAkuwJ/AfwNOCewF2BXYcpNMlewHuB5/bb/RKwun/juAjYLsm7kzwhyY4D7TgHeAFwRt+OnQc2ewhwNN2nj29Os9t7AwF2AZ4HvDPJnft5q4D1wD2AlcBh06x/CvCEJHdOshPwh8AnpyxzFfBE4C7AEcCxSR40MH8F3XO4c7+fE5LcZ9onaUNb0X3Cui/wJOA1SXavqo8CbwZOmKbXfgjdG80OwGrgwUl2H5j/NLo3Jm0mDPAtw0f7nuvk7VnA64DX0/2nXANckWS6IJrqFVX186q6aSPz31NV3+vnfxD4g376gcBpVfXVqroZ+Fdg2C/iOZju08IZ/bqvBZYCE1X1Q+BRwNbAe4D1ST4y2PPfiFOq6qy+1/7LaebfCLyuqm6pqlP7Wu+bZFtgP+Doqrqpqr4NfGCa9X8GfBZ4Kt2b2ilMGdapqtVVdWn/Ceh0ujemPxlY5FbglVV1cz//dLrncdJLp7yu75pSw8ur6hdV9U3gO8DvzfKcHFdV3+3bfAPwYbq/D5JM0D3nn5llG1pABviW4YCq2nHg9p9V9auqOraqHgXsCLwGOD7JA2fZ1g9mmX/1wP0bgcle6y6D61bVjcAPh6x/F+CygXV/BVxB34OvqvOr6tCq2oXuDeN36cbEZzJbO9ZX1W0DjyfbsjNdz3zdENt6H12PdoPhE4Ak+yX5Rj9E8mNgb7qQHKxh8KDnZXTPxaTXTHldnz0w71dVdd009c9kajtOoA9wut75iVV16yzb0AIywEXfkzwW+BGw5+TkjS0+x91cBdxr8kGS7YC7D7nulXRDGpPrbkUX3ldsUFzVBXQf8/eapd65tuPqft3B4Z/dNrLs6cD9gO36XvCvJbkT8CHg1cBOVbUj8AW6N4dJS/se/6TldM/FqIZ9Tr4EbJvk4cBBOHyy2THAt1BJXpDu9Lvtkizph0924DdnolwD7L7xLWyyU4CnJHlkkm2AV/LbYTWTk4G/SPLoJFsDR9H13tf04/cvSLJr364VwN/QjfFD147d+vVG1veITwNeme6Uwb3ohkimW/Y2uvHnv5xm9nZ0wz7XArcl2Q94zJRltgaOTnfK597A4+mGNUZ1DXCfweMe06nuu6bfTzfmf31VrRnDvjVGBviWYfJsksnbqcBNwJvoepTXAX8PPLWqLunXeR3wsn5s9UWjFtD3jI8ETqLrjf+ULrymG3+euu63gcOBd9EdPNwH2L//OP8TunHjb/ZnlHwV+AZdyAN8GlgLXJtkHePxbLqhjPXAccCJG2tHVZ1XVRdNM/06ugO8p9G9GR3Ahgc519KNg18NHA88c+D1gS7cB1/XYdt3ErA9cH2S/5ll2ROAB2Pve7MUf9BBi6E/o+PHwB5Vdeli1zOKJG8Dtp0yBj3qNvcF3lFV9x3XNudYxw50PfYHVNXli1mLNmQPXAsmyVOSbN+P/74ROI+ul9mUJHsleVA6j6Q7SHnqYtc1T46kOw3T8N4Mje1qOmkI+9N9FA/dqYsHVZsfAe9K146d6YY3/q2qPr24JY1fugufbqQ7bVKbIYdQJKlRDqFIUqMWdAhl6dKltWLFioXcpSQ17+yzz76uqpZNnb6gAb5ixQrWrPFUUknaFEkum266QyiS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUbMGeJLjk1yb5PyBab+T5HNJvt//e7f5LVOSNNUwPfD3AvtOmXYU8Pmq2gP4PL/56k5J0gKZNcCr6svA9VMm70/3PcH0/x4w5rokSbOY65WY96iqqwCq6qr+V7enlWQl3S9qs3z58jnubnxWHPWJaaevPebJC1yJJI1m3g9iVtWqqpqoqollyza4lF+SNEdzDfBrktwToP/32vGVJEkaxlwDfDVwWH//MOBj4ylHkjSsYU4jPBH4OnD/JOuSHA4cAzw+yffpfin7mPktU5I01awHMavq4I3M2mfMtUiSNoFXYkpSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRs31NzG3GBv7DU3wdzQlLS574JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktSokQI8yT8muSDJ+UlOTLLtuAqTJM1szgGeZFfgH4CJqtoL2Ao4aFyFSZJmNuoQyhJguyRLgO2BK0cvSZI0jDn/qHFVXZHkjcDlwE3AZ6vqs1OXS7ISWAmwfPnyue5uk830Y8SSdHswyhDK3YD9gfsAuwB3SnLI1OWqalVVTVTVxLJly+ZeqSTpt4wyhPI44NKqWl9VtwAfAR45nrIkSbMZJcAvBx6eZPskAfYBLhpPWZKk2cw5wKvqLOAU4FvAef22Vo2pLknSLOZ8EBOgql4OvHxMtUiSNoFXYkpSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktSokb4PfEu3sR9OXnvMkxe4EklbInvgktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGjRTgSXZMckqS7yS5KMkjxlWYJGlmo/4iz9uAT1fVgUm2AbYfQ02SpCHMOcCT3AV4NPAMgKq6Gbh5PGVJkmYzyhDK7sB64D1JzklyXJI7jakuSdIsRhlCWQI8FDiyqs5K8jbgKODowYWSrARWAixfvnyE3U1vYz8sLEm3d6P0wNcB66rqrP7xKXSB/luqalVVTVTVxLJly0bYnSRp0JwDvKquBn6Q5P79pH2AC8dSlSRpVqOehXIk8IH+DJRLgGeOXpIkaRgjBXhVnQtMjKkWSdIm8EpMSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGjXqDzrcbvjbmpJaYw9ckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGjVygCfZKsk5ST4+joIkScMZRw/8+cBFY9iOJGkTjBTgSe4FPBk4bjzlSJKGNWoP/K3Ai4HbNrZAkpVJ1iRZs379+hF3J0maNOcAT/LnwLVVdfZMy1XVqqqaqKqJZcuWzXV3kqQpRumBPwrYL8la4CRg7yT/NZaqJEmzmnOAV9VLqupeVbUCOAj4QlUdMrbKJEkz8jxwSWrUknFspKrOAM4Yx7YkScOxBy5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElq1JwDPMluSb6Y5KIkFyR5/jgLkyTNbMkI694K/FNVfSvJDsDZST5XVReOqTZJ0gzm3AOvqquq6lv9/Z8CFwG7jqswSdLMxjIGnmQF8BDgrGnmrUyyJsma9evXj2N3kiTGEOBJ7gx8GHhBVf1k6vyqWlVVE1U1sWzZslF3J0nqjRTgSbamC+8PVNVHxlOSJGkYo5yFEuDdwEVV9ebxlSRJGsYoPfBHAU8H9k5ybn970pjqkiTNYs6nEVbVV4GMsRZJ0ibwSkxJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaNefvA19oK476xGKXMLRx1br2mCePZb+buh1JbbAHLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0aKcCT7Jvku0kuTnLUuIqSJM1uzgGeZCvgWOCJwJ7AwUn2HFdhkqSZjdIDfxhwcVVdUlU3AycB+4+nLEnSbEb5UeNdgR8MPF4H/PHUhZKsBFb2D3+W5Ltz3N9S4Lo5rtukvH48bc7rx1DMwtniXmds85Zg1Pbee7qJowR4pplWG0yoWgWsGmE/3c6SNVU1Mep2WmKbtwy2+fZvvto7yhDKOmC3gcf3Aq4crRxJ0rBGCfBvAnskuU+SbYCDgNXjKUuSNJs5D6FU1a1Jngd8BtgKOL6qLhhbZRsaeRimQbZ5y2Cbb//mpb2p2mDYWpLUAK/ElKRGGeCS1KjNLsBnuzw/yR2TnNzPPyvJioWvcryGaPMLk1yY5NtJPp9k2nNCWzLs1zAkOTBJJWn6lLNh2pvkr/vX+YIk/73QNY7bEH/Xy5N8Mck5/d/2kxajznFKcnySa5Ocv5H5SfL2/jn5dpKHjrTDqtpsbnQHQ/8P2B3YBvhfYM8pyzwXeGd//yDg5MWuewHa/Fhg+/7+c7aENvfL7QB8GTgTmFjsuuf5Nd4DOAe4W/94p8WuewHavAp4Tn9/T2DtYtc9hnY/GngocP5G5j8J+BTddTQPB84aZX+bWw98mMvz9wdO6O+fAuyTZLqLiloxa5ur6otVdWP/8Ey6c+5bNuzXMLwaeAPwi4Usbh4M095nAcdW1Y8AquraBa5x3IZpcwF36e/fldvBdSRV9WXg+hkW2R94X3XOBHZMcs+57m9zC/DpLs/fdWPLVNWtwA3A3RekuvkxTJsHHU73Dt6yWduc5CHAblX18YUsbJ4M8xrfD7hfkq8lOTPJvgtW3fwYps2vAA5Jsg74JHDkwpS2qDb1//uMRrmUfj4Mc3n+UJfwN2To9iQ5BJgA/nReK5p/M7Y5yR2AtwDPWKiC5tkwr/ESumGUx9B9wvpKkr2q6sfzXNt8GabNBwPvrao3JXkE8P6+zbfNf3mLZqz5tbn1wIe5PP/XyyRZQvfRa6aPLJu7ob6SIMnjgJcC+1XVLxeotvkyW5t3APYCzkiylm6scHXDBzKH/bv+WFXdUlWXAt+lC/RWDdPmw4EPAlTV14Ft6b706fZsrF9BsrkF+DCX568GDuvvHwh8ofqjA42atc39cMK76MK79bFRmKXNVXVDVS2tqhVVtYJu3H+/qlqzOOWObJi/64/SHawmyVK6IZVLFrTK8RqmzZcD+wAkeSBdgK9f0CoX3mrg0P5slIcDN1TVVXPe2mIftd3IUdrv0R3Bfmk/7VV0/4Ghe5E/BFwMfAPYfbFrXoA2nw5cA5zb31Yvds3z3eYpy55Bw2ehDPkaB3gzcCFwHnDQYte8AG3eE/ga3Rkq5wJ/ttg1j6HNJwJXAbfQ9bYPB44Ajhh4nY/tn5PzRv279lJ6SWrU5jaEIkkakgEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGvX/Fi2YvfeYo80AAAAASUVORK5CYII=\n", | ||
317 | "text/plain": [ | ||
318 | "<Figure size 432x288 with 1 Axes>" | ||
319 | ] | ||
320 | }, | ||
321 | "metadata": { | ||
322 | "needs_background": "light" | ||
323 | }, | ||
324 | "output_type": "display_data" | ||
325 | }, | ||
326 | { | ||
327 | "data": { | ||
328 | "image/png": "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\n", | ||
329 | "text/plain": [ | ||
330 | "<Figure size 432x288 with 1 Axes>" | ||
331 | ] | ||
332 | }, | ||
333 | "metadata": { | ||
334 | "needs_background": "light" | ||
335 | }, | ||
336 | "output_type": "display_data" | ||
337 | }, | ||
338 | { | ||
339 | "data": { | ||
340 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARV0lEQVR4nO3deZBlZX3G8e8jEzQoKjqtUWRsscQKoJZWazSWK5IioqBVVgp0IhrilBqNWYyOsSpqFguNS2I06hhGcAmixgU1JK4ENYA2OMomrqOOoNMExX1Bf/njnknaa0/f2/ee7p7X+X6quubcc96+7++d7n767feec0+qCklSe2603gVIkiZjgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeDaJyTZmeSHSb636OOVSZ6Q5GeL9n05yeuTHLGC5z4jyd+O2fYvF/X1o6G+L598hFL/DHDtSx5ZVTdb9PG0bv8FVXUz4BbAw4AfAhcnObrvAqrqhXv6B568p+/u46i++5OmYYCrGVX1s6r6YlU9Ffgv4Pl7jiV5W5JvJLk+yflJjur2bwEeBzyrm0W/p9u/NckXk3w3yRVJHj1ODUlem+RFQ/vOTfK0bntXkmcnuTLJt5KcnuTGi9qekOTTSb6d5GOr8UtI+w8DXK16B/CARY/PBe4C3Aa4BHgzQFVt67Zf3M2iH9m1/2L3+bcAXgC8Kcntxuj3TOCxSW4EkOS2wIOAtyxq8zjg2K6eo4DndG3vDbwO+EPg1sB24N1JDlzRyKWOAa59ybu6memejyct0/Zq4FZ7HlTV9qr6blX9mMHM/B5JbrG3T66qt1XV1VX186o6G/g8cJ9RBVbVfzNYwnlQt+tk4INVde2iZq+oql3dvhd2bQC2AP9cVZ/s/prY3u2/96h+paUY4NqXPKqqbrno43XLtD0UuA4gyQFJTuuWRL4D7OzabNzbJyd5fJIde35ZAEcv137IG4DN3fZm4I1Dx7+2aPsrwO277TsCz178Swq4XTcWacU2rHcB0oQeDXy0234scCKDFzh3MlgW+RaQ7vgvvOVmkjsyWMo4hsGLlD9LsmNR+1HeCOxI8krgzsB7ho4ftmh7E4O/FmAQ7C+oqhch9cAZuJrRzbTvlOSfgAczWLsGOBj4MfA/wEEMli0W+yZw+KLHN2UQ6gvd8z6RwQx8LFX1FWAHg/Xwt1XVj4aaPC3JoUluzWD9++xu/zbgj5LcOwM3S/LIJDcdt29pMQNc+5L3DJ0H/s5u//2SfA/4DnAecHPg3lV1aXf8DQyWKr4OXAFcOPS8pwNHdssW76qqK4CXAhcwCPe7AR9fYa1ndp83vHwCcBbwQQYvlF5F9wulqi4CngK8msFfCJ/j/5dipBWLN3SQVi7JQxn8Yji8Fv0QJdkFbK6q89arNu0/nIFLK9Sd9vcM4HXlDEjryACXViDJ3Rgsf9wKeMU6l6P9nEsoktQoZ+CS1Kg1PQ9848aNNTs7u5ZdSlLzLr744muramZ4/5oG+OzsLPPz82vZpSQ1L8lXltrvEookNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDWq+VuqzW5935L7d552/BpXIklryxm4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEjAzzJ9iS7k1w2tP/pSa5KcnmSF69eiZKkpYwzAz8DOG7xjiQPAU4E7l5VRwEv6b80SdJyRgZ4VZ0PXDe0+ynAaVX1467N7lWoTZK0jEnfC+UI4AFJ/g74EfDMqvrkUg2TbAG2AGzatGnC7vb+nieStL+a9EXMDcAhwH2BvwDemiRLNayqbVU1V1VzMzMzE3YnSRo2aYDvAt5RA58Afg5s7K8sSdIokwb4u4CHAiQ5AjgQuLavoiRJo41cA09yFvBgYGOSXcDzgO3A9u7Uwp8Ap1RVrWahkqRfNDLAq+rkvRza3HMtkqQV8EpMSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGjUywJNsT7K7u3nD8LFnJqkk3k5NktbYODPwM4DjhncmOQw4FvhqzzVJksYwMsCr6nzguiUOvRx4FuCt1CRpHUy0Bp7kBODrVfXpMdpuSTKfZH5hYWGS7iRJS1hxgCc5CHgu8FfjtK+qbVU1V1VzMzMzK+1OkrQXk8zA7wzcCfh0kp3AHYBLkvxGn4VJkpY38q70w6rqUuA2ex53IT5XVdf2WJckaYRxTiM8C7gAuGuSXUlOXf2yJEmjjJyBV9XJI47P9laNJGlsXokpSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSo8a5ocP2JLuTXLZo398n+WySzyR5Z5Jbrm6ZkqRh48zAzwCOG9r3AeDoqro78DngOT3XJUkaYWSAV9X5wHVD+95fVTd0Dy9kcGNjSdIa6mMN/A+Ac3t4HknSCkwV4EmeC9wAvHmZNluSzCeZX1hYmKY7SdIiEwd4klOARwCPq6raW7uq2lZVc1U1NzMzM2l3kqQhI+9Kv5QkxwHPBh5UVT/otyRJ0jjGOY3wLOAC4K5JdiU5FXglcDDwgSQ7krxmleuUJA0ZOQOvqpOX2H36KtQiSVoBr8SUpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDVqnDvybE+yO8lli/bdKskHkny++/eQ1S1TkjRsnBn4GcBxQ/u2Ah+qqrsAH+oeS5LW0MgAr6rzgeuGdp8InNltnwk8que6JEkjTLoGftuqugag+/c2e2uYZEuS+STzCwsLE3YnSRq26i9iVtW2qpqrqrmZmZnV7k6S9huTBvg3k9wOoPt3d38lSZLGMWmAnwOc0m2fAry7n3IkSeMa5zTCs4ALgLsm2ZXkVOA04NgknweO7R5LktbQhlENqurkvRw6pudaJEkr4JWYktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEjTyNs1ezW9y25f+dpx69xJZK0OpyBS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckho1VYAn+dMklye5LMlZSW7SV2GSpOVNHOBJDgX+GJirqqOBA4CT+ipMkrS8aZdQNgC/nmQDcBBw9fQlSZLGMXGAV9XXgZcAXwWuAa6vqvcPt0uyJcl8kvmFhYXJK5Uk/YJpllAOAU4E7gTcHrhpks3D7apqW1XNVdXczMzM5JVKkn7BNEsoDwO+XFULVfVT4B3Ab/dTliRplGkC/KvAfZMclCQM7lJ/ZT9lSZJGmWYN/CLg7cAlwKXdc23rqS5J0ghT3dChqp4HPK+nWiRJK+CVmJLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRk0V4ElumeTtST6b5Mok9+urMEnS8qa6Iw/wj8B/VNVjkhwIHNRDTZKkMUwc4EluDjwQeAJAVf0E+Ek/ZUmSRplmBn44sAC8Psk9gIuBZ1TV9xc3SrIF2AKwadOmKbrrx+zW9+312M7Tjl/DSiRpOtOsgW8A7gW8uqruCXwf2DrcqKq2VdVcVc3NzMxM0Z0kabFpAnwXsKuqLuoev51BoEuS1sDEAV5V3wC+luSu3a5jgCt6qUqSNNK0Z6E8HXhzdwbKl4AnTl+SJGkcUwV4Ve0A5nqqRZK0Al6JKUmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqOmDvAkByT5VJL39lGQJGk8fczAnwFc2cPzSJJWYKoAT3IH4HjgX/opR5I0rmln4P8APAv4+d4aJNmSZD7J/MLCwpTdSZL2mDjAkzwC2F1VFy/Xrqq2VdVcVc3NzMxM2p0kacg0M/D7Ayck2Qm8BXhokjf1UpUkaaSJA7yqnlNVd6iqWeAk4MNVtbm3yiRJy/I8cElq1IY+nqSqzgPO6+O5JEnjcQYuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSo6a5J+ZhST6S5Moklyd5Rp+FSZKWN80NHW4A/ryqLklyMHBxkg9U1RU91SZJWsY098S8pqou6ba/C1wJHNpXYZKk5fWyBp5kFrgncNESx7YkmU8yv7Cw0Ed3kiR6CPAkNwP+DfiTqvrO8PGq2lZVc1U1NzMzM213kqTOVAGe5NcYhPebq+od/ZQkSRrHNGehBDgduLKqXtZfSZKkcUwzA78/8PvAQ5Ps6D4e3lNdkqQRJj6NsKo+BqTHWiRJK+CVmJLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNWqat5P9lTO79X0rar/ztONXqRJJGs0ZuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalR094T87gkVyX5QpKtfRUlSRptmntiHgC8Cvhd4Ejg5CRH9lWYJGl508zA7wN8oaq+VFU/Ad4CnNhPWZKkUaZ5L5RDga8terwL+K3hRkm2AFu6h99LctWE/W0Erp3wc1dFXrTqXexzY14Djnn/4JhX5o5L7ZwmwJe6oXH90o6qbcC2KfoZdJbMV9XctM/TEse8f3DM+4fVGPM0Syi7gMMWPb4DcPV05UiSxjVNgH8SuEuSOyU5EDgJOKefsiRJo0y8hFJVNyR5GvCfwAHA9qq6vLfKftnUyzANcsz7B8e8f+h9zKn6pWVrSVIDvBJTkhplgEtSo/a5AB91eX6SGyc5uzt+UZLZta+yX2OM+c+SXJHkM0k+lGTJc0JbMu7bMCR5TJJK0vQpZ+OMN8nvdV/ny5P861rX2Lcxvq83JflIkk9139sPX486+5Rke5LdSS7by/EkeUX3f/KZJPeaqsOq2mc+GLwY+kXgcOBA4NPAkUNtngq8pts+CTh7vetegzE/BDio237K/jDmrt3BwPnAhcDcete9yl/juwCfAg7pHt9mvetegzFvA57SbR8J7FzvunsY9wOBewGX7eX4w4FzGVxHc1/gomn629dm4ONcnn8icGa3/XbgmCRLXVTUipFjrqqPVNUPuocXMjjnvmXjvg3D3wAvBn60lsWtgnHG+yTgVVX1LYCq2r3GNfZtnDEXcPNu+xb8ClxHUlXnA9ct0+RE4A01cCFwyyS3m7S/fS3Al7o8/9C9tamqG4DrgVuvSXWrY5wxL3Yqg9/gLRs55iT3BA6rqveuZWGrZJyv8RHAEUk+nuTCJMetWXWrY5wxPx/YnGQX8O/A09emtHW10p/3ZU1zKf1qGOfy/LEu4W/I2ONJshmYAx60qhWtvmXHnORGwMuBJ6xVQatsnK/xBgbLKA9m8BfWR5McXVXfXuXaVss4Yz4ZOKOqXprkfsAbuzH/fPXLWze95te+NgMf5/L8/2uTZAODP72W+5NlXzfWWxIkeRjwXOCEqvrxGtW2WkaN+WDgaOC8JDsZrBWe0/ALmeN+X7+7qn5aVV8GrmIQ6K0aZ8ynAm8FqKoLgJsweMOnX2W9vgXJvhbg41yefw5wSrf9GODD1b060KiRY+6WE17LILxbXxuFEWOuquuramNVzVbVLIN1/xOqan59yp3aON/X72LwYjVJNjJYUvnSmlbZr3HG/FXgGIAkv8kgwBfWtMq1dw7w+O5slPsC11fVNRM/23q/aruXV2k/x+AV7Od2+/6awQ8wDL7IbwO+AHwCOHy9a16DMX8Q+Cawo/s4Z71rXu0xD7U9j4bPQhnzaxzgZcAVwKXASetd8xqM+Ujg4wzOUNkB/M5619zDmM8CrgF+ymC2fSrwZODJi77Or+r+Ty6d9vvaS+klqVH72hKKJGlMBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElq1P8C2zvVYCOUdf8AAAAASUVORK5CYII=\n", | ||
341 | "text/plain": [ | ||
342 | "<Figure size 432x288 with 1 Axes>" | ||
343 | ] | ||
344 | }, | ||
345 | "metadata": { | ||
346 | "needs_background": "light" | ||
347 | }, | ||
348 | "output_type": "display_data" | ||
349 | }, | ||
350 | { | ||
351 | "data": { | ||
352 | "image/png": "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\n", | ||
353 | "text/plain": [ | ||
354 | "<Figure size 432x288 with 1 Axes>" | ||
355 | ] | ||
356 | }, | ||
357 | "metadata": { | ||
358 | "needs_background": "light" | ||
359 | }, | ||
360 | "output_type": "display_data" | ||
361 | }, | ||
362 | { | ||
363 | "data": { | ||
364 | "image/png": "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\n", | ||
365 | "text/plain": [ | ||
366 | "<Figure size 432x288 with 1 Axes>" | ||
367 | ] | ||
368 | }, | ||
369 | "metadata": { | ||
370 | "needs_background": "light" | ||
371 | }, | ||
372 | "output_type": "display_data" | ||
373 | }, | ||
374 | { | ||
375 | "data": { | ||
376 | "image/png": "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\n", | ||
377 | "text/plain": [ | ||
378 | "<Figure size 432x288 with 1 Axes>" | ||
379 | ] | ||
380 | }, | ||
381 | "metadata": { | ||
382 | "needs_background": "light" | ||
383 | }, | ||
384 | "output_type": "display_data" | ||
385 | }, | ||
386 | { | ||
387 | "data": { | ||
388 | "image/png": "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\n", | ||
389 | "text/plain": [ | ||
390 | "<Figure size 432x288 with 1 Axes>" | ||
391 | ] | ||
392 | }, | ||
393 | "metadata": { | ||
394 | "needs_background": "light" | ||
395 | }, | ||
396 | "output_type": "display_data" | ||
397 | }, | ||
398 | { | ||
399 | "data": { | ||
400 | "image/png": "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\n", | ||
401 | "text/plain": [ | ||
402 | "<Figure size 432x288 with 1 Axes>" | ||
403 | ] | ||
404 | }, | ||
405 | "metadata": { | ||
406 | "needs_background": "light" | ||
407 | }, | ||
408 | "output_type": "display_data" | ||
409 | }, | ||
410 | { | ||
411 | "data": { | ||
412 | "image/png": "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\n", | ||
413 | "text/plain": [ | ||
414 | "<Figure size 432x288 with 1 Axes>" | ||
415 | ] | ||
416 | }, | ||
417 | "metadata": { | ||
418 | "needs_background": "light" | ||
419 | }, | ||
420 | "output_type": "display_data" | ||
421 | } | ||
422 | ], | ||
423 | "source": [ | ||
424 | "drawTypeDistributions('../input/viatra_75/', 50)" | ||
425 | ] | ||
426 | }, | ||
427 | { | ||
428 | "cell_type": "markdown", | ||
429 | "metadata": {}, | ||
430 | "source": [ | ||
431 | "## Extract Human Models with size [90, 101]" | ||
432 | ] | ||
433 | }, | ||
434 | { | ||
435 | "cell_type": "code", | ||
436 | "execution_count": 8, | ||
437 | "metadata": {}, | ||
438 | "outputs": [], | ||
439 | "source": [ | ||
440 | "def extractModel():\n", | ||
441 | " from shutil import copy\n", | ||
442 | " list_of_files = reader.readmultiplefiles('../input/humanOutput/', 5000)\n", | ||
443 | " num_nodes_list =[]\n", | ||
444 | " human_size_dic = {}\n", | ||
445 | " for file in list_of_files:\n", | ||
446 | " contents = reader.readcsvfile(file)\n", | ||
447 | " num_of_node = contents[constants.NUMBER_NODES]\n", | ||
448 | " # human_size_dic[file] = int(num_of_node[0])\n", | ||
449 | " # num_nodes_list.append(int(num_of_node[0]))\n", | ||
450 | " if 90 <= num_of_node[0] <= 110:\n", | ||
451 | " copy(file, '../input/human_output_100/')" | ||
452 | ] | ||
453 | }, | ||
454 | { | ||
455 | "cell_type": "markdown", | ||
456 | "metadata": {}, | ||
457 | "source": [ | ||
458 | "## Multinomial Distribution Analysis" | ||
459 | ] | ||
460 | }, | ||
461 | { | ||
462 | "cell_type": "code", | ||
463 | "execution_count": 29, | ||
464 | "metadata": {}, | ||
465 | "outputs": [ | ||
466 | { | ||
467 | "name": "stdout", | ||
468 | "output_type": "stream", | ||
469 | "text": [ | ||
470 | "{'EAnnotation': 0.04240463215258856, 'EClass': 0.1558242506811989, 'EAttribute': 0.12880336058128974, 'EStringToStringMapEntry': 0.07317211625794733, 'EGenericType': 0.3791439600363306, 'EReference': 0.14208673932788374, 'EPackage': 0.01759763851044505, 'EDataType': 0.005619891008174387, 'EEnumLiteral': 0.03139191643960036, 'EEnum': 0.008174386920980926, 'EOperation': 0.009366485013623978, 'EParameter': 0.00607402361489555, 'ETypeParameter': 0.00022706630336058128, 'EObject': 0.00011353315168029064}\n" | ||
471 | ] | ||
472 | } | ||
473 | ], | ||
474 | "source": [ | ||
475 | "import numpy as np\n", | ||
476 | "import scipy.stats as stats\n", | ||
477 | "graphStats = getModels('../input/human_models_75/', 1500)\n", | ||
478 | "totalNodes = sum(list(map(lambda g: g.numNodes, graphStats)))[0]\n", | ||
479 | "typeMap = {}\n", | ||
480 | "for g in graphStats:\n", | ||
481 | " gKeys = g.nodeTypeStat.keys()\n", | ||
482 | " size = g.numNodes[0]\n", | ||
483 | " for key in gKeys:\n", | ||
484 | " curNum = typeMap.get(key, 0)\n", | ||
485 | " typeMap[key] = curNum + float(g.nodeTypeStat[key]) * size\n", | ||
486 | "\n", | ||
487 | "for key in typeMap.keys():\n", | ||
488 | " typeMap[key] /= totalNodes\n", | ||
489 | "print(typeMap)" | ||
490 | ] | ||
491 | }, | ||
492 | { | ||
493 | "cell_type": "code", | ||
494 | "execution_count": 30, | ||
495 | "metadata": {}, | ||
496 | "outputs": [], | ||
497 | "source": [ | ||
498 | "def chiSquareMultinomialTest(freq, prob):\n", | ||
499 | " freq = np.array(freq)\n", | ||
500 | " prob = np.array(prob)\n", | ||
501 | " size = sum(freq)\n", | ||
502 | " e = prob * size\n", | ||
503 | " return stats.chisquare(freq, e)" | ||
504 | ] | ||
505 | }, | ||
506 | { | ||
507 | "cell_type": "code", | ||
508 | "execution_count": 31, | ||
509 | "metadata": {}, | ||
510 | "outputs": [], | ||
511 | "source": [ | ||
512 | "def typeDistributionTest(g):\n", | ||
513 | " size = g.numNodes[0]\n", | ||
514 | " freq = []\n", | ||
515 | " prob = []\n", | ||
516 | " for key in typeMap.keys():\n", | ||
517 | " value = float(g.nodeTypeStat.get(key, 0))\n", | ||
518 | " freq.append(np.round(value * size))\n", | ||
519 | " prob.append(typeMap[key])\n", | ||
520 | " test = chiSquareMultinomialTest(freq, prob)\n", | ||
521 | " return test" | ||
522 | ] | ||
523 | }, | ||
524 | { | ||
525 | "cell_type": "code", | ||
526 | "execution_count": 32, | ||
527 | "metadata": {}, | ||
528 | "outputs": [ | ||
529 | { | ||
530 | "name": "stdout", | ||
531 | "output_type": "stream", | ||
532 | "text": [ | ||
533 | "[7.26359261e+01 6.82490355e-02]\n", | ||
534 | "[3.31848655e+01 1.59841378e-03]\n" | ||
535 | ] | ||
536 | } | ||
537 | ], | ||
538 | "source": [ | ||
539 | "test = [typeDistributionTest(graphStats[i]) for i in range(len(graphStats))]\n", | ||
540 | "print(np.mean(test, 0))\n", | ||
541 | "print(np.median(test, 0))" | ||
542 | ] | ||
543 | }, | ||
544 | { | ||
545 | "cell_type": "markdown", | ||
546 | "metadata": {}, | ||
547 | "source": [ | ||
548 | "## Node Counts Distribution" | ||
549 | ] | ||
550 | }, | ||
551 | { | ||
552 | "cell_type": "code", | ||
553 | "execution_count": 32, | ||
554 | "metadata": {}, | ||
555 | "outputs": [], | ||
556 | "source": [ | ||
557 | "import matplotlib.pyplot as plt\n", | ||
558 | "from shutil import copyfile\n", | ||
559 | "\n", | ||
560 | "# graphStats = getModels('../input/human_models/', 1500)\n", | ||
561 | "# sizes = []\n", | ||
562 | "filenames = reader.readmultiplefiles('../input/human_models/', 1500, False)\n", | ||
563 | "count = 1\n", | ||
564 | "for filename in filenames:\n", | ||
565 | " graphStat = GraphStat(filename)\n", | ||
566 | " size = graphStat.numNodes[0]\n", | ||
567 | " if(size <= 87 and size >= 67):\n", | ||
568 | " copyfile(filename, '../input/human_models_75/{}.csv'.format(count))\n", | ||
569 | " count+=1\n", | ||
570 | " \n", | ||
571 | " \n", | ||
572 | " \n", | ||
573 | "# for g in graphStats:\n", | ||
574 | "# size = g.numNodes[0]\n", | ||
575 | " \n", | ||
576 | "# print(min(sizes))\n", | ||
577 | "# print(len(sizes))\n", | ||
578 | "# plt.hist(sizes, bins=10)\n" | ||
579 | ] | ||
580 | }, | ||
581 | { | ||
582 | "cell_type": "code", | ||
583 | "execution_count": null, | ||
584 | "metadata": {}, | ||
585 | "outputs": [], | ||
586 | "source": [] | ||
587 | } | ||
588 | ], | ||
589 | "metadata": { | ||
590 | "kernelspec": { | ||
591 | "display_name": "Python 3", | ||
592 | "language": "python", | ||
593 | "name": "python3" | ||
594 | }, | ||
595 | "language_info": { | ||
596 | "codemirror_mode": { | ||
597 | "name": "ipython", | ||
598 | "version": 3 | ||
599 | }, | ||
600 | "file_extension": ".py", | ||
601 | "mimetype": "text/x-python", | ||
602 | "name": "python", | ||
603 | "nbconvert_exporter": "python", | ||
604 | "pygments_lexer": "ipython3", | ||
605 | "version": "3.7.3" | ||
606 | } | ||
607 | }, | ||
608 | "nbformat": 4, | ||
609 | "nbformat_minor": 2 | ||
610 | } | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/plot_violation.py b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/plot_violation.py new file mode 100644 index 00000000..e5e12f42 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/plot_violation.py | |||
@@ -0,0 +1,77 @@ | |||
1 | import matplotlib.pyplot as plt | ||
2 | import numpy as np | ||
3 | import cdf_histogram as cdf | ||
4 | import readCSV as reader | ||
5 | import constants | ||
6 | import csv | ||
7 | from shutil import copy | ||
8 | |||
9 | |||
10 | # viatra_controlled = np.genfromtxt('../statistics/violations/viatra_controlled.csv', delimiter='\n') | ||
11 | # viatra_controlled_mean = np.mean(viatra_controlled) | ||
12 | # viatra_nocons = np.genfromtxt('../statistics/violations/viatra_no_cons_violation.csv', delimiter='\n') | ||
13 | # viatra_nocons_mean = np.mean(viatra_nocons) | ||
14 | # human = np.genfromtxt('../statistics/violations/human_violation.csv', delimiter='\n') | ||
15 | # human_mean = np.mean(human) | ||
16 | # print('viatra controlled violation mean: ' + str(viatra_controlled_mean)) | ||
17 | # print('viatra no cons violation mean: ' + str(viatra_nocons_mean)) | ||
18 | # print('human output violation mean: ' + str(human_mean)) | ||
19 | |||
20 | |||
21 | def read_violation_file(file_name): | ||
22 | violation = {} | ||
23 | with open(file_name) as f: | ||
24 | for i, line in enumerate(f): | ||
25 | line = int(line.rstrip()) | ||
26 | if line in violation: | ||
27 | violation[line] += 1 | ||
28 | else: | ||
29 | violation[line] = 1 | ||
30 | f.close() | ||
31 | return violation | ||
32 | |||
33 | # violation = read_violation_file('../statistics/violations/viatra_controlled.csv') | ||
34 | # print(violation) | ||
35 | # fig, ax = plt.subplots() | ||
36 | # rects = ax.bar(violation.keys(), violation.values()) | ||
37 | # cdf.autolabel(rects, ax) | ||
38 | # ax.set_title('viatra controlled violation distribution') | ||
39 | # ax.set_xlabel('number of violations') | ||
40 | # ax.set_ylabel('number of occurrence') | ||
41 | # plt.show() | ||
42 | # fig.savefig('../statistics/violations/viatra_controlled_violation_distribution.png') | ||
43 | |||
44 | |||
45 | def plot_violation(): | ||
46 | v = np.array([0,1,1,0,0]) | ||
47 | print(v) | ||
48 | (n, bins) = np.histogram(v, bins=v.size, density=True) # NumPy version (no plot) | ||
49 | # plt.plot(.5 * (bins[1:] + bins[:-1]), n) | ||
50 | plt.hist(v, bins=50, density=1) | ||
51 | plt.show() | ||
52 | |||
53 | |||
54 | def human_output_size(): | ||
55 | list_of_files = reader.readmultiplefiles('../statistics/humanOutput/', 5000) | ||
56 | num_nodes_list =[] | ||
57 | human_size_dic = {} | ||
58 | for file in list_of_files: | ||
59 | contents = reader.readcsvfile(file) | ||
60 | num_of_node = contents[constants.NUMBER_NODES] | ||
61 | # human_size_dic[file] = int(num_of_node[0]) | ||
62 | # num_nodes_list.append(int(num_of_node[0])) | ||
63 | if 90 <= num_of_node[0] <= 110: | ||
64 | copy(file, '../statistics/human_output_100/') | ||
65 | |||
66 | # mean = np.mean(num_nodes_list) | ||
67 | # std = np.std(num_nodes_list) | ||
68 | # with open('../statistics/human_output_size.csv', 'w', newline='') as csvfile: | ||
69 | # spamwriter = csv.writer(csvfile, delimiter=',', | ||
70 | # quotechar='|', quoting=csv.QUOTE_MINIMAL) | ||
71 | # spamwriter.writerow(['mean', mean]) | ||
72 | # spamwriter.writerow(['standard deviation', std]) | ||
73 | # for key, value in human_size_dic.items(): | ||
74 | # spamwriter.writerow([key, value]) | ||
75 | |||
76 | |||
77 | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py index d6bdad0d..feb9a0a9 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py | |||
@@ -25,6 +25,8 @@ class GraphStat: | |||
25 | # init with teh file name of the stat | 25 | # init with teh file name of the stat |
26 | def __init__(self, filename): | 26 | def __init__(self, filename): |
27 | contents, self.out_d, self.na, self.mpc = reader.getmetrics(filename) | 27 | contents, self.out_d, self.na, self.mpc = reader.getmetrics(filename) |
28 | self.num_nodes = np.array(contents[constants.NUMBER_NODES]) | 28 | self.numNodes = np.array(contents[constants.NUMBER_NODES]) |
29 | if constants.STATE_ID in contents: | 29 | if constants.STATE_ID in contents: |
30 | self.id = (contents[constants.STATE_ID])[0] | 30 | self.id = (contents[constants.STATE_ID])[0] |
31 | if constants.Node_TYPE_KEY in contents: | ||
32 | self.nodeTypeStat = contents[constants.Node_TYPE_KEY] | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py b/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py index aba81b13..51e538f8 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py | |||
@@ -18,8 +18,13 @@ METAMODEL = 'Meta Mode' | |||
18 | 18 | ||
19 | STATE_ID = 'State Id' | 19 | STATE_ID = 'State Id' |
20 | 20 | ||
21 | NODE_TYPE = 'Node Type' | ||
22 | |||
23 | Node_TYPE_KEY = 'NodeType' | ||
24 | |||
21 | HUMAN_OUT_D_REP = '../input/humanOutput/R_2015225_run_1.csv' | 25 | HUMAN_OUT_D_REP = '../input/humanOutput/R_2015225_run_1.csv' |
22 | 26 | ||
23 | HUMAN_MPC_REP = '../input/humanOutput/R_2016324_run_1.csv' | 27 | HUMAN_MPC_REP = '../input/humanOutput/R_2016324_run_1.csv' |
24 | 28 | ||
25 | HUMAN_NA_REP = '../input/humanOutput/R_2017419_run_1.csv' | 29 | HUMAN_NA_REP = '../input/humanOutput/R_2017419_run_1.csv' |
30 | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py b/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py index 33378ce5..1cec2f0c 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py | |||
@@ -13,8 +13,10 @@ def readcsvfile(filename): | |||
13 | 13 | ||
14 | contents = {} | 14 | contents = {} |
15 | with open(filename) as f: | 15 | with open(filename) as f: |
16 | for i, line in enumerate(f): | 16 | data = list(f) |
17 | arr = line.split(',') | 17 | f.close() |
18 | for i, line in enumerate(data): | ||
19 | arr = line.replace('\n', '').split(',') | ||
18 | # if there is no element in the line, continue | 20 | # if there is no element in the line, continue |
19 | if len(line) < 0: continue | 21 | if len(line) < 0: continue |
20 | # else check for contents | 22 | # else check for contents |
@@ -24,14 +26,17 @@ def readcsvfile(filename): | |||
24 | # meta models are string | 26 | # meta models are string |
25 | elif(arr[0] == constants.METAMODEL): | 27 | elif(arr[0] == constants.METAMODEL): |
26 | contents[constants.METAMODEL] = arr[1:] | 28 | contents[constants.METAMODEL] = arr[1:] |
27 | # NA and OD are integers | 29 | # Node types |
30 | elif(arr[0] == constants.NODE_TYPE): | ||
31 | types = data[i+1].replace('\n', '').split(',') | ||
32 | numbers = data[i+2].replace('\n', '').split(',') | ||
33 | contents[constants.Node_TYPE_KEY] = {t : n for t, n in zip(types, numbers)} | ||
34 | # NA and OD are integers, and store other information as string | ||
28 | else: | 35 | else: |
29 | try: | 36 | try: |
30 | contents[arr[0]] = list(map(int, arr[1:])) | 37 | contents[arr[0]] = list(map(int, arr[1:])) |
31 | except: | 38 | except: |
32 | message = arr[0], ' is not integer' | 39 | contents[arr[0]] = arr[1:] |
33 | #print(message) | ||
34 | f.close() | ||
35 | return contents | 40 | return contents |
36 | 41 | ||
37 | def checkAndReshape(arr): | 42 | def checkAndReshape(arr): |