diff options
author | 2020-11-03 22:52:26 -0500 | |
---|---|---|
committer | 2020-11-03 22:52:26 -0500 | |
commit | 945f487a08b643392a5d5918c631640b9a0e4605 (patch) | |
tree | b537c456e395950ce98daaabb9468c7c17d5a72b /Metrics/Metrics-Calculation/metrics_plot | |
parent | Fix numeric-solver-at-end (diff) | |
download | VIATRA-Generator-945f487a08b643392a5d5918c631640b9a0e4605.tar.gz VIATRA-Generator-945f487a08b643392a5d5918c631640b9a0e4605.tar.zst VIATRA-Generator-945f487a08b643392a5d5918c631640b9a0e4605.zip |
add realistic solver
Diffstat (limited to 'Metrics/Metrics-Calculation/metrics_plot')
208 files changed, 4046 insertions, 0 deletions
diff --git a/Metrics/Metrics-Calculation/metrics_plot/.gitignore b/Metrics/Metrics-Calculation/metrics_plot/.gitignore new file mode 100644 index 00000000..dc53b109 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/.gitignore | |||
@@ -0,0 +1,10 @@ | |||
1 | # virtual enviroment | ||
2 | venv/ | ||
3 | |||
4 | # python cache | ||
5 | *.pyc | ||
6 | .ipynb_checkpoints/ | ||
7 | .idea/ | ||
8 | |||
9 | # keep folders | ||
10 | !.gitignore \ No newline at end of file | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/input/.gitignore b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/input/.gitignore new file mode 100644 index 00000000..b3934b01 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/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/Measurements/Measurement1/output/distances/ecore/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/MPC.png new file mode 100644 index 00000000..a8772bdd --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Node_Activity.png new file mode 100644 index 00000000..9defdaff --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Node_Type.png new file mode 100644 index 00000000..e98559bb --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Out_Degree.png new file mode 100644 index 00000000..eec3f95e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/ecore/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/MPC.png new file mode 100644 index 00000000..20df6086 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Node_Activity.png new file mode 100644 index 00000000..c7c18186 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Node_Type.png new file mode 100644 index 00000000..6d7230db --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Out_Degree.png new file mode 100644 index 00000000..eb157b8e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/distances/yakindumm/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.png new file mode 100644 index 00000000..b8930a7b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.png new file mode 100644 index 00000000..d55a000c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.png new file mode 100644 index 00000000..554923f5 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.png new file mode 100644 index 00000000..1a605f9a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.png new file mode 100644 index 00000000..719249d4 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/MPC.png new file mode 100644 index 00000000..8f59786d --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Node_Activity.png new file mode 100644 index 00000000..a3775f23 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Node_Type.png new file mode 100644 index 00000000..5d3f81e1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Out_Degree.png new file mode 100644 index 00000000..a89eb552 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Violations.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Violations.png new file mode 100644 index 00000000..50a4cba0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/github/Violations.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png new file mode 100644 index 00000000..fcff0dfe --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png new file mode 100644 index 00000000..ad44025f --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png new file mode 100644 index 00000000..a61d6e5a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png new file mode 100644 index 00000000..4749db22 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png new file mode 100644 index 00000000..ac09e580 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb new file mode 100644 index 00000000..5db66bb3 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb | |||
@@ -0,0 +1,362 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "code", | ||
5 | "execution_count": 173, | ||
6 | "metadata": {}, | ||
7 | "outputs": [], | ||
8 | "source": [ | ||
9 | "import matplotlib.pyplot as plt\n", | ||
10 | "import statistics\n", | ||
11 | "import os\n", | ||
12 | "import sys\n", | ||
13 | "lib_path = os.path.abspath(os.path.join('..','..', '..', 'utils'))\n", | ||
14 | "sys.path.append(lib_path)\n", | ||
15 | "from GraphType import GraphStat\n", | ||
16 | "import readCSV as reader\n", | ||
17 | "import constants\n", | ||
18 | "import DistributionMetrics as metrics" | ||
19 | ] | ||
20 | }, | ||
21 | { | ||
22 | "cell_type": "code", | ||
23 | "execution_count": 174, | ||
24 | "metadata": {}, | ||
25 | "outputs": [], | ||
26 | "source": [ | ||
27 | "def getModels(folderName, numberOfModels):\n", | ||
28 | " filenames = reader.readmultiplefiles(folderName, numberOfModels, False)\n", | ||
29 | " graphStats = [GraphStat(filename) for filename in filenames]\n", | ||
30 | " return graphStats" | ||
31 | ] | ||
32 | }, | ||
33 | { | ||
34 | "cell_type": "markdown", | ||
35 | "metadata": {}, | ||
36 | "source": [ | ||
37 | "## Import" | ||
38 | ] | ||
39 | }, | ||
40 | { | ||
41 | "cell_type": "code", | ||
42 | "execution_count": 175, | ||
43 | "metadata": {}, | ||
44 | "outputs": [], | ||
45 | "source": [ | ||
46 | "domain = 'github'\n", | ||
47 | "mpc_guide = getModels('../input/{}/MPC/'.format(domain), 100)\n", | ||
48 | "na_guide = getModels('../input/{}/NodeActivity/'.format(domain), 100)\n", | ||
49 | "od_guide = getModels('../input/{}/OutDegree/'.format(domain), 100)\n", | ||
50 | "nt_guide = getModels('../input/{}/NodeType/'.format(domain), 100)\n", | ||
51 | "composite_guide = getModels('../input/{}/Composite/'.format(domain), 100)\n", | ||
52 | "composite_no_violations_guide = getModels('../input/{}/Composite_Without_Violations/'.format(domain), 100)\n", | ||
53 | "violations_guide = getModels('../input/{}/Violations/'.format(domain), 100)\n", | ||
54 | "human = getModels('../input/{}/Human/'.format(domain), 304)\n", | ||
55 | "model_types = [human, composite_guide, composite_no_violations_guide, mpc_guide, na_guide, od_guide, nt_guide, violations_guide]" | ||
56 | ] | ||
57 | }, | ||
58 | { | ||
59 | "cell_type": "code", | ||
60 | "execution_count": 176, | ||
61 | "metadata": {}, | ||
62 | "outputs": [], | ||
63 | "source": [ | ||
64 | "if domain == 'yakindumm':\n", | ||
65 | " type_map = {'Entry': 0.04257802080554814, 'Choice': 0.1267671379034409, 'State': 0.1596092291277674, 'Transition': 0.6138636969858629, 'Statechart': 0.010136036276340358, 'Region': 0.04467858095492131, 'Exit': 0.0018338223526273673, 'FinalState': 0.0005334755934915977}\n", | ||
66 | "elif domain == 'ecore':\n", | ||
67 | " type_map = {'EAttribute': 0.23539778449144008, 'EClass': 0.30996978851963747, 'EReference': 0.33081570996978854, 'EPackage': 0.012789526686807653, 'EAnnotation': 0.002517623363544813, 'EEnumLiteral': 0.07275931520644502, 'EEnum': 0.013645518630412891, 'EDataType': 0.004028197381671702, 'EParameter': 0.005941591137965764, 'EGenericType': 0.002014098690835851, 'EOperation': 0.009415911379657605, 'ETypeParameter': 0.0007049345417925478}\n", | ||
68 | "elif domain == 'github':\n", | ||
69 | " type_map = {'Project': 0.012636538873420432, 'Commit': 0.5525808524309276, 'User': 0.05847076461769116, 'Issue': 0.12743628185907047, 'PullRequest': 0.07560505461554937, 'IssueEvent': 0.17327050760334123}" | ||
70 | ] | ||
71 | }, | ||
72 | { | ||
73 | "cell_type": "code", | ||
74 | "execution_count": 177, | ||
75 | "metadata": {}, | ||
76 | "outputs": [], | ||
77 | "source": [ | ||
78 | "# import rep\n", | ||
79 | "mpc_rep = getModels('../input/{}/MPC_REP/'.format(domain), 1)\n", | ||
80 | "na_rep = getModels('../input/{}/NA_REP/'.format(domain), 1)\n", | ||
81 | "od_rep = getModels('../input/{}/OUT_DEGREE_REP/'.format(domain), 1)\n", | ||
82 | "rep = mpc_rep[0]\n", | ||
83 | "rep.na = na_rep[0].na\n", | ||
84 | "rep.out_d = od_rep[0].out_d\n", | ||
85 | "rep.nodeTypeStat = type_map" | ||
86 | ] | ||
87 | }, | ||
88 | { | ||
89 | "cell_type": "markdown", | ||
90 | "metadata": {}, | ||
91 | "source": [ | ||
92 | "### Helper Functions" | ||
93 | ] | ||
94 | }, | ||
95 | { | ||
96 | "cell_type": "code", | ||
97 | "execution_count": 178, | ||
98 | "metadata": {}, | ||
99 | "outputs": [], | ||
100 | "source": [ | ||
101 | "def calculate_ks(dist1, dist2):\n", | ||
102 | " value, p= metrics.ks_distance(dist1, dist2)\n", | ||
103 | " return value" | ||
104 | ] | ||
105 | }, | ||
106 | { | ||
107 | "cell_type": "code", | ||
108 | "execution_count": 179, | ||
109 | "metadata": {}, | ||
110 | "outputs": [], | ||
111 | "source": [ | ||
112 | "def mkdir(path):\n", | ||
113 | " if not os.path.exists(path):\n", | ||
114 | " os.makedirs(path)" | ||
115 | ] | ||
116 | }, | ||
117 | { | ||
118 | "cell_type": "markdown", | ||
119 | "metadata": {}, | ||
120 | "source": [ | ||
121 | "### Plot Config" | ||
122 | ] | ||
123 | }, | ||
124 | { | ||
125 | "cell_type": "code", | ||
126 | "execution_count": 180, | ||
127 | "metadata": {}, | ||
128 | "outputs": [], | ||
129 | "source": [ | ||
130 | "output_path = '../output/{}/'.format(domain)\n", | ||
131 | "mkdir(output_path)" | ||
132 | ] | ||
133 | }, | ||
134 | { | ||
135 | "cell_type": "markdown", | ||
136 | "metadata": {}, | ||
137 | "source": [ | ||
138 | "### Draw diagrams" | ||
139 | ] | ||
140 | }, | ||
141 | { | ||
142 | "cell_type": "code", | ||
143 | "execution_count": 181, | ||
144 | "metadata": {}, | ||
145 | "outputs": [], | ||
146 | "source": [ | ||
147 | "def drawBoxDiagram(title, target, types, distance_func, label_position):\n", | ||
148 | " distances = []\n", | ||
149 | " for distributions in types:\n", | ||
150 | " distances.append([distance_func(target, distribution) for distribution in distributions])\n", | ||
151 | " fig, ax1 = plt.subplots()\n", | ||
152 | " fig.set_size_inches(5, 2)\n", | ||
153 | " result = plt.boxplot(distances)\n", | ||
154 | " ax1.xaxis.set_ticks_position(label_position) \n", | ||
155 | " texts = ax1.set_xticklabels(labels, rotation=90, fontsize=12)\n", | ||
156 | " plt.savefig('{}/{}.png'.format(output_path, title), dpi=500, bbox_inches=\"tight\")" | ||
157 | ] | ||
158 | }, | ||
159 | { | ||
160 | "cell_type": "code", | ||
161 | "execution_count": 182, | ||
162 | "metadata": {}, | ||
163 | "outputs": [ | ||
164 | { | ||
165 | "data": { | ||
166 | "image/png": "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\n", | ||
167 | "text/plain": [ | ||
168 | "<Figure size 360x144 with 1 Axes>" | ||
169 | ] | ||
170 | }, | ||
171 | "metadata": { | ||
172 | "needs_background": "light" | ||
173 | }, | ||
174 | "output_type": "display_data" | ||
175 | } | ||
176 | ], | ||
177 | "source": [ | ||
178 | "# draw mpc\n", | ||
179 | "mpc_types = []\n", | ||
180 | "labels = ['Hum', 'Comb+V', 'Comb-V', 'MPC', 'NA', 'OD', 'NTD', 'VIO']\n", | ||
181 | "for models in model_types:\n", | ||
182 | " mpc_types.append([model.mpc for model in models])\n", | ||
183 | "drawBoxDiagram('MPC', rep.mpc, mpc_types, calculate_ks, 'top')" | ||
184 | ] | ||
185 | }, | ||
186 | { | ||
187 | "cell_type": "code", | ||
188 | "execution_count": 183, | ||
189 | "metadata": {}, | ||
190 | "outputs": [ | ||
191 | { | ||
192 | "data": { | ||
193 | "image/png": "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\n", | ||
194 | "text/plain": [ | ||
195 | "<Figure size 360x144 with 1 Axes>" | ||
196 | ] | ||
197 | }, | ||
198 | "metadata": { | ||
199 | "needs_background": "light" | ||
200 | }, | ||
201 | "output_type": "display_data" | ||
202 | } | ||
203 | ], | ||
204 | "source": [ | ||
205 | "# draw node activity\n", | ||
206 | "na_types = []\n", | ||
207 | "labels = []\n", | ||
208 | "for models in model_types:\n", | ||
209 | " na_types.append([model.na for model in models])\n", | ||
210 | "drawBoxDiagram('Node_Activity', rep.na, na_types, calculate_ks, 'top')" | ||
211 | ] | ||
212 | }, | ||
213 | { | ||
214 | "cell_type": "code", | ||
215 | "execution_count": 184, | ||
216 | "metadata": {}, | ||
217 | "outputs": [ | ||
218 | { | ||
219 | "data": { | ||
220 | "image/png": "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\n", | ||
221 | "text/plain": [ | ||
222 | "<Figure size 360x144 with 1 Axes>" | ||
223 | ] | ||
224 | }, | ||
225 | "metadata": { | ||
226 | "needs_background": "light" | ||
227 | }, | ||
228 | "output_type": "display_data" | ||
229 | } | ||
230 | ], | ||
231 | "source": [ | ||
232 | "# draw out degree\n", | ||
233 | "out_d_types = []\n", | ||
234 | "labels = []\n", | ||
235 | "for models in model_types:\n", | ||
236 | " out_d_types.append([model.out_d for model in models])\n", | ||
237 | "drawBoxDiagram('Out_Degree', rep.out_d, out_d_types, calculate_ks, 'top')" | ||
238 | ] | ||
239 | }, | ||
240 | { | ||
241 | "cell_type": "code", | ||
242 | "execution_count": 185, | ||
243 | "metadata": {}, | ||
244 | "outputs": [], | ||
245 | "source": [ | ||
246 | "def manual_ks(pdf1, pdf2):\n", | ||
247 | " result = 0\n", | ||
248 | " sum1 = 0\n", | ||
249 | " sum2 = 0\n", | ||
250 | " for(a, b) in zip(pdf1, pdf2):\n", | ||
251 | " sum1 += a\n", | ||
252 | " sum2 += b\n", | ||
253 | " result = max(result, abs(sum1-sum2))\n", | ||
254 | " return result\n" | ||
255 | ] | ||
256 | }, | ||
257 | { | ||
258 | "cell_type": "code", | ||
259 | "execution_count": 186, | ||
260 | "metadata": {}, | ||
261 | "outputs": [ | ||
262 | { | ||
263 | "name": "stdout", | ||
264 | "output_type": "stream", | ||
265 | "text": [ | ||
266 | "['Commit', 'Issue', 'IssueEvent', 'Project', 'PullRequest', 'User']\n" | ||
267 | ] | ||
268 | }, | ||
269 | { | ||
270 | "data": { | ||
271 | "image/png": "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\n", | ||
272 | "text/plain": [ | ||
273 | "<Figure size 360x144 with 1 Axes>" | ||
274 | ] | ||
275 | }, | ||
276 | "metadata": { | ||
277 | "needs_background": "light" | ||
278 | }, | ||
279 | "output_type": "display_data" | ||
280 | } | ||
281 | ], | ||
282 | "source": [ | ||
283 | "# draw node type\n", | ||
284 | "labels = []\n", | ||
285 | "types = sorted(rep.nodeTypeStat.keys())\n", | ||
286 | "rep_type_dist = [float(rep.nodeTypeStat[key]) for key in types]\n", | ||
287 | "print(types)\n", | ||
288 | "node_type_types = []\n", | ||
289 | "for models in model_types:\n", | ||
290 | " type_dists = []\n", | ||
291 | " for model in models:\n", | ||
292 | " type_dists.append([float(model.nodeTypeStat.get(key, 0)) for key in types])\n", | ||
293 | " node_type_types.append(type_dists)\n", | ||
294 | "\n", | ||
295 | "#since we already know the pdf, we can compute the ks distance manually\n", | ||
296 | "drawBoxDiagram('Node_Type', rep_type_dist, node_type_types, manual_ks, 'top')" | ||
297 | ] | ||
298 | }, | ||
299 | { | ||
300 | "cell_type": "code", | ||
301 | "execution_count": 187, | ||
302 | "metadata": {}, | ||
303 | "outputs": [ | ||
304 | { | ||
305 | "data": { | ||
306 | "image/png": "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\n", | ||
307 | "text/plain": [ | ||
308 | "<Figure size 360x144 with 1 Axes>" | ||
309 | ] | ||
310 | }, | ||
311 | "metadata": { | ||
312 | "needs_background": "light" | ||
313 | }, | ||
314 | "output_type": "display_data" | ||
315 | } | ||
316 | ], | ||
317 | "source": [ | ||
318 | "# draw violations\n", | ||
319 | "violation_types = []\n", | ||
320 | "labels = ['Hum', 'Comb+V', 'Comb-V', 'MPC', 'NA', 'OD', 'NTD', 'VIO']\n", | ||
321 | "for models in model_types:\n", | ||
322 | " violation_types.append([model.violations for model in models])\n", | ||
323 | "drawBoxDiagram('Violations', None, violation_types, lambda a, b:b, 'bottom')" | ||
324 | ] | ||
325 | }, | ||
326 | { | ||
327 | "cell_type": "code", | ||
328 | "execution_count": null, | ||
329 | "metadata": {}, | ||
330 | "outputs": [], | ||
331 | "source": [] | ||
332 | }, | ||
333 | { | ||
334 | "cell_type": "code", | ||
335 | "execution_count": null, | ||
336 | "metadata": {}, | ||
337 | "outputs": [], | ||
338 | "source": [] | ||
339 | } | ||
340 | ], | ||
341 | "metadata": { | ||
342 | "kernelspec": { | ||
343 | "display_name": "Python 3", | ||
344 | "language": "python", | ||
345 | "name": "python3" | ||
346 | }, | ||
347 | "language_info": { | ||
348 | "codemirror_mode": { | ||
349 | "name": "ipython", | ||
350 | "version": 3 | ||
351 | }, | ||
352 | "file_extension": ".py", | ||
353 | "mimetype": "text/x-python", | ||
354 | "name": "python", | ||
355 | "nbconvert_exporter": "python", | ||
356 | "pygments_lexer": "ipython3", | ||
357 | "version": "3.7.3" | ||
358 | } | ||
359 | }, | ||
360 | "nbformat": 4, | ||
361 | "nbformat_minor": 2 | ||
362 | } | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/DistancePlot.ipynb b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/DistancePlot.ipynb new file mode 100644 index 00000000..44842cf4 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/DistancePlot.ipynb | |||
@@ -0,0 +1,199 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "code", | ||
5 | "execution_count": 6, | ||
6 | "metadata": {}, | ||
7 | "outputs": [], | ||
8 | "source": [ | ||
9 | "import os, sys\n", | ||
10 | "lib_path = os.path.abspath(os.path.join('..','..', '..', 'utils'))\n", | ||
11 | "sys.path.append(lib_path)\n", | ||
12 | "import glob\n", | ||
13 | "import matplotlib.pyplot as plt\n", | ||
14 | "from GraphType import GraphCollection\n", | ||
15 | "import DistributionMetrics as metrics\n", | ||
16 | "from GraphType import GraphStat\n", | ||
17 | "import readCSV as reader\n" | ||
18 | ] | ||
19 | }, | ||
20 | { | ||
21 | "cell_type": "code", | ||
22 | "execution_count": 7, | ||
23 | "metadata": {}, | ||
24 | "outputs": [], | ||
25 | "source": [ | ||
26 | "def getModels(folderName, numberOfModels):\n", | ||
27 | " filenames = reader.readmultiplefiles(folderName, numberOfModels, False)\n", | ||
28 | " graphStats = [GraphStat(filename) for filename in filenames]\n", | ||
29 | " return graphStats" | ||
30 | ] | ||
31 | }, | ||
32 | { | ||
33 | "cell_type": "code", | ||
34 | "execution_count": 109, | ||
35 | "metadata": {}, | ||
36 | "outputs": [], | ||
37 | "source": [ | ||
38 | "# read models\n", | ||
39 | "domain = 'ecore'\n", | ||
40 | "rep = getModels('../input/{}/MPC_REP/'.format(domain), 1)[0]\n", | ||
41 | "na_rep = getModels('../input/{}/NA_REP/'.format(domain), 1)[0]\n", | ||
42 | "od_rep = getModels('../input/{}/OUT_DEGREE_REP/'.format(domain), 1)[0]\n", | ||
43 | "rep.na = na_rep.na\n", | ||
44 | "rep.out_d = od_rep.out_d\n", | ||
45 | "\n", | ||
46 | "human_models = getModels('../input/{}/Human/'.format(domain), 304)\n", | ||
47 | "folder = '../output/distances/{}/'.format(domain)\n", | ||
48 | "mkdir(folder)" | ||
49 | ] | ||
50 | }, | ||
51 | { | ||
52 | "cell_type": "code", | ||
53 | "execution_count": 111, | ||
54 | "metadata": {}, | ||
55 | "outputs": [], | ||
56 | "source": [ | ||
57 | "if domain == 'yakindumm':\n", | ||
58 | " rep.nodeTypeStat = {'Entry': 0.04257802080554814, 'Choice': 0.1267671379034409, 'State': 0.1596092291277674, 'Transition': 0.6138636969858629, 'Statechart': 0.010136036276340358, 'Region': 0.04467858095492131, 'Exit': 0.0018338223526273673, 'FinalState': 0.0005334755934915977}\n", | ||
59 | "elif domain == 'ecpre':\n", | ||
60 | " rep.nodeTypeStat = {'EAttribute': 0.23539778449144008, 'EClass': 0.30996978851963747, 'EReference': 0.33081570996978854, 'EPackage': 0.012789526686807653, 'EAnnotation': 0.002517623363544813, 'EEnumLiteral': 0.07275931520644502, 'EEnum': 0.013645518630412891, 'EDataType': 0.004028197381671702, 'EParameter': 0.005941591137965764, 'EGenericType': 0.002014098690835851, 'EOperation': 0.009415911379657605, 'ETypeParameter': 0.0007049345417925478}\n", | ||
61 | "node_types = sorted(rep.nodeTypeStat.keys())" | ||
62 | ] | ||
63 | }, | ||
64 | { | ||
65 | "cell_type": "code", | ||
66 | "execution_count": 112, | ||
67 | "metadata": {}, | ||
68 | "outputs": [], | ||
69 | "source": [ | ||
70 | "def plot_diagram(name, models, rep, metric, distance_metric):\n", | ||
71 | " model_metrics = list(map(metric, models))\n", | ||
72 | " rep = metric(rep)\n", | ||
73 | " distances= list(map(lambda m: distance_metric(m,rep), model_metrics))\n", | ||
74 | " plt.figure()\n", | ||
75 | " plt.title('{} for {}'.format(name, domain))\n", | ||
76 | " plt.hist(distances)\n", | ||
77 | " plt.savefig('{}/{}.png'.format(folder, name), dpi = 500)" | ||
78 | ] | ||
79 | }, | ||
80 | { | ||
81 | "cell_type": "code", | ||
82 | "execution_count": 113, | ||
83 | "metadata": {}, | ||
84 | "outputs": [], | ||
85 | "source": [ | ||
86 | "def mpc(model):\n", | ||
87 | " return model.mpc\n", | ||
88 | "def na(model):\n", | ||
89 | " return model.na\n", | ||
90 | "def od(model):\n", | ||
91 | " return model.out_d\n", | ||
92 | "\n", | ||
93 | "def nt(model):\n", | ||
94 | " nd_dict = model.nodeTypeStat\n", | ||
95 | " dist = []\n", | ||
96 | " for key in node_types:\n", | ||
97 | " dist.append(nd_dict.get(key, 0))\n", | ||
98 | " return dist\n", | ||
99 | "\n", | ||
100 | "def mkdir(path):\n", | ||
101 | " if not os.path.exists(path):\n", | ||
102 | " os.makedirs(path)\n", | ||
103 | "\n", | ||
104 | "def ks_distance(s1, s2):\n", | ||
105 | " value, p = metrics.ks_distance(s1, s2)\n", | ||
106 | " return value" | ||
107 | ] | ||
108 | }, | ||
109 | { | ||
110 | "cell_type": "code", | ||
111 | "execution_count": 114, | ||
112 | "metadata": {}, | ||
113 | "outputs": [ | ||
114 | { | ||
115 | "data": { | ||
116 | "image/png": "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\n", | ||
117 | "text/plain": [ | ||
118 | "<Figure size 432x288 with 1 Axes>" | ||
119 | ] | ||
120 | }, | ||
121 | "metadata": { | ||
122 | "needs_background": "light" | ||
123 | }, | ||
124 | "output_type": "display_data" | ||
125 | }, | ||
126 | { | ||
127 | "data": { | ||
128 | "image/png": "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\n", | ||
129 | "text/plain": [ | ||
130 | "<Figure size 432x288 with 1 Axes>" | ||
131 | ] | ||
132 | }, | ||
133 | "metadata": { | ||
134 | "needs_background": "light" | ||
135 | }, | ||
136 | "output_type": "display_data" | ||
137 | }, | ||
138 | { | ||
139 | "data": { | ||
140 | "image/png": "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\n", | ||
141 | "text/plain": [ | ||
142 | "<Figure size 432x288 with 1 Axes>" | ||
143 | ] | ||
144 | }, | ||
145 | "metadata": { | ||
146 | "needs_background": "light" | ||
147 | }, | ||
148 | "output_type": "display_data" | ||
149 | }, | ||
150 | { | ||
151 | "data": { | ||
152 | "image/png": "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\n", | ||
153 | "text/plain": [ | ||
154 | "<Figure size 432x288 with 1 Axes>" | ||
155 | ] | ||
156 | }, | ||
157 | "metadata": { | ||
158 | "needs_background": "light" | ||
159 | }, | ||
160 | "output_type": "display_data" | ||
161 | } | ||
162 | ], | ||
163 | "source": [ | ||
164 | "plot_diagram('MPC', human_models, rep, mpc, ks_distance)\n", | ||
165 | "plot_diagram('Node_Activity', human_models, rep, na, ks_distance)\n", | ||
166 | "plot_diagram('Out_Degree', human_models, rep, od, ks_distance)\n", | ||
167 | "plot_diagram('Node_Type', human_models, rep, nt, metrics.manual_ks)\n" | ||
168 | ] | ||
169 | }, | ||
170 | { | ||
171 | "cell_type": "code", | ||
172 | "execution_count": null, | ||
173 | "metadata": {}, | ||
174 | "outputs": [], | ||
175 | "source": [] | ||
176 | } | ||
177 | ], | ||
178 | "metadata": { | ||
179 | "kernelspec": { | ||
180 | "display_name": "Python 3", | ||
181 | "language": "python", | ||
182 | "name": "python3" | ||
183 | }, | ||
184 | "language_info": { | ||
185 | "codemirror_mode": { | ||
186 | "name": "ipython", | ||
187 | "version": 3 | ||
188 | }, | ||
189 | "file_extension": ".py", | ||
190 | "mimetype": "text/x-python", | ||
191 | "name": "python", | ||
192 | "nbconvert_exporter": "python", | ||
193 | "pygments_lexer": "ipython3", | ||
194 | "version": "3.7.3" | ||
195 | } | ||
196 | }, | ||
197 | "nbformat": 4, | ||
198 | "nbformat_minor": 2 | ||
199 | } | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/input/.gitignore b/Metrics/Metrics-Calculation/metrics_plot/model comparison/input/.gitignore new file mode 100644 index 00000000..b3934b01 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/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/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/MPC.png new file mode 100644 index 00000000..ae4f5900 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png new file mode 100644 index 00000000..c94b8c2c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node Types.png new file mode 100644 index 00000000..70abdd5b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png new file mode 100644 index 00000000..fe138084 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node_Activity.png new file mode 100644 index 00000000..a8a655f8 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png new file mode 100644 index 00000000..bc83145d --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Out_Degree.png new file mode 100644 index 00000000..ee97529b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png new file mode 100644 index 00000000..0f6e8538 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.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-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png new file mode 100644 index 00000000..b52aa827 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png new file mode 100644 index 00000000..6adb45e2 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png new file mode 100644 index 00000000..e257f381 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png new file mode 100644 index 00000000..2672ee2c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png new file mode 100644 index 00000000..33adbfe9 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png new file mode 100644 index 00000000..d64df78b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png new file mode 100644 index 00000000..eb245365 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png new file mode 100644 index 00000000..2c8f53f6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png new file mode 100644 index 00000000..86b7c3a0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Node Types.png new file mode 100644 index 00000000..81085eab --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Node Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Node Types_lengend.png new file mode 100644 index 00000000..e92f1b26 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Node Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Out_Degree.png new file mode 100644 index 00000000..25b35ee7 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Out_Degree_lengend.png new file mode 100644 index 00000000..d2c660c0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Yakindumm/Human-Alloy-rep-/Out_Degree_lengend.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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..39e1c4ec --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..16ac54dd --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..99ebd383 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..08983af2 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..704ac0f4 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..93ba4a66 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..e0d5b199 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..ddcc2451 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..e0ea1c75 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..430e7279 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..fc15d7f5 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..20499e22 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..601fc7f1 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..76773aa4 --- /dev/null +++ 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/Yakindumm/KS Distance/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 new file mode 100644 index 00000000..2e459f1a --- /dev/null +++ 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/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 new file mode 100644 index 00000000..4f8e97e2 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..7c2b5752 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..3cf659b2 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..50b882da --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..4e9a68d5 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..bfa4b537 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..33176821 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..53c46e6f --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..abf45ff1 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..07c97401 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..f2fb5229 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..d2677e99 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..a375c676 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..d69cd298 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..0584ac99 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..016cc2a3 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..55d32444 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..99cbbae4 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..b8480ae0 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..82268167 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..41bcd510 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..b19bb958 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..cccabc4e --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..947ebdd2 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..0ff4ee89 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..1f9e2e18 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..2c63cc3a --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..8d76fed9 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..daa7929a --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..e56b1b6e --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..8705cee2 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..bdab3741 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..e4269f6e --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..e4b6b527 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..e067ad66 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..9b89e4f9 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..820df5c7 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..b6aa957a --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..161041d9 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..4f189578 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..add3c0f8 --- /dev/null +++ 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/Yakindumm/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 new file mode 100644 index 00000000..f4717a1a --- /dev/null +++ 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/output/ecore/Hum-All-Rand-GS-Real-Med-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/MPC.png new file mode 100644 index 00000000..d184e5bf --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png new file mode 100644 index 00000000..0dea77f2 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Activity.png new file mode 100644 index 00000000..192fe6f0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png new file mode 100644 index 00000000..4db337ef --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Types.png new file mode 100644 index 00000000..2f24cda9 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png new file mode 100644 index 00000000..14dcc501 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Out_Degree.png new file mode 100644 index 00000000..6f40ea4d --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png new file mode 100644 index 00000000..f2e3230b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/ecore/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/MPC.png new file mode 100644 index 00000000..834a91aa --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png new file mode 100644 index 00000000..b3783c77 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Activity.png new file mode 100644 index 00000000..2828f1fd --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png new file mode 100644 index 00000000..4a50e619 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Types.png new file mode 100644 index 00000000..991ff1ff --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png new file mode 100644 index 00000000..d13686c8 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Out_Degree.png new file mode 100644 index 00000000..12b4ce33 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png new file mode 100644 index 00000000..03fe9740 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/github/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-/TCC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-/TCC.png new file mode 100644 index 00000000..31a83155 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-/TCC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-/TCC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-/TCC_lengend.png new file mode 100644 index 00000000..e29f59cb --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-/TCC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Rand-GS-Real-/TCC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Rand-GS-Real-/TCC.png new file mode 100644 index 00000000..a3d56a23 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Rand-GS-Real-/TCC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Rand-GS-Real-/TCC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Rand-GS-Real-/TCC_lengend.png new file mode 100644 index 00000000..58cefaff --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Rand-GS-Real-/TCC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Real-/TCC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Real-/TCC.png new file mode 100644 index 00000000..e9614b89 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Real-/TCC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Real-/TCC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Real-/TCC_lengend.png new file mode 100644 index 00000000..f0cee20a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/test/Hum-Real-/TCC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/MPC.png new file mode 100644 index 00000000..a53bda79 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png new file mode 100644 index 00000000..7a49fb91 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Activity.png new file mode 100644 index 00000000..bf6ca9ba --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png new file mode 100644 index 00000000..d82a124e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Types.png new file mode 100644 index 00000000..0e7b1e46 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png new file mode 100644 index 00000000..7f9e560e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Node_Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Out_Degree.png new file mode 100644 index 00000000..928a0704 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.png new file mode 100644 index 00000000..0059a925 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/yakindu/Hum-All-Rand-GS-Real-Med-/Out_Degree_lengend.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 new file mode 100644 index 00000000..75fe78eb --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py | |||
@@ -0,0 +1,158 @@ | |||
1 | import os, sys | ||
2 | lib_path = os.path.abspath(os.path.join('..', '..', 'utils')) | ||
3 | sys.path.append(lib_path) | ||
4 | import glob | ||
5 | import random | ||
6 | from sklearn.manifold import MDS | ||
7 | import matplotlib.pyplot as plt | ||
8 | from scipy import stats | ||
9 | import numpy as np | ||
10 | from GraphType import GraphCollection | ||
11 | import DistributionMetrics as metrics | ||
12 | |||
13 | def main(): | ||
14 | domain = 'github' | ||
15 | # read models | ||
16 | alloy = GraphCollection('../input/measurement2/{}/Alloy/'.format(domain), 100, 'All') | ||
17 | human = GraphCollection('../input/measurement2/{}/Human/'.format(domain), 304, 'Hum') | ||
18 | base = GraphCollection('../input/measurement2/{}/BaseViatra/'.format(domain), 100, 'GS') | ||
19 | real = GraphCollection('../input/measurement2/{}/RealViatra/'.format(domain), 100, 'Real') | ||
20 | random = GraphCollection('../input/measurement2/{}/Random/'.format(domain), 100, 'Rand') | ||
21 | na_rep = GraphCollection('../input/measurement2/{}/Human/na_rep/'.format(domain), 1, 'Med') | ||
22 | mpc_rep = GraphCollection('../input/measurement2/{}/Human/mpc_rep/'.format(domain), 1, 'Med') | ||
23 | od_rep = GraphCollection('../input/measurement2/{}/Human/od_rep/'.format(domain), 1, 'Med') | ||
24 | |||
25 | # a hack to make the node type as the same as an exiting model | ||
26 | type_rep = GraphCollection('../input/measurement2/{}/Human/od_rep/'.format(domain), 1, 'Med') | ||
27 | if(domain == 'yakindu'): | ||
28 | type_rep.nts = [{'Entry': 0.04257802080554814, 'Choice': 0.1267671379034409, 'State': 0.1596092291277674, 'Transition': 0.6138636969858629, 'Statechart': 0.010136036276340358, 'Region': 0.04467858095492131, 'Exit': 0.0018338223526273673, 'FinalState': 0.0005334755934915977}] | ||
29 | elif (domain == 'ecore'): | ||
30 | type_rep.nts = [{'EAttribute': 0.23539778449144008, 'EClass': 0.30996978851963747, 'EReference': 0.33081570996978854, 'EPackage': 0.012789526686807653, 'EAnnotation': 0.002517623363544813, 'EEnumLiteral': 0.07275931520644502, 'EEnum': 0.013645518630412891, 'EDataType': 0.004028197381671702, 'EParameter': 0.005941591137965764, 'EGenericType': 0.002014098690835851, 'EOperation': 0.009415911379657605, 'ETypeParameter': 0.0007049345417925478}] | ||
31 | elif (domain == 'github'): | ||
32 | type_rep.nts = [{'Project': 0.012636538873420432, 'Commit': 0.5525808524309276, 'User': 0.05847076461769116, 'Issue': 0.12743628185907047, 'PullRequest': 0.07560505461554937, 'IssueEvent': 0.17327050760334123}] | ||
33 | |||
34 | types = sorted(type_rep.nts[0].keys()) | ||
35 | |||
36 | model_collections = [human, alloy, random, base, real] | ||
37 | for model_collection in model_collections: | ||
38 | print(model_collection.name) | ||
39 | length = len(model_collection.violations) | ||
40 | percentage = sum(map(lambda v: int(v==0), model_collection.violations)) / length | ||
41 | print(percentage) | ||
42 | |||
43 | |||
44 | models_to_compare_na = [human, alloy, random, base, real, na_rep] | ||
45 | models_to_compare_mpc = [human, alloy, random, base, real, mpc_rep] | ||
46 | models_to_compare_od = [human, alloy, random, base, real, od_rep] | ||
47 | models_to_compare_nt = [human, alloy, random, base, real, type_rep] | ||
48 | for modelCollection in models_to_compare_nt: | ||
49 | type_dists = [] | ||
50 | for nt in modelCollection.nts: | ||
51 | type_dist = [] | ||
52 | for key in types: | ||
53 | type_dist.append(nt.get(key, 0.0)) | ||
54 | type_dists.append(type_dist) | ||
55 | modelCollection.nts = type_dists | ||
56 | |||
57 | |||
58 | # define output folder | ||
59 | outputFolder = '../output/{}/'.format(domain) | ||
60 | |||
61 | #calculate metrics | ||
62 | metricStat(models_to_compare_na, 'Node_Activity', nodeActivity, 0, outputFolder, calculateKSMatrix) | ||
63 | metricStat(models_to_compare_od, 'Out_Degree', outDegree, 1, outputFolder, calculateKSMatrix) | ||
64 | metricStat(models_to_compare_mpc, 'MPC', mpc, 2, outputFolder, calculateKSMatrix) | ||
65 | metricStat(models_to_compare_nt, 'Node_Types', nodeType, 3, outputFolder, calculateManualKSMatrix) | ||
66 | |||
67 | def calculateKSMatrix(dists): | ||
68 | dist = [] | ||
69 | |||
70 | for i in range(len(dists)): | ||
71 | dist = dist + dists[i] | ||
72 | matrix = np.empty((len(dist),len(dist))) | ||
73 | |||
74 | for i in range(len(dist)): | ||
75 | matrix[i,i] = 0 | ||
76 | for j in range(i+1, len(dist)): | ||
77 | value, p= metrics.ks_distance(dist[i], dist[j]) | ||
78 | matrix[i, j] = value | ||
79 | matrix[j, i] = value | ||
80 | return matrix | ||
81 | |||
82 | def calculateManualKSMatrix(dists): | ||
83 | dist = [] | ||
84 | |||
85 | for i in range(len(dists)): | ||
86 | dist = dist + dists[i] | ||
87 | matrix = np.empty((len(dist),len(dist))) | ||
88 | |||
89 | for i in range(len(dist)): | ||
90 | matrix[i,i] = 0 | ||
91 | for j in range(i+1, len(dist)): | ||
92 | value = metrics.manual_ks(dist[i], dist[j]) | ||
93 | matrix[i, j] = value | ||
94 | matrix[j, i] = value | ||
95 | return matrix | ||
96 | |||
97 | |||
98 | def calculateMDS(dissimilarities): | ||
99 | embedding = MDS(n_components=2, dissimilarity='precomputed') | ||
100 | trans = embedding.fit_transform(X=dissimilarities) | ||
101 | return trans | ||
102 | |||
103 | def plot(graphTypes, coords, title='',index = 0, savePath = ''): | ||
104 | color = ['#377eb8' , '#e41a1c', '#4daf4a', '#984ea3', '#ff7f00', '#ffff33'] | ||
105 | markers = ['o', '+', 'x', '^', 'v', '*'] | ||
106 | fill_styles = ['full', 'full', 'full', 'none', 'none', 'full'] | ||
107 | plt.figure(index, figsize=(5, 2)) | ||
108 | # plt.title(title) | ||
109 | index = 0 | ||
110 | for i in range(len(graphTypes)): | ||
111 | x = (coords[index:index+graphTypes[i].size, 0].tolist()) | ||
112 | y = (coords[index:index+graphTypes[i].size, 1].tolist()) | ||
113 | index += graphTypes[i].size | ||
114 | plt.plot(x, y, color=color[i], marker=markers[i], label = graphTypes[i].name, linestyle='', alpha=0.7, fillstyle = fill_styles[i]) | ||
115 | plt.savefig(fname = savePath+'.png', dpi=500) | ||
116 | plt.legend(loc='upper right') | ||
117 | plt.savefig(fname = savePath+'_lengend.png', dpi=500) | ||
118 | |||
119 | def mkdir_p(mypath): | ||
120 | '''Creates a directory. equivalent to using mkdir -p on the command line''' | ||
121 | |||
122 | from errno import EEXIST | ||
123 | from os import makedirs,path | ||
124 | |||
125 | try: | ||
126 | makedirs(mypath) | ||
127 | except OSError as exc: # Python >2.5 | ||
128 | if exc.errno == EEXIST and path.isdir(mypath): | ||
129 | pass | ||
130 | else: raise | ||
131 | |||
132 | def metricStat(graphTypes, metricName, metric, graphIndex, outputFolder, matrix_calculator): | ||
133 | metrics = [] | ||
134 | for graph in graphTypes: | ||
135 | metrics.append(metric(graph)) | ||
136 | outputFolder = outputFolder + graph.name + '-' | ||
137 | print('calculate' + metricName +' for ' + outputFolder) | ||
138 | mkdir_p(outputFolder) | ||
139 | out_d_coords = calculateMDS(matrix_calculator(metrics)) | ||
140 | plot(graphTypes, out_d_coords, metricName, graphIndex,outputFolder + '/'+ metricName) | ||
141 | |||
142 | def nodeActivity(graphType): | ||
143 | return graphType.nas | ||
144 | |||
145 | def outDegree(graphType): | ||
146 | return graphType.out_ds | ||
147 | |||
148 | def mpc(graphType): | ||
149 | return graphType.mpcs | ||
150 | |||
151 | def nodeType(graphType): | ||
152 | return graphType.nts | ||
153 | |||
154 | def tcc(graphType): | ||
155 | return graphType.tccs | ||
156 | |||
157 | if __name__ == '__main__': | ||
158 | main() \ No newline at end of file | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/input/.gitignore b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/input/.gitignore new file mode 100644 index 00000000..b3934b01 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/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/model_evolve_comparison/output/controled_viatra_all/Node Activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/Node Activity.jpg new file mode 100644 index 00000000..6b987b3e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/Node Activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/mpc.jpg new file mode 100644 index 00000000..ee8d5755 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/out_degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/out_degree.jpg new file mode 100644 index 00000000..25e850fe --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_all/out_degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/Node Activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/Node Activity.jpg new file mode 100644 index 00000000..8b3421b1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/Node Activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/mpc.jpg new file mode 100644 index 00000000..d459f5c8 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/out_degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/out_degree.jpg new file mode 100644 index 00000000..fdaa28e6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_mpc/out_degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/Node Activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/Node Activity.jpg new file mode 100644 index 00000000..08445457 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/Node Activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/mpc.jpg new file mode 100644 index 00000000..74ab2449 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/out_degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/out_degree.jpg new file mode 100644 index 00000000..61c4489e --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_node_activity/out_degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/Node Activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/Node Activity.jpg new file mode 100644 index 00000000..ccbca653 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/Node Activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/mpc.jpg new file mode 100644 index 00000000..31965557 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/out_degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/out_degree.jpg new file mode 100644 index 00000000..d4de5301 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/controled_viatra_with_out_degree/out_degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/mpc.jpg new file mode 100644 index 00000000..ee1d84dc --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/node activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/node activity.jpg new file mode 100644 index 00000000..1a7e8bed --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/node activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/out degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/out degree.jpg new file mode 100644 index 00000000..81d9b709 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf/out degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/Node Activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/Node Activity.jpg new file mode 100644 index 00000000..e26d6cf6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/Node Activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/mpc.jpg new file mode 100644 index 00000000..e1b9a1cf --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/out_degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/out_degree.jpg new file mode 100644 index 00000000..713ed4f4 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_instantiator/out_degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/mpc.jpg new file mode 100644 index 00000000..9c26be81 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/node activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/node activity.jpg new file mode 100644 index 00000000..3cb75479 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/node activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/out degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/out degree.jpg new file mode 100644 index 00000000..0a869df6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/random_emf_normal/out degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/MPC.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/MPC.jpg new file mode 100644 index 00000000..b6e86773 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/MPC.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/node activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/node activity.jpg new file mode 100644 index 00000000..486577a6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/node activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/out degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/out degree.jpg new file mode 100644 index 00000000..4f338049 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_constraints/out degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/Node Activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/Node Activity.jpg new file mode 100644 index 00000000..c1dba220 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/Node Activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/mpc.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/mpc.jpg new file mode 100644 index 00000000..f51449d0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/mpc.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/out_degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/out_degree.jpg new file mode 100644 index 00000000..dff91312 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_control_all_with_consistency/out_degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/MPC.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/MPC.jpg new file mode 100644 index 00000000..2dc66b35 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/MPC.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/node activity.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/node activity.jpg new file mode 100644 index 00000000..847bad62 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/node activity.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/out degree.jpg b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/out degree.jpg new file mode 100644 index 00000000..90ff8006 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/output/viatra_no_constraints/out degree.jpg | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/metrics_distance.ipynb b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/metrics_distance.ipynb new file mode 100644 index 00000000..550e3978 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/metrics_distance.ipynb | |||
@@ -0,0 +1,481 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "markdown", | ||
5 | "metadata": {}, | ||
6 | "source": [ | ||
7 | "# Compare Metrics Distances to The Human Models" | ||
8 | ] | ||
9 | }, | ||
10 | { | ||
11 | "cell_type": "markdown", | ||
12 | "metadata": {}, | ||
13 | "source": [ | ||
14 | "### Imports" | ||
15 | ] | ||
16 | }, | ||
17 | { | ||
18 | "cell_type": "code", | ||
19 | "execution_count": 48, | ||
20 | "metadata": {}, | ||
21 | "outputs": [], | ||
22 | "source": [ | ||
23 | "from GraphType import GraphStat\n", | ||
24 | "from GraphType import GraphCollection\n", | ||
25 | "from scipy import stats\n", | ||
26 | "from ipywidgets import interact, fixed, interactive\n", | ||
27 | "import readCSV as reader\n", | ||
28 | "import ipywidgets as widgets\n", | ||
29 | "import matplotlib.pyplot as plt\n", | ||
30 | "import random\n", | ||
31 | "import numpy as np\n", | ||
32 | "import constants\n" | ||
33 | ] | ||
34 | }, | ||
35 | { | ||
36 | "cell_type": "markdown", | ||
37 | "metadata": {}, | ||
38 | "source": [ | ||
39 | "### Classes" | ||
40 | ] | ||
41 | }, | ||
42 | { | ||
43 | "cell_type": "markdown", | ||
44 | "metadata": {}, | ||
45 | "source": [ | ||
46 | "* Record the average distances of different metrics for a model to the human models " | ||
47 | ] | ||
48 | }, | ||
49 | { | ||
50 | "cell_type": "code", | ||
51 | "execution_count": 49, | ||
52 | "metadata": {}, | ||
53 | "outputs": [], | ||
54 | "source": [ | ||
55 | "class GraphDistance:\n", | ||
56 | " #init with a graph stat and a collection of graph stats\n", | ||
57 | " def __init__(self, graphStat, collection):\n", | ||
58 | " self.graph = graphStat\n", | ||
59 | " self.collection = collection\n", | ||
60 | " self.out_d_distance = average_ks_distance(collection.out_ds, graphStat.out_d)\n", | ||
61 | " self.na_distance = average_ks_distance(collection.nas, graphStat.na)\n", | ||
62 | " self.mpc_distance = average_ks_distance(collection.mpcs, graphStat.mpc)" | ||
63 | ] | ||
64 | }, | ||
65 | { | ||
66 | "cell_type": "markdown", | ||
67 | "metadata": {}, | ||
68 | "source": [ | ||
69 | "### Methods" | ||
70 | ] | ||
71 | }, | ||
72 | { | ||
73 | "cell_type": "markdown", | ||
74 | "metadata": {}, | ||
75 | "source": [ | ||
76 | "* Calculate the average ks distance" | ||
77 | ] | ||
78 | }, | ||
79 | { | ||
80 | "cell_type": "code", | ||
81 | "execution_count": 50, | ||
82 | "metadata": {}, | ||
83 | "outputs": [], | ||
84 | "source": [ | ||
85 | "def average_ks_distance(targets, sample):\n", | ||
86 | " distance = 0.0\n", | ||
87 | " for target in targets:\n", | ||
88 | " value, p = stats.ks_2samp(target, sample)\n", | ||
89 | " distance += value\n", | ||
90 | " distance = distance / len(targets)\n", | ||
91 | " return distance\n" | ||
92 | ] | ||
93 | }, | ||
94 | { | ||
95 | "cell_type": "markdown", | ||
96 | "metadata": { | ||
97 | "pycharm": { | ||
98 | "name": "#%% md\n" | ||
99 | } | ||
100 | }, | ||
101 | "source": [ | ||
102 | "* Find the median ks distance of the same number of nodes" | ||
103 | ] | ||
104 | }, | ||
105 | { | ||
106 | "cell_type": "code", | ||
107 | "execution_count": 51, | ||
108 | "metadata": { | ||
109 | "pycharm": { | ||
110 | "name": "#%%\n" | ||
111 | } | ||
112 | }, | ||
113 | "outputs": [], | ||
114 | "source": [ | ||
115 | "def find_median(x, metric_distances):\n", | ||
116 | " distance_dic = {}\n", | ||
117 | " for index, num_of_nodes in enumerate(x):\n", | ||
118 | " if num_of_nodes[0] not in distance_dic:\n", | ||
119 | " distance_dic[num_of_nodes[0]] = []\n", | ||
120 | " distance_dic[num_of_nodes[0]].append(metric_distances[index])\n", | ||
121 | " median_x = []\n", | ||
122 | " y = []\n", | ||
123 | " for num_of_nodes, distances in distance_dic.items():\n", | ||
124 | " median_x.append(num_of_nodes)\n", | ||
125 | " y.append(np.median(distances))\n", | ||
126 | " order = np.argsort(median_x)\n", | ||
127 | " median_x = np.array(median_x)[order]\n", | ||
128 | " median_y = np.array(y)[order]\n", | ||
129 | " return median_x, median_y\n" | ||
130 | ] | ||
131 | }, | ||
132 | { | ||
133 | "cell_type": "markdown", | ||
134 | "metadata": {}, | ||
135 | "source": [ | ||
136 | "* Plot Diagram" | ||
137 | ] | ||
138 | }, | ||
139 | { | ||
140 | "cell_type": "code", | ||
141 | "execution_count": 52, | ||
142 | "metadata": {}, | ||
143 | "outputs": [], | ||
144 | "source": [ | ||
145 | "# metric_selector: GraphDistance -> float\n", | ||
146 | "def plot(infos, lines, id, metric_selector,colors, title):\n", | ||
147 | " metric_distances = retrive_info_from_list(metric_selector, list(infos.values()))\n", | ||
148 | " x = retrive_info_from_list(lambda a : a.graph.num_nodes, list(infos.values()))\n", | ||
149 | " graph = plt.figure(id,figsize=(18, 10))\n", | ||
150 | " plt.title(title)\n", | ||
151 | " plt.plot(x, metric_distances, color='red', linestyle='', marker='o',alpha=0.7)\n", | ||
152 | " #plot ks distance median\n", | ||
153 | " median_x, median_y = find_median(x, metric_distances)\n", | ||
154 | " plt.plot(median_x, median_y, color='black',marker='o')\n", | ||
155 | " for i in range(0, len(lines)):\n", | ||
156 | " line_infos = retrive_info_from_list(lambda a: infos[a], lines[i])\n", | ||
157 | " line_y = retrive_info_from_list(metric_selector, line_infos)\n", | ||
158 | " line_x = retrive_info_from_list(lambda a : a.graph.num_nodes, line_infos)\n", | ||
159 | " plt.plot(line_x, line_y, marker='o', color=colors[i])\n", | ||
160 | " #graph.show()" | ||
161 | ] | ||
162 | }, | ||
163 | { | ||
164 | "cell_type": "markdown", | ||
165 | "metadata": {}, | ||
166 | "source": [ | ||
167 | "* Retrieve information from a list " | ||
168 | ] | ||
169 | }, | ||
170 | { | ||
171 | "cell_type": "code", | ||
172 | "execution_count": 53, | ||
173 | "metadata": {}, | ||
174 | "outputs": [], | ||
175 | "source": [ | ||
176 | "def retrive_info_from_list(selector, distances):\n", | ||
177 | " return list(map(selector, distances))" | ||
178 | ] | ||
179 | }, | ||
180 | { | ||
181 | "cell_type": "markdown", | ||
182 | "metadata": {}, | ||
183 | "source": [ | ||
184 | "### Read Models" | ||
185 | ] | ||
186 | }, | ||
187 | { | ||
188 | "cell_type": "code", | ||
189 | "execution_count": 54, | ||
190 | "metadata": {}, | ||
191 | "outputs": [], | ||
192 | "source": [ | ||
193 | "human = GraphCollection('../statistics/humanOutput/', 300, 'Human', True)\n", | ||
194 | "file_names = reader.readmultiplefiles('../statistics/viatraEvolve/', 1000, False)" | ||
195 | ] | ||
196 | }, | ||
197 | { | ||
198 | "cell_type": "markdown", | ||
199 | "metadata": {}, | ||
200 | "source": [ | ||
201 | "### Calculate Distances" | ||
202 | ] | ||
203 | }, | ||
204 | { | ||
205 | "cell_type": "code", | ||
206 | "execution_count": 55, | ||
207 | "metadata": {}, | ||
208 | "outputs": [], | ||
209 | "source": [ | ||
210 | "# Progress Widge\n", | ||
211 | "w2 = widgets.FloatProgress(\n", | ||
212 | " value=0,\n", | ||
213 | " min=0,\n", | ||
214 | " max=1.0,\n", | ||
215 | " step=0.1,\n", | ||
216 | " description='Loading Files...:',\n", | ||
217 | " bar_style='info',\n", | ||
218 | " orientation='horizontal'\n", | ||
219 | ")" | ||
220 | ] | ||
221 | }, | ||
222 | { | ||
223 | "cell_type": "code", | ||
224 | "execution_count": 56, | ||
225 | "metadata": {}, | ||
226 | "outputs": [ | ||
227 | { | ||
228 | "data": { | ||
229 | "application/vnd.jupyter.widget-view+json": { | ||
230 | "model_id": "ca7932bce2a741afaff6b919042c42b0", | ||
231 | "version_major": 2, | ||
232 | "version_minor": 0 | ||
233 | }, | ||
234 | "text/plain": [ | ||
235 | "FloatProgress(value=0.0, bar_style='info', description='Loading Files...:', max=1.0)" | ||
236 | ] | ||
237 | }, | ||
238 | "metadata": {}, | ||
239 | "output_type": "display_data" | ||
240 | } | ||
241 | ], | ||
242 | "source": [ | ||
243 | "infos = []\n", | ||
244 | "# read all files\n", | ||
245 | "counter = 0.0\n", | ||
246 | "size = len(file_names)\n", | ||
247 | "#display progress bar\n", | ||
248 | "display(w2)\n", | ||
249 | "for name in file_names:\n", | ||
250 | " infos.append(GraphStat(name))\n", | ||
251 | "\n", | ||
252 | "info_dic = {}\n", | ||
253 | "for info in infos:\n", | ||
254 | " w2.value = (counter/size)\n", | ||
255 | " counter+=1\n", | ||
256 | " info = GraphDistance(info, human)\n", | ||
257 | " info_dic[info.graph.id] = info" | ||
258 | ] | ||
259 | }, | ||
260 | { | ||
261 | "cell_type": "markdown", | ||
262 | "metadata": {}, | ||
263 | "source": [ | ||
264 | "#### Plot Graphs" | ||
265 | ] | ||
266 | }, | ||
267 | { | ||
268 | "cell_type": "markdown", | ||
269 | "metadata": {}, | ||
270 | "source": [ | ||
271 | "* widget for select trajectory" | ||
272 | ] | ||
273 | }, | ||
274 | { | ||
275 | "cell_type": "code", | ||
276 | "execution_count": 57, | ||
277 | "metadata": {}, | ||
278 | "outputs": [], | ||
279 | "source": [ | ||
280 | "filenames = reader.readmultiplefiles('../statistics/trajectories/', 10, False)\n", | ||
281 | "trajectories = {}\n", | ||
282 | "for name in filenames:\n", | ||
283 | " trajectories[name] = reader.readTrajectory(name)\n", | ||
284 | "\n", | ||
285 | "w = widgets.SelectMultiple(\n", | ||
286 | " options = trajectories,\n", | ||
287 | " value = [trajectories[filenames[0]]],\n", | ||
288 | " description='Trajectory:',\n", | ||
289 | " disabled=False,\n", | ||
290 | ")\n", | ||
291 | "\n", | ||
292 | "#generate random color for each line\n", | ||
293 | "colors = []\n", | ||
294 | "\n", | ||
295 | "for i in range(0, len(trajectories)):\n", | ||
296 | " color = \"#%06x\" % random.randint(0, 0xFFFFFF)\n", | ||
297 | " colors.append(color)" | ||
298 | ] | ||
299 | }, | ||
300 | { | ||
301 | "cell_type": "markdown", | ||
302 | "metadata": {}, | ||
303 | "source": [ | ||
304 | "#### Out Degree" | ||
305 | ] | ||
306 | }, | ||
307 | { | ||
308 | "cell_type": "code", | ||
309 | "execution_count": 63, | ||
310 | "metadata": {}, | ||
311 | "outputs": [ | ||
312 | { | ||
313 | "data": { | ||
314 | "application/vnd.jupyter.widget-view+json": { | ||
315 | "model_id": "08da62cb0c3f4e6e9591c7dc811d27cc", | ||
316 | "version_major": 2, | ||
317 | "version_minor": 0 | ||
318 | }, | ||
319 | "text/plain": [ | ||
320 | "interactive(children=(SelectMultiple(description='Trajectory:', index=(1,), options={'../statistics/trajectori…" | ||
321 | ] | ||
322 | }, | ||
323 | "metadata": {}, | ||
324 | "output_type": "display_data" | ||
325 | }, | ||
326 | { | ||
327 | "data": { | ||
328 | "text/plain": [ | ||
329 | "<function __main__.plot_out_degree(lines)>" | ||
330 | ] | ||
331 | }, | ||
332 | "execution_count": 63, | ||
333 | "metadata": {}, | ||
334 | "output_type": "execute_result" | ||
335 | } | ||
336 | ], | ||
337 | "source": [ | ||
338 | "def plot_out_degree(lines):\n", | ||
339 | " plot(info_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out degree')\n", | ||
340 | "interact(plot_out_degree, lines=w)" | ||
341 | ] | ||
342 | }, | ||
343 | { | ||
344 | "cell_type": "markdown", | ||
345 | "metadata": {}, | ||
346 | "source": [ | ||
347 | "#### Node Activity" | ||
348 | ] | ||
349 | }, | ||
350 | { | ||
351 | "cell_type": "code", | ||
352 | "execution_count": 64, | ||
353 | "metadata": { | ||
354 | "scrolled": true | ||
355 | }, | ||
356 | "outputs": [ | ||
357 | { | ||
358 | "data": { | ||
359 | "application/vnd.jupyter.widget-view+json": { | ||
360 | "model_id": "a708f43645a24bd2b15b53ea12c7d88f", | ||
361 | "version_major": 2, | ||
362 | "version_minor": 0 | ||
363 | }, | ||
364 | "text/plain": [ | ||
365 | "interactive(children=(SelectMultiple(description='Trajectory:', index=(1,), options={'../statistics/trajectori…" | ||
366 | ] | ||
367 | }, | ||
368 | "metadata": {}, | ||
369 | "output_type": "display_data" | ||
370 | }, | ||
371 | { | ||
372 | "data": { | ||
373 | "text/plain": [ | ||
374 | "<function __main__.plot_na(lines)>" | ||
375 | ] | ||
376 | }, | ||
377 | "execution_count": 64, | ||
378 | "metadata": {}, | ||
379 | "output_type": "execute_result" | ||
380 | } | ||
381 | ], | ||
382 | "source": [ | ||
383 | "def plot_na(lines):\n", | ||
384 | " plot(info_dic, lines, 0, lambda a: a.na_distance, colors, 'node activity')\n", | ||
385 | "interact(plot_na, lines=w)" | ||
386 | ] | ||
387 | }, | ||
388 | { | ||
389 | "cell_type": "markdown", | ||
390 | "metadata": {}, | ||
391 | "source": [ | ||
392 | "#### MPC" | ||
393 | ] | ||
394 | }, | ||
395 | { | ||
396 | "cell_type": "code", | ||
397 | "execution_count": null, | ||
398 | "metadata": {}, | ||
399 | "outputs": [], | ||
400 | "source": [] | ||
401 | }, | ||
402 | { | ||
403 | "cell_type": "code", | ||
404 | "execution_count": 65, | ||
405 | "metadata": {}, | ||
406 | "outputs": [ | ||
407 | { | ||
408 | "data": { | ||
409 | "application/vnd.jupyter.widget-view+json": { | ||
410 | "model_id": "124a0cb0ebfb4225bf4ced24c09032f7", | ||
411 | "version_major": 2, | ||
412 | "version_minor": 0 | ||
413 | }, | ||
414 | "text/plain": [ | ||
415 | "interactive(children=(SelectMultiple(description='Trajectory:', index=(1,), options={'../statistics/trajectori…" | ||
416 | ] | ||
417 | }, | ||
418 | "metadata": {}, | ||
419 | "output_type": "display_data" | ||
420 | }, | ||
421 | { | ||
422 | "data": { | ||
423 | "text/plain": [ | ||
424 | "<function __main__.plot_out_degree(lines)>" | ||
425 | ] | ||
426 | }, | ||
427 | "execution_count": 65, | ||
428 | "metadata": {}, | ||
429 | "output_type": "execute_result" | ||
430 | } | ||
431 | ], | ||
432 | "source": [ | ||
433 | "def plot_out_degree(lines):\n", | ||
434 | " plot(info_dic, lines, 0, lambda a: a.mpc_distance, colors, 'MPC')\n", | ||
435 | "interact(plot_out_degree, lines=w)" | ||
436 | ] | ||
437 | }, | ||
438 | { | ||
439 | "cell_type": "code", | ||
440 | "execution_count": 19, | ||
441 | "metadata": {}, | ||
442 | "outputs": [], | ||
443 | "source": [ | ||
444 | "for name in file_names:\n", | ||
445 | " contents = reader.readcsvfile(name)\n", | ||
446 | " if(contents['State Id'][0] == 1032396643):\n", | ||
447 | " print(name)" | ||
448 | ] | ||
449 | } | ||
450 | ], | ||
451 | "metadata": { | ||
452 | "kernelspec": { | ||
453 | "display_name": "Python 3", | ||
454 | "language": "python", | ||
455 | "name": "python3" | ||
456 | }, | ||
457 | "language_info": { | ||
458 | "codemirror_mode": { | ||
459 | "name": "ipython", | ||
460 | "version": 3 | ||
461 | }, | ||
462 | "file_extension": ".py", | ||
463 | "mimetype": "text/x-python", | ||
464 | "name": "python", | ||
465 | "nbconvert_exporter": "python", | ||
466 | "pygments_lexer": "ipython3", | ||
467 | "version": "3.7.3" | ||
468 | }, | ||
469 | "pycharm": { | ||
470 | "stem_cell": { | ||
471 | "cell_type": "raw", | ||
472 | "metadata": { | ||
473 | "collapsed": false | ||
474 | }, | ||
475 | "source": [] | ||
476 | } | ||
477 | } | ||
478 | }, | ||
479 | "nbformat": 4, | ||
480 | "nbformat_minor": 2 | ||
481 | } | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/metrics_distance_with_selector.ipynb b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/metrics_distance_with_selector.ipynb new file mode 100644 index 00000000..000822bf --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/metrics_distance_with_selector.ipynb | |||
@@ -0,0 +1,1600 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "markdown", | ||
5 | "metadata": {}, | ||
6 | "source": [ | ||
7 | "# Measuremments with Representative" | ||
8 | ] | ||
9 | }, | ||
10 | { | ||
11 | "cell_type": "markdown", | ||
12 | "metadata": {}, | ||
13 | "source": [ | ||
14 | "### Imports" | ||
15 | ] | ||
16 | }, | ||
17 | { | ||
18 | "cell_type": "code", | ||
19 | "execution_count": 1, | ||
20 | "metadata": {}, | ||
21 | "outputs": [], | ||
22 | "source": [ | ||
23 | "import os, sys\n", | ||
24 | "lib_path = os.path.abspath(os.path.join('..', '..', 'utils'))\n", | ||
25 | "sys.path.append(lib_path)\n", | ||
26 | "from GraphType import GraphStat\n", | ||
27 | "from GraphType import GraphCollection\n", | ||
28 | "from scipy import stats\n", | ||
29 | "from ipywidgets import interact, fixed, interactive\n", | ||
30 | "import readCSV as reader\n", | ||
31 | "import ipywidgets as widgets\n", | ||
32 | "import matplotlib.pyplot as plt\n", | ||
33 | "import random\n", | ||
34 | "import numpy as np\n", | ||
35 | "import constants\n" | ||
36 | ] | ||
37 | }, | ||
38 | { | ||
39 | "cell_type": "markdown", | ||
40 | "metadata": {}, | ||
41 | "source": [ | ||
42 | "### Classes" | ||
43 | ] | ||
44 | }, | ||
45 | { | ||
46 | "cell_type": "markdown", | ||
47 | "metadata": {}, | ||
48 | "source": [ | ||
49 | "* Record the distances of different metrics using a representative" | ||
50 | ] | ||
51 | }, | ||
52 | { | ||
53 | "cell_type": "code", | ||
54 | "execution_count": 2, | ||
55 | "metadata": {}, | ||
56 | "outputs": [], | ||
57 | "source": [ | ||
58 | "class GraphDistanceWithRep:\n", | ||
59 | " #init with a graph stat and a collection of graph stats\n", | ||
60 | " def __init__(self, graphStat, rep):\n", | ||
61 | " self.graph = graphStat\n", | ||
62 | " self.rep = rep\n", | ||
63 | " self.out_d_distance, _ = stats.ks_2samp(graphStat.out_d, rep.out_d)\n", | ||
64 | " self.na_distance,_ = stats.ks_2samp(graphStat.na, rep.na)\n", | ||
65 | " self.mpc_distance,_ = stats.ks_2samp(graphStat.mpc, rep.mpc)\n" | ||
66 | ] | ||
67 | }, | ||
68 | { | ||
69 | "cell_type": "markdown", | ||
70 | "metadata": {}, | ||
71 | "source": [ | ||
72 | "### Methods\n" | ||
73 | ] | ||
74 | }, | ||
75 | { | ||
76 | "cell_type": "markdown", | ||
77 | "metadata": {}, | ||
78 | "source": [ | ||
79 | "* Find the median ks distance of the same number of nodes" | ||
80 | ] | ||
81 | }, | ||
82 | { | ||
83 | "cell_type": "code", | ||
84 | "execution_count": 3, | ||
85 | "metadata": {}, | ||
86 | "outputs": [], | ||
87 | "source": [ | ||
88 | "def find_median(x, metric_distances):\n", | ||
89 | " distance_dic = {}\n", | ||
90 | " for index, num_of_nodes in enumerate(x):\n", | ||
91 | " if num_of_nodes[0] not in distance_dic:\n", | ||
92 | " distance_dic[num_of_nodes[0]] = []\n", | ||
93 | " distance_dic[num_of_nodes[0]].append(metric_distances[index])\n", | ||
94 | " median_x = []\n", | ||
95 | " y = []\n", | ||
96 | " for num_of_nodes, distances in distance_dic.items():\n", | ||
97 | " median_x.append(num_of_nodes)\n", | ||
98 | " y.append(np.median(distances))\n", | ||
99 | " order = np.argsort(median_x)\n", | ||
100 | " median_x = np.array(median_x)[order]\n", | ||
101 | " median_y = np.array(y)[order]\n", | ||
102 | " return median_x, median_y\n" | ||
103 | ] | ||
104 | }, | ||
105 | { | ||
106 | "cell_type": "markdown", | ||
107 | "metadata": {}, | ||
108 | "source": [ | ||
109 | "* Plot Diagram" | ||
110 | ] | ||
111 | }, | ||
112 | { | ||
113 | "cell_type": "code", | ||
114 | "execution_count": 4, | ||
115 | "metadata": {}, | ||
116 | "outputs": [], | ||
117 | "source": [ | ||
118 | "# metric_selector: GraphDistance -> float\n", | ||
119 | "def plot(infos, lines, id, metric_selector,colors, title, foldername):\n", | ||
120 | " metric_distances = retrive_info_from_list(metric_selector, list(infos.values()))\n", | ||
121 | " x = retrive_info_from_list(lambda a : a.graph.num_nodes, list(infos.values()))\n", | ||
122 | " graph = plt.figure(id,figsize=(18, 10))\n", | ||
123 | " plt.title(title)\n", | ||
124 | " plt.plot(x, metric_distances, color='red', linestyle='', marker='o',alpha=0.7)\n", | ||
125 | " #plot ks distance median\n", | ||
126 | " median_x, median_y = find_median(x, metric_distances)\n", | ||
127 | " plt.plot(median_x, median_y, color='black',marker='o')\n", | ||
128 | " for i in range(0, len(lines)):\n", | ||
129 | " line_infos = retrive_info_from_list(lambda a: infos[a], lines[i])\n", | ||
130 | " line_y = retrive_info_from_list(metric_selector, line_infos)\n", | ||
131 | " line_x = retrive_info_from_list(lambda a : a.graph.num_nodes, line_infos)\n", | ||
132 | " plt.plot(line_x, line_y, marker='o', color=colors[i])\n", | ||
133 | " mkdir_p(foldername)\n", | ||
134 | " plt.savefig(fname = foldername+title+'.jpg', dpi=150)\n", | ||
135 | " #graph.show()" | ||
136 | ] | ||
137 | }, | ||
138 | { | ||
139 | "cell_type": "markdown", | ||
140 | "metadata": {}, | ||
141 | "source": [ | ||
142 | "* Retrieve information from a list " | ||
143 | ] | ||
144 | }, | ||
145 | { | ||
146 | "cell_type": "code", | ||
147 | "execution_count": 5, | ||
148 | "metadata": {}, | ||
149 | "outputs": [], | ||
150 | "source": [ | ||
151 | "def retrive_info_from_list(selector, distances):\n", | ||
152 | " return list(map(selector, distances))" | ||
153 | ] | ||
154 | }, | ||
155 | { | ||
156 | "cell_type": "code", | ||
157 | "execution_count": 6, | ||
158 | "metadata": {}, | ||
159 | "outputs": [], | ||
160 | "source": [ | ||
161 | "def readStats(path, numModels):\n", | ||
162 | " names = reader.readmultiplefiles(path, numModels, False)\n", | ||
163 | " stats = []\n", | ||
164 | " for name in names:\n", | ||
165 | " stats.append(GraphStat(name))\n", | ||
166 | " return stats" | ||
167 | ] | ||
168 | }, | ||
169 | { | ||
170 | "cell_type": "code", | ||
171 | "execution_count": 7, | ||
172 | "metadata": {}, | ||
173 | "outputs": [], | ||
174 | "source": [ | ||
175 | "def calDistanceDic(stats, rep):\n", | ||
176 | " dic = {}\n", | ||
177 | " for info in stats:\n", | ||
178 | " info = GraphDistanceWithRep(info, rep)\n", | ||
179 | " dic[info.graph.id] = info\n", | ||
180 | " return dic" | ||
181 | ] | ||
182 | }, | ||
183 | { | ||
184 | "cell_type": "code", | ||
185 | "execution_count": 8, | ||
186 | "metadata": {}, | ||
187 | "outputs": [], | ||
188 | "source": [ | ||
189 | "def createRandomColors(size):\n", | ||
190 | " #generate random color for each line\n", | ||
191 | " colors = []\n", | ||
192 | "\n", | ||
193 | " for i in range(0, size):\n", | ||
194 | " color = \"#%06x\" % random.randint(0, 0xFFFFFF)\n", | ||
195 | " colors.append(color)\n", | ||
196 | " return colors" | ||
197 | ] | ||
198 | }, | ||
199 | { | ||
200 | "cell_type": "code", | ||
201 | "execution_count": 9, | ||
202 | "metadata": {}, | ||
203 | "outputs": [], | ||
204 | "source": [ | ||
205 | "def createSelectionWidge(options):\n", | ||
206 | " w = widgets.SelectMultiple(\n", | ||
207 | " options = options,\n", | ||
208 | " value = [],\n", | ||
209 | " description='Trajectory:',\n", | ||
210 | " disabled=False,\n", | ||
211 | " )\n", | ||
212 | " return w" | ||
213 | ] | ||
214 | }, | ||
215 | { | ||
216 | "cell_type": "code", | ||
217 | "execution_count": 10, | ||
218 | "metadata": {}, | ||
219 | "outputs": [], | ||
220 | "source": [ | ||
221 | "def mkdir_p(mypath):\n", | ||
222 | " '''Creates a directory. equivalent to using mkdir -p on the command line'''\n", | ||
223 | "\n", | ||
224 | " from errno import EEXIST\n", | ||
225 | " from os import makedirs,path\n", | ||
226 | "\n", | ||
227 | " try:\n", | ||
228 | " makedirs(mypath)\n", | ||
229 | " except OSError as exc: # Python >2.5\n", | ||
230 | " if exc.errno == EEXIST and path.isdir(mypath):\n", | ||
231 | " pass\n", | ||
232 | " else: raise" | ||
233 | ] | ||
234 | }, | ||
235 | { | ||
236 | "cell_type": "markdown", | ||
237 | "metadata": {}, | ||
238 | "source": [ | ||
239 | "## Metrics During GenerationPlots" | ||
240 | ] | ||
241 | }, | ||
242 | { | ||
243 | "cell_type": "markdown", | ||
244 | "metadata": {}, | ||
245 | "source": [ | ||
246 | "### Read Human Representatives" | ||
247 | ] | ||
248 | }, | ||
249 | { | ||
250 | "cell_type": "code", | ||
251 | "execution_count": 11, | ||
252 | "metadata": {}, | ||
253 | "outputs": [], | ||
254 | "source": [ | ||
255 | "### Read Models\n", | ||
256 | "#read representative\n", | ||
257 | "human_rep = GraphStat(constants.HUMAN_OUT_D_REP)\n", | ||
258 | "human_na = GraphStat(constants.HUMAN_NA_REP)\n", | ||
259 | "human_mpc = GraphStat(constants.HUMAN_MPC_REP)\n", | ||
260 | "\n", | ||
261 | "# assign rep distributions to human_rep\n", | ||
262 | "human_rep.na = human_na.na\n", | ||
263 | "human_rep.mpc = human_mpc.mpc" | ||
264 | ] | ||
265 | }, | ||
266 | { | ||
267 | "cell_type": "markdown", | ||
268 | "metadata": {}, | ||
269 | "source": [ | ||
270 | "## Viatra No Constraint" | ||
271 | ] | ||
272 | }, | ||
273 | { | ||
274 | "cell_type": "code", | ||
275 | "execution_count": 12, | ||
276 | "metadata": {}, | ||
277 | "outputs": [], | ||
278 | "source": [ | ||
279 | "# Read generated models\n", | ||
280 | "viatra_no_con_stats = readStats('../input/viatra_nocon_output/', 5000)\n", | ||
281 | "viatra_no_con_dic = calDistanceDic(viatra_no_con_stats, human_rep)" | ||
282 | ] | ||
283 | }, | ||
284 | { | ||
285 | "cell_type": "code", | ||
286 | "execution_count": 13, | ||
287 | "metadata": {}, | ||
288 | "outputs": [], | ||
289 | "source": [ | ||
290 | "filenames = reader.readmultiplefiles('../input/viatra_nocon_output/trajectories/', 15, False)\n", | ||
291 | "trajectories = {}\n", | ||
292 | "for name in filenames:\n", | ||
293 | " trajectories[name] = reader.readTrajectory(name)\n", | ||
294 | "w = createSelectionWidge(trajectories)\n", | ||
295 | "colors = createRandomColors(len(trajectories))" | ||
296 | ] | ||
297 | }, | ||
298 | { | ||
299 | "cell_type": "code", | ||
300 | "execution_count": 14, | ||
301 | "metadata": {}, | ||
302 | "outputs": [ | ||
303 | { | ||
304 | "data": { | ||
305 | "application/vnd.jupyter.widget-view+json": { | ||
306 | "model_id": "a8471e4dd66a47ecb6abb2371be43321", | ||
307 | "version_major": 2, | ||
308 | "version_minor": 0 | ||
309 | }, | ||
310 | "text/plain": [ | ||
311 | "interactive(children=(SelectMultiple(description='Trajectory:', options={'../input/viatra_nocon_output/traject…" | ||
312 | ] | ||
313 | }, | ||
314 | "metadata": {}, | ||
315 | "output_type": "display_data" | ||
316 | }, | ||
317 | { | ||
318 | "data": { | ||
319 | "text/plain": [ | ||
320 | "<function __main__.plot_out_degree(lines)>" | ||
321 | ] | ||
322 | }, | ||
323 | "execution_count": 14, | ||
324 | "metadata": {}, | ||
325 | "output_type": "execute_result" | ||
326 | } | ||
327 | ], | ||
328 | "source": [ | ||
329 | "def plot_out_degree(lines):\n", | ||
330 | " plot(viatra_no_con_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out degree', '../output/viatra_no_constraints/')\n", | ||
331 | "interact(plot_out_degree, lines=w)" | ||
332 | ] | ||
333 | }, | ||
334 | { | ||
335 | "cell_type": "code", | ||
336 | "execution_count": 15, | ||
337 | "metadata": {}, | ||
338 | "outputs": [ | ||
339 | { | ||
340 | "data": { | ||
341 | "application/vnd.jupyter.widget-view+json": { | ||
342 | "model_id": "ad6e466cc3fe44d393d2c82d48244d83", | ||
343 | "version_major": 2, | ||
344 | "version_minor": 0 | ||
345 | }, | ||
346 | "text/plain": [ | ||
347 | "interactive(children=(SelectMultiple(description='Trajectory:', options={'../input/viatra_nocon_output/traject…" | ||
348 | ] | ||
349 | }, | ||
350 | "metadata": {}, | ||
351 | "output_type": "display_data" | ||
352 | }, | ||
353 | { | ||
354 | "data": { | ||
355 | "text/plain": [ | ||
356 | "<function __main__.plot_out_na(lines)>" | ||
357 | ] | ||
358 | }, | ||
359 | "execution_count": 15, | ||
360 | "metadata": {}, | ||
361 | "output_type": "execute_result" | ||
362 | } | ||
363 | ], | ||
364 | "source": [ | ||
365 | "def plot_out_na(lines):\n", | ||
366 | " plot(viatra_no_con_dic, lines, 0, lambda a: a.na_distance, colors, 'node activity', '../output/viatra_no_constraints/')\n", | ||
367 | "interact(plot_out_na, lines=w)" | ||
368 | ] | ||
369 | }, | ||
370 | { | ||
371 | "cell_type": "code", | ||
372 | "execution_count": 16, | ||
373 | "metadata": {}, | ||
374 | "outputs": [ | ||
375 | { | ||
376 | "data": { | ||
377 | "application/vnd.jupyter.widget-view+json": { | ||
378 | "model_id": "d88ebc8e4062473a96ac35fe800028ef", | ||
379 | "version_major": 2, | ||
380 | "version_minor": 0 | ||
381 | }, | ||
382 | "text/plain": [ | ||
383 | "interactive(children=(SelectMultiple(description='Trajectory:', options={'../input/viatra_nocon_output/traject…" | ||
384 | ] | ||
385 | }, | ||
386 | "metadata": {}, | ||
387 | "output_type": "display_data" | ||
388 | }, | ||
389 | { | ||
390 | "data": { | ||
391 | "text/plain": [ | ||
392 | "<function __main__.plot_out_mpc(lines)>" | ||
393 | ] | ||
394 | }, | ||
395 | "execution_count": 16, | ||
396 | "metadata": {}, | ||
397 | "output_type": "execute_result" | ||
398 | } | ||
399 | ], | ||
400 | "source": [ | ||
401 | "def plot_out_mpc(lines):\n", | ||
402 | " plot(viatra_no_con_dic, lines, 0, lambda a: a.mpc_distance, colors, 'MPC', '../output/viatra_no_constraints/')\n", | ||
403 | "interact(plot_out_mpc, lines=w)" | ||
404 | ] | ||
405 | }, | ||
406 | { | ||
407 | "cell_type": "markdown", | ||
408 | "metadata": {}, | ||
409 | "source": [ | ||
410 | "## Viatra with constraints" | ||
411 | ] | ||
412 | }, | ||
413 | { | ||
414 | "cell_type": "code", | ||
415 | "execution_count": 17, | ||
416 | "metadata": {}, | ||
417 | "outputs": [], | ||
418 | "source": [ | ||
419 | "viatra_con_stats = readStats('../input/viatra_con_output/',5000)\n", | ||
420 | "viatra_con_dic = calDistanceDic(viatra_con_stats, human_rep)\n", | ||
421 | "\n", | ||
422 | "# trajectories and colors\n", | ||
423 | "trajectories = {}\n", | ||
424 | "w = createSelectionWidge(trajectories)\n", | ||
425 | "colors = createRandomColors(len(trajectories))" | ||
426 | ] | ||
427 | }, | ||
428 | { | ||
429 | "cell_type": "code", | ||
430 | "execution_count": 18, | ||
431 | "metadata": {}, | ||
432 | "outputs": [ | ||
433 | { | ||
434 | "data": { | ||
435 | "application/vnd.jupyter.widget-view+json": { | ||
436 | "model_id": "1eb2ba5848a048389bca8d804fc8340a", | ||
437 | "version_major": 2, | ||
438 | "version_minor": 0 | ||
439 | }, | ||
440 | "text/plain": [ | ||
441 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
442 | ] | ||
443 | }, | ||
444 | "metadata": {}, | ||
445 | "output_type": "display_data" | ||
446 | }, | ||
447 | { | ||
448 | "data": { | ||
449 | "text/plain": [ | ||
450 | "<function __main__.plot_out_degree(lines)>" | ||
451 | ] | ||
452 | }, | ||
453 | "execution_count": 18, | ||
454 | "metadata": {}, | ||
455 | "output_type": "execute_result" | ||
456 | } | ||
457 | ], | ||
458 | "source": [ | ||
459 | "def plot_out_degree(lines):\n", | ||
460 | " plot(viatra_con_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out degree', '../output/viatra_constraints/')\n", | ||
461 | "interact(plot_out_degree, lines=[[]])" | ||
462 | ] | ||
463 | }, | ||
464 | { | ||
465 | "cell_type": "code", | ||
466 | "execution_count": 19, | ||
467 | "metadata": {}, | ||
468 | "outputs": [ | ||
469 | { | ||
470 | "data": { | ||
471 | "application/vnd.jupyter.widget-view+json": { | ||
472 | "model_id": "6e5840f7a5ad4515bce9080088b644f2", | ||
473 | "version_major": 2, | ||
474 | "version_minor": 0 | ||
475 | }, | ||
476 | "text/plain": [ | ||
477 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
478 | ] | ||
479 | }, | ||
480 | "metadata": {}, | ||
481 | "output_type": "display_data" | ||
482 | }, | ||
483 | { | ||
484 | "data": { | ||
485 | "text/plain": [ | ||
486 | "<function __main__.plot_na(lines)>" | ||
487 | ] | ||
488 | }, | ||
489 | "execution_count": 19, | ||
490 | "metadata": {}, | ||
491 | "output_type": "execute_result" | ||
492 | } | ||
493 | ], | ||
494 | "source": [ | ||
495 | "def plot_na(lines):\n", | ||
496 | " plot(viatra_con_dic, lines, 0, lambda a: a.na_distance, colors, 'node activity', '../output/viatra_constraints/')\n", | ||
497 | "interact(plot_na, lines=[[]])" | ||
498 | ] | ||
499 | }, | ||
500 | { | ||
501 | "cell_type": "code", | ||
502 | "execution_count": 20, | ||
503 | "metadata": {}, | ||
504 | "outputs": [ | ||
505 | { | ||
506 | "data": { | ||
507 | "application/vnd.jupyter.widget-view+json": { | ||
508 | "model_id": "9e30f267b092491ba1ffe8f83c5f68ce", | ||
509 | "version_major": 2, | ||
510 | "version_minor": 0 | ||
511 | }, | ||
512 | "text/plain": [ | ||
513 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
514 | ] | ||
515 | }, | ||
516 | "metadata": {}, | ||
517 | "output_type": "display_data" | ||
518 | }, | ||
519 | { | ||
520 | "data": { | ||
521 | "text/plain": [ | ||
522 | "<function __main__.plot_mpc(lines)>" | ||
523 | ] | ||
524 | }, | ||
525 | "execution_count": 20, | ||
526 | "metadata": {}, | ||
527 | "output_type": "execute_result" | ||
528 | } | ||
529 | ], | ||
530 | "source": [ | ||
531 | "def plot_mpc(lines):\n", | ||
532 | " plot(viatra_con_dic, lines, 0, lambda a: a.mpc_distance, colors, 'MPC', '../output/viatra_constraints/')\n", | ||
533 | "interact(plot_mpc, lines=[[]])" | ||
534 | ] | ||
535 | }, | ||
536 | { | ||
537 | "cell_type": "markdown", | ||
538 | "metadata": {}, | ||
539 | "source": [ | ||
540 | "## Controlled RandomEMF" | ||
541 | ] | ||
542 | }, | ||
543 | { | ||
544 | "cell_type": "code", | ||
545 | "execution_count": 21, | ||
546 | "metadata": {}, | ||
547 | "outputs": [], | ||
548 | "source": [ | ||
549 | "random_emf_stats = readStats('../input/random_emf_output/',5000)\n", | ||
550 | "random_emf_dic = calDistanceDic(random_emf_stats, human_rep)\n", | ||
551 | "\n", | ||
552 | "# trajectories and colors\n", | ||
553 | "trajectories = {}\n", | ||
554 | "w = createSelectionWidge(trajectories)\n", | ||
555 | "colors = createRandomColors(len(trajectories))" | ||
556 | ] | ||
557 | }, | ||
558 | { | ||
559 | "cell_type": "code", | ||
560 | "execution_count": 22, | ||
561 | "metadata": {}, | ||
562 | "outputs": [ | ||
563 | { | ||
564 | "data": { | ||
565 | "application/vnd.jupyter.widget-view+json": { | ||
566 | "model_id": "cc1f64c92e814c32a81cd5ec5d4e50dc", | ||
567 | "version_major": 2, | ||
568 | "version_minor": 0 | ||
569 | }, | ||
570 | "text/plain": [ | ||
571 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
572 | ] | ||
573 | }, | ||
574 | "metadata": {}, | ||
575 | "output_type": "display_data" | ||
576 | }, | ||
577 | { | ||
578 | "data": { | ||
579 | "text/plain": [ | ||
580 | "<function __main__.plot_out_degree(lines)>" | ||
581 | ] | ||
582 | }, | ||
583 | "execution_count": 22, | ||
584 | "metadata": {}, | ||
585 | "output_type": "execute_result" | ||
586 | } | ||
587 | ], | ||
588 | "source": [ | ||
589 | "def plot_out_degree(lines):\n", | ||
590 | " plot(random_emf_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out degree', '../output/random_emf/')\n", | ||
591 | "interact(plot_out_degree, lines=[[]])" | ||
592 | ] | ||
593 | }, | ||
594 | { | ||
595 | "cell_type": "code", | ||
596 | "execution_count": 23, | ||
597 | "metadata": {}, | ||
598 | "outputs": [ | ||
599 | { | ||
600 | "data": { | ||
601 | "application/vnd.jupyter.widget-view+json": { | ||
602 | "model_id": "75021f4f68db4a809ce7c86c0d25ef1b", | ||
603 | "version_major": 2, | ||
604 | "version_minor": 0 | ||
605 | }, | ||
606 | "text/plain": [ | ||
607 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
608 | ] | ||
609 | }, | ||
610 | "metadata": {}, | ||
611 | "output_type": "display_data" | ||
612 | }, | ||
613 | { | ||
614 | "data": { | ||
615 | "text/plain": [ | ||
616 | "<function __main__.plot_node_activity(lines)>" | ||
617 | ] | ||
618 | }, | ||
619 | "execution_count": 23, | ||
620 | "metadata": {}, | ||
621 | "output_type": "execute_result" | ||
622 | } | ||
623 | ], | ||
624 | "source": [ | ||
625 | "def plot_node_activity(lines):\n", | ||
626 | " plot(random_emf_dic, lines, 0, lambda a: a.na_distance, colors, 'node activity', '../output/random_emf/')\n", | ||
627 | "interact(plot_node_activity, lines=[[]])" | ||
628 | ] | ||
629 | }, | ||
630 | { | ||
631 | "cell_type": "code", | ||
632 | "execution_count": 24, | ||
633 | "metadata": {}, | ||
634 | "outputs": [ | ||
635 | { | ||
636 | "data": { | ||
637 | "application/vnd.jupyter.widget-view+json": { | ||
638 | "model_id": "86f5c376905a4759a7b44ad52804424d", | ||
639 | "version_major": 2, | ||
640 | "version_minor": 0 | ||
641 | }, | ||
642 | "text/plain": [ | ||
643 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
644 | ] | ||
645 | }, | ||
646 | "metadata": {}, | ||
647 | "output_type": "display_data" | ||
648 | }, | ||
649 | { | ||
650 | "data": { | ||
651 | "text/plain": [ | ||
652 | "<function __main__.plot_mpc(lines)>" | ||
653 | ] | ||
654 | }, | ||
655 | "execution_count": 24, | ||
656 | "metadata": {}, | ||
657 | "output_type": "execute_result" | ||
658 | } | ||
659 | ], | ||
660 | "source": [ | ||
661 | "def plot_mpc(lines):\n", | ||
662 | " plot(random_emf_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/random_emf/')\n", | ||
663 | "interact(plot_mpc, lines=[[]])" | ||
664 | ] | ||
665 | }, | ||
666 | { | ||
667 | "cell_type": "markdown", | ||
668 | "metadata": {}, | ||
669 | "source": [ | ||
670 | "## Controlled Viatra with MPC" | ||
671 | ] | ||
672 | }, | ||
673 | { | ||
674 | "cell_type": "code", | ||
675 | "execution_count": 25, | ||
676 | "metadata": {}, | ||
677 | "outputs": [], | ||
678 | "source": [ | ||
679 | "con_viatra_stats = readStats('../input/controled_viatra_mpc/',5000)\n", | ||
680 | "con_viatra_dic = calDistanceDic(con_viatra_stats, human_rep)\n", | ||
681 | "\n", | ||
682 | "# trajectories and colors\n", | ||
683 | "trajectories = {}\n", | ||
684 | "w = createSelectionWidge(trajectories)\n", | ||
685 | "colors = createRandomColors(len(trajectories))" | ||
686 | ] | ||
687 | }, | ||
688 | { | ||
689 | "cell_type": "code", | ||
690 | "execution_count": 26, | ||
691 | "metadata": {}, | ||
692 | "outputs": [ | ||
693 | { | ||
694 | "data": { | ||
695 | "application/vnd.jupyter.widget-view+json": { | ||
696 | "model_id": "57ba4d8443c145ad845fb862e3ef7519", | ||
697 | "version_major": 2, | ||
698 | "version_minor": 0 | ||
699 | }, | ||
700 | "text/plain": [ | ||
701 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
702 | ] | ||
703 | }, | ||
704 | "metadata": {}, | ||
705 | "output_type": "display_data" | ||
706 | }, | ||
707 | { | ||
708 | "data": { | ||
709 | "text/plain": [ | ||
710 | "<function __main__.plot_out_degree(lines)>" | ||
711 | ] | ||
712 | }, | ||
713 | "execution_count": 26, | ||
714 | "metadata": {}, | ||
715 | "output_type": "execute_result" | ||
716 | } | ||
717 | ], | ||
718 | "source": [ | ||
719 | "def plot_out_degree(lines):\n", | ||
720 | " plot(con_viatra_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out_degree', '../output/controled_viatra_with_mpc/')\n", | ||
721 | "interact(plot_out_degree, lines=w)" | ||
722 | ] | ||
723 | }, | ||
724 | { | ||
725 | "cell_type": "code", | ||
726 | "execution_count": 27, | ||
727 | "metadata": {}, | ||
728 | "outputs": [ | ||
729 | { | ||
730 | "data": { | ||
731 | "application/vnd.jupyter.widget-view+json": { | ||
732 | "model_id": "c020ecb466c14f3ca1bfc0fd2fe03b7b", | ||
733 | "version_major": 2, | ||
734 | "version_minor": 0 | ||
735 | }, | ||
736 | "text/plain": [ | ||
737 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
738 | ] | ||
739 | }, | ||
740 | "metadata": {}, | ||
741 | "output_type": "display_data" | ||
742 | }, | ||
743 | { | ||
744 | "data": { | ||
745 | "text/plain": [ | ||
746 | "<function __main__.plot_na(lines)>" | ||
747 | ] | ||
748 | }, | ||
749 | "execution_count": 27, | ||
750 | "metadata": {}, | ||
751 | "output_type": "execute_result" | ||
752 | } | ||
753 | ], | ||
754 | "source": [ | ||
755 | "def plot_na(lines):\n", | ||
756 | " plot(con_viatra_dic, lines, 0, lambda a: a.na_distance, colors, 'Node Activity', '../output/controled_viatra_with_mpc/')\n", | ||
757 | "interact(plot_na, lines=w)" | ||
758 | ] | ||
759 | }, | ||
760 | { | ||
761 | "cell_type": "code", | ||
762 | "execution_count": 28, | ||
763 | "metadata": {}, | ||
764 | "outputs": [ | ||
765 | { | ||
766 | "data": { | ||
767 | "application/vnd.jupyter.widget-view+json": { | ||
768 | "model_id": "2165668057fd47ad92459e749ec68bad", | ||
769 | "version_major": 2, | ||
770 | "version_minor": 0 | ||
771 | }, | ||
772 | "text/plain": [ | ||
773 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
774 | ] | ||
775 | }, | ||
776 | "metadata": {}, | ||
777 | "output_type": "display_data" | ||
778 | }, | ||
779 | { | ||
780 | "data": { | ||
781 | "text/plain": [ | ||
782 | "<function __main__.plot_mpc(lines)>" | ||
783 | ] | ||
784 | }, | ||
785 | "execution_count": 28, | ||
786 | "metadata": {}, | ||
787 | "output_type": "execute_result" | ||
788 | } | ||
789 | ], | ||
790 | "source": [ | ||
791 | "def plot_mpc(lines):\n", | ||
792 | " plot(con_viatra_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/controled_viatra_with_mpc/')\n", | ||
793 | "interact(plot_mpc, lines=w)" | ||
794 | ] | ||
795 | }, | ||
796 | { | ||
797 | "cell_type": "markdown", | ||
798 | "metadata": {}, | ||
799 | "source": [ | ||
800 | "## (Pseudo) Random EMF instantiator" | ||
801 | ] | ||
802 | }, | ||
803 | { | ||
804 | "cell_type": "code", | ||
805 | "execution_count": 29, | ||
806 | "metadata": {}, | ||
807 | "outputs": [], | ||
808 | "source": [ | ||
809 | "random_emf_stats = readStats('../input/real_random_output/',5000)\n", | ||
810 | "random_emf_dic = calDistanceDic(random_emf_stats, human_rep)\n", | ||
811 | "\n", | ||
812 | "# trajectories and colors\n", | ||
813 | "trajectories = {}\n", | ||
814 | "w = createSelectionWidge(trajectories)\n", | ||
815 | "colors = createRandomColors(len(trajectories))" | ||
816 | ] | ||
817 | }, | ||
818 | { | ||
819 | "cell_type": "code", | ||
820 | "execution_count": 30, | ||
821 | "metadata": {}, | ||
822 | "outputs": [ | ||
823 | { | ||
824 | "data": { | ||
825 | "application/vnd.jupyter.widget-view+json": { | ||
826 | "model_id": "907d7824033b4dfe980c391db0da63eb", | ||
827 | "version_major": 2, | ||
828 | "version_minor": 0 | ||
829 | }, | ||
830 | "text/plain": [ | ||
831 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
832 | ] | ||
833 | }, | ||
834 | "metadata": {}, | ||
835 | "output_type": "display_data" | ||
836 | }, | ||
837 | { | ||
838 | "data": { | ||
839 | "text/plain": [ | ||
840 | "<function __main__.plot_out_degree(lines)>" | ||
841 | ] | ||
842 | }, | ||
843 | "execution_count": 30, | ||
844 | "metadata": {}, | ||
845 | "output_type": "execute_result" | ||
846 | } | ||
847 | ], | ||
848 | "source": [ | ||
849 | "def plot_out_degree(lines):\n", | ||
850 | " plot(random_emf_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out_degree', '../output/random_emf_instantiator/')\n", | ||
851 | "interact(plot_out_degree, lines=w)" | ||
852 | ] | ||
853 | }, | ||
854 | { | ||
855 | "cell_type": "code", | ||
856 | "execution_count": 31, | ||
857 | "metadata": {}, | ||
858 | "outputs": [ | ||
859 | { | ||
860 | "data": { | ||
861 | "application/vnd.jupyter.widget-view+json": { | ||
862 | "model_id": "08a32c21d0b64217a556715caa8db7b5", | ||
863 | "version_major": 2, | ||
864 | "version_minor": 0 | ||
865 | }, | ||
866 | "text/plain": [ | ||
867 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
868 | ] | ||
869 | }, | ||
870 | "metadata": {}, | ||
871 | "output_type": "display_data" | ||
872 | }, | ||
873 | { | ||
874 | "data": { | ||
875 | "text/plain": [ | ||
876 | "<function __main__.plot_na(lines)>" | ||
877 | ] | ||
878 | }, | ||
879 | "execution_count": 31, | ||
880 | "metadata": {}, | ||
881 | "output_type": "execute_result" | ||
882 | } | ||
883 | ], | ||
884 | "source": [ | ||
885 | "def plot_na(lines):\n", | ||
886 | " plot(random_emf_dic, lines, 0, lambda a: a.na_distance, colors, 'Node Activity', '../output/random_emf_instantiator/')\n", | ||
887 | "interact(plot_na, lines=w)" | ||
888 | ] | ||
889 | }, | ||
890 | { | ||
891 | "cell_type": "code", | ||
892 | "execution_count": 32, | ||
893 | "metadata": {}, | ||
894 | "outputs": [ | ||
895 | { | ||
896 | "data": { | ||
897 | "application/vnd.jupyter.widget-view+json": { | ||
898 | "model_id": "9dad041ff05d46ce969cfacb07c2ba98", | ||
899 | "version_major": 2, | ||
900 | "version_minor": 0 | ||
901 | }, | ||
902 | "text/plain": [ | ||
903 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
904 | ] | ||
905 | }, | ||
906 | "metadata": {}, | ||
907 | "output_type": "display_data" | ||
908 | }, | ||
909 | { | ||
910 | "data": { | ||
911 | "text/plain": [ | ||
912 | "<function __main__.plot_mpc(lines)>" | ||
913 | ] | ||
914 | }, | ||
915 | "execution_count": 32, | ||
916 | "metadata": {}, | ||
917 | "output_type": "execute_result" | ||
918 | } | ||
919 | ], | ||
920 | "source": [ | ||
921 | "def plot_mpc(lines):\n", | ||
922 | " plot(random_emf_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/random_emf_instantiator/')\n", | ||
923 | "interact(plot_mpc, lines=w)" | ||
924 | ] | ||
925 | }, | ||
926 | { | ||
927 | "cell_type": "markdown", | ||
928 | "metadata": {}, | ||
929 | "source": [ | ||
930 | "## Controlled Viatra with Out Degree" | ||
931 | ] | ||
932 | }, | ||
933 | { | ||
934 | "cell_type": "code", | ||
935 | "execution_count": 33, | ||
936 | "metadata": {}, | ||
937 | "outputs": [], | ||
938 | "source": [ | ||
939 | "con_viatra_stats = readStats('../input/controlled_viatra_out_degree/',10000)\n", | ||
940 | "con_viatra_dic = calDistanceDic(con_viatra_stats, human_rep)\n", | ||
941 | "\n", | ||
942 | "# trajectories and colors\n", | ||
943 | "trajectories = {}\n", | ||
944 | "w = createSelectionWidge(trajectories)\n", | ||
945 | "colors = createRandomColors(len(trajectories))" | ||
946 | ] | ||
947 | }, | ||
948 | { | ||
949 | "cell_type": "code", | ||
950 | "execution_count": 34, | ||
951 | "metadata": {}, | ||
952 | "outputs": [ | ||
953 | { | ||
954 | "data": { | ||
955 | "application/vnd.jupyter.widget-view+json": { | ||
956 | "model_id": "cd77560284d9419daec57192a64b75ec", | ||
957 | "version_major": 2, | ||
958 | "version_minor": 0 | ||
959 | }, | ||
960 | "text/plain": [ | ||
961 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
962 | ] | ||
963 | }, | ||
964 | "metadata": {}, | ||
965 | "output_type": "display_data" | ||
966 | }, | ||
967 | { | ||
968 | "data": { | ||
969 | "text/plain": [ | ||
970 | "<function __main__.plot_out_degree(lines)>" | ||
971 | ] | ||
972 | }, | ||
973 | "execution_count": 34, | ||
974 | "metadata": {}, | ||
975 | "output_type": "execute_result" | ||
976 | } | ||
977 | ], | ||
978 | "source": [ | ||
979 | "def plot_out_degree(lines):\n", | ||
980 | " plot(con_viatra_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out_degree', '../output/controled_viatra_with_out_degree/')\n", | ||
981 | "interact(plot_out_degree, lines=w)" | ||
982 | ] | ||
983 | }, | ||
984 | { | ||
985 | "cell_type": "code", | ||
986 | "execution_count": 35, | ||
987 | "metadata": {}, | ||
988 | "outputs": [ | ||
989 | { | ||
990 | "data": { | ||
991 | "application/vnd.jupyter.widget-view+json": { | ||
992 | "model_id": "ab11afebf7674cebae8d7318c661cf3c", | ||
993 | "version_major": 2, | ||
994 | "version_minor": 0 | ||
995 | }, | ||
996 | "text/plain": [ | ||
997 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
998 | ] | ||
999 | }, | ||
1000 | "metadata": {}, | ||
1001 | "output_type": "display_data" | ||
1002 | }, | ||
1003 | { | ||
1004 | "data": { | ||
1005 | "text/plain": [ | ||
1006 | "<function __main__.plot_na(lines)>" | ||
1007 | ] | ||
1008 | }, | ||
1009 | "execution_count": 35, | ||
1010 | "metadata": {}, | ||
1011 | "output_type": "execute_result" | ||
1012 | } | ||
1013 | ], | ||
1014 | "source": [ | ||
1015 | "def plot_na(lines):\n", | ||
1016 | " plot(con_viatra_dic, lines, 0, lambda a: a.na_distance, colors, 'Node Activity', '../output/controled_viatra_with_out_degree/')\n", | ||
1017 | "interact(plot_na, lines=w)" | ||
1018 | ] | ||
1019 | }, | ||
1020 | { | ||
1021 | "cell_type": "code", | ||
1022 | "execution_count": 36, | ||
1023 | "metadata": { | ||
1024 | "scrolled": false | ||
1025 | }, | ||
1026 | "outputs": [ | ||
1027 | { | ||
1028 | "data": { | ||
1029 | "application/vnd.jupyter.widget-view+json": { | ||
1030 | "model_id": "c20b42abcba646c18d7caa6eeb54c403", | ||
1031 | "version_major": 2, | ||
1032 | "version_minor": 0 | ||
1033 | }, | ||
1034 | "text/plain": [ | ||
1035 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1036 | ] | ||
1037 | }, | ||
1038 | "metadata": {}, | ||
1039 | "output_type": "display_data" | ||
1040 | }, | ||
1041 | { | ||
1042 | "data": { | ||
1043 | "text/plain": [ | ||
1044 | "<function __main__.plot_mpc(lines)>" | ||
1045 | ] | ||
1046 | }, | ||
1047 | "execution_count": 36, | ||
1048 | "metadata": {}, | ||
1049 | "output_type": "execute_result" | ||
1050 | } | ||
1051 | ], | ||
1052 | "source": [ | ||
1053 | "def plot_mpc(lines):\n", | ||
1054 | " plot(con_viatra_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/controled_viatra_with_out_degree/')\n", | ||
1055 | "interact(plot_mpc, lines=w)" | ||
1056 | ] | ||
1057 | }, | ||
1058 | { | ||
1059 | "cell_type": "markdown", | ||
1060 | "metadata": {}, | ||
1061 | "source": [ | ||
1062 | "## Controlled Viatra with Node Activity" | ||
1063 | ] | ||
1064 | }, | ||
1065 | { | ||
1066 | "cell_type": "code", | ||
1067 | "execution_count": 37, | ||
1068 | "metadata": {}, | ||
1069 | "outputs": [], | ||
1070 | "source": [ | ||
1071 | "con_viatra_stats = readStats('../input/controlled_viatra_out_degree_node_activity/',20000)\n", | ||
1072 | "con_viatra_dic = calDistanceDic(con_viatra_stats, human_rep)\n", | ||
1073 | "\n", | ||
1074 | "# trajectories and colors\n", | ||
1075 | "trajectories = {}\n", | ||
1076 | "w = createSelectionWidge(trajectories)\n", | ||
1077 | "colors = createRandomColors(len(trajectories))" | ||
1078 | ] | ||
1079 | }, | ||
1080 | { | ||
1081 | "cell_type": "code", | ||
1082 | "execution_count": 38, | ||
1083 | "metadata": {}, | ||
1084 | "outputs": [ | ||
1085 | { | ||
1086 | "data": { | ||
1087 | "application/vnd.jupyter.widget-view+json": { | ||
1088 | "model_id": "902b580a11fa4c8db9d03508ad629067", | ||
1089 | "version_major": 2, | ||
1090 | "version_minor": 0 | ||
1091 | }, | ||
1092 | "text/plain": [ | ||
1093 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1094 | ] | ||
1095 | }, | ||
1096 | "metadata": {}, | ||
1097 | "output_type": "display_data" | ||
1098 | }, | ||
1099 | { | ||
1100 | "data": { | ||
1101 | "text/plain": [ | ||
1102 | "<function __main__.plot_out_degree(lines)>" | ||
1103 | ] | ||
1104 | }, | ||
1105 | "execution_count": 38, | ||
1106 | "metadata": {}, | ||
1107 | "output_type": "execute_result" | ||
1108 | } | ||
1109 | ], | ||
1110 | "source": [ | ||
1111 | "def plot_out_degree(lines):\n", | ||
1112 | " plot(con_viatra_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out_degree', '../output/controled_viatra_with_node_activity/')\n", | ||
1113 | "interact(plot_out_degree, lines=w)" | ||
1114 | ] | ||
1115 | }, | ||
1116 | { | ||
1117 | "cell_type": "code", | ||
1118 | "execution_count": 39, | ||
1119 | "metadata": {}, | ||
1120 | "outputs": [ | ||
1121 | { | ||
1122 | "data": { | ||
1123 | "application/vnd.jupyter.widget-view+json": { | ||
1124 | "model_id": "851b567e745940288b577d9bd27e6f08", | ||
1125 | "version_major": 2, | ||
1126 | "version_minor": 0 | ||
1127 | }, | ||
1128 | "text/plain": [ | ||
1129 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1130 | ] | ||
1131 | }, | ||
1132 | "metadata": {}, | ||
1133 | "output_type": "display_data" | ||
1134 | }, | ||
1135 | { | ||
1136 | "data": { | ||
1137 | "text/plain": [ | ||
1138 | "<function __main__.plot_na(lines)>" | ||
1139 | ] | ||
1140 | }, | ||
1141 | "execution_count": 39, | ||
1142 | "metadata": {}, | ||
1143 | "output_type": "execute_result" | ||
1144 | } | ||
1145 | ], | ||
1146 | "source": [ | ||
1147 | "def plot_na(lines):\n", | ||
1148 | " plot(con_viatra_dic, lines, 0, lambda a: a.na_distance, colors, 'Node Activity', '../output/controled_viatra_with_node_activity/')\n", | ||
1149 | "interact(plot_na, lines=w)" | ||
1150 | ] | ||
1151 | }, | ||
1152 | { | ||
1153 | "cell_type": "code", | ||
1154 | "execution_count": 40, | ||
1155 | "metadata": {}, | ||
1156 | "outputs": [ | ||
1157 | { | ||
1158 | "data": { | ||
1159 | "application/vnd.jupyter.widget-view+json": { | ||
1160 | "model_id": "7de173291f394b10b5113e3312b7b2e1", | ||
1161 | "version_major": 2, | ||
1162 | "version_minor": 0 | ||
1163 | }, | ||
1164 | "text/plain": [ | ||
1165 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1166 | ] | ||
1167 | }, | ||
1168 | "metadata": {}, | ||
1169 | "output_type": "display_data" | ||
1170 | }, | ||
1171 | { | ||
1172 | "data": { | ||
1173 | "text/plain": [ | ||
1174 | "<function __main__.plot_mpc(lines)>" | ||
1175 | ] | ||
1176 | }, | ||
1177 | "execution_count": 40, | ||
1178 | "metadata": {}, | ||
1179 | "output_type": "execute_result" | ||
1180 | } | ||
1181 | ], | ||
1182 | "source": [ | ||
1183 | "def plot_mpc(lines):\n", | ||
1184 | " plot(con_viatra_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/controled_viatra_with_node_activity/')\n", | ||
1185 | "interact(plot_mpc, lines=w)" | ||
1186 | ] | ||
1187 | }, | ||
1188 | { | ||
1189 | "cell_type": "markdown", | ||
1190 | "metadata": {}, | ||
1191 | "source": [ | ||
1192 | "# Random EMF With Normal(2,1)" | ||
1193 | ] | ||
1194 | }, | ||
1195 | { | ||
1196 | "cell_type": "code", | ||
1197 | "execution_count": 41, | ||
1198 | "metadata": {}, | ||
1199 | "outputs": [], | ||
1200 | "source": [ | ||
1201 | "random_emf_stats = readStats('../input/random_emf_normal/',6000)\n", | ||
1202 | "random_emf_dic = calDistanceDic(random_emf_stats, human_rep)\n", | ||
1203 | "\n", | ||
1204 | "# trajectories and colors\n", | ||
1205 | "trajectories = {}\n", | ||
1206 | "w = createSelectionWidge(trajectories)\n", | ||
1207 | "colors = createRandomColors(len(trajectories))" | ||
1208 | ] | ||
1209 | }, | ||
1210 | { | ||
1211 | "cell_type": "code", | ||
1212 | "execution_count": 42, | ||
1213 | "metadata": {}, | ||
1214 | "outputs": [ | ||
1215 | { | ||
1216 | "data": { | ||
1217 | "application/vnd.jupyter.widget-view+json": { | ||
1218 | "model_id": "6b9ee873d9ca41649cf05f3b713d9142", | ||
1219 | "version_major": 2, | ||
1220 | "version_minor": 0 | ||
1221 | }, | ||
1222 | "text/plain": [ | ||
1223 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
1224 | ] | ||
1225 | }, | ||
1226 | "metadata": {}, | ||
1227 | "output_type": "display_data" | ||
1228 | }, | ||
1229 | { | ||
1230 | "data": { | ||
1231 | "text/plain": [ | ||
1232 | "<function __main__.plot_out_degree(lines)>" | ||
1233 | ] | ||
1234 | }, | ||
1235 | "execution_count": 42, | ||
1236 | "metadata": {}, | ||
1237 | "output_type": "execute_result" | ||
1238 | } | ||
1239 | ], | ||
1240 | "source": [ | ||
1241 | "def plot_out_degree(lines):\n", | ||
1242 | " plot(random_emf_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out degree', '../output/random_emf_normal/')\n", | ||
1243 | "interact(plot_out_degree, lines=[[]])" | ||
1244 | ] | ||
1245 | }, | ||
1246 | { | ||
1247 | "cell_type": "code", | ||
1248 | "execution_count": 43, | ||
1249 | "metadata": {}, | ||
1250 | "outputs": [ | ||
1251 | { | ||
1252 | "data": { | ||
1253 | "application/vnd.jupyter.widget-view+json": { | ||
1254 | "model_id": "88f258a0b0ac4417aba320beca7508cf", | ||
1255 | "version_major": 2, | ||
1256 | "version_minor": 0 | ||
1257 | }, | ||
1258 | "text/plain": [ | ||
1259 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
1260 | ] | ||
1261 | }, | ||
1262 | "metadata": {}, | ||
1263 | "output_type": "display_data" | ||
1264 | }, | ||
1265 | { | ||
1266 | "data": { | ||
1267 | "text/plain": [ | ||
1268 | "<function __main__.plot_node_activity(lines)>" | ||
1269 | ] | ||
1270 | }, | ||
1271 | "execution_count": 43, | ||
1272 | "metadata": {}, | ||
1273 | "output_type": "execute_result" | ||
1274 | } | ||
1275 | ], | ||
1276 | "source": [ | ||
1277 | "def plot_node_activity(lines):\n", | ||
1278 | " plot(random_emf_dic, lines, 0, lambda a: a.na_distance, colors, 'node activity', '../output/random_emf_normal/')\n", | ||
1279 | "interact(plot_node_activity, lines=[[]])" | ||
1280 | ] | ||
1281 | }, | ||
1282 | { | ||
1283 | "cell_type": "code", | ||
1284 | "execution_count": 44, | ||
1285 | "metadata": {}, | ||
1286 | "outputs": [ | ||
1287 | { | ||
1288 | "data": { | ||
1289 | "application/vnd.jupyter.widget-view+json": { | ||
1290 | "model_id": "d71cf26018184ee6953c50b74908f52d", | ||
1291 | "version_major": 2, | ||
1292 | "version_minor": 0 | ||
1293 | }, | ||
1294 | "text/plain": [ | ||
1295 | "interactive(children=(Dropdown(description='lines', options=([],), value=[]), Output()), _dom_classes=('widget…" | ||
1296 | ] | ||
1297 | }, | ||
1298 | "metadata": {}, | ||
1299 | "output_type": "display_data" | ||
1300 | }, | ||
1301 | { | ||
1302 | "data": { | ||
1303 | "text/plain": [ | ||
1304 | "<function __main__.plot_mpc(lines)>" | ||
1305 | ] | ||
1306 | }, | ||
1307 | "execution_count": 44, | ||
1308 | "metadata": {}, | ||
1309 | "output_type": "execute_result" | ||
1310 | } | ||
1311 | ], | ||
1312 | "source": [ | ||
1313 | "def plot_mpc(lines):\n", | ||
1314 | " plot(random_emf_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/random_emf_normal/')\n", | ||
1315 | "interact(plot_mpc, lines=[[]])" | ||
1316 | ] | ||
1317 | }, | ||
1318 | { | ||
1319 | "cell_type": "code", | ||
1320 | "execution_count": 45, | ||
1321 | "metadata": {}, | ||
1322 | "outputs": [], | ||
1323 | "source": [ | ||
1324 | "con_viatra_stats = readStats('../input/controlled_viatra_all/',20000)\n", | ||
1325 | "con_viatra_dic = calDistanceDic(con_viatra_stats, human_rep)\n", | ||
1326 | "\n", | ||
1327 | "# trajectories and colors\n", | ||
1328 | "trajectories = {}\n", | ||
1329 | "w = createSelectionWidge(trajectories)\n", | ||
1330 | "colors = createRandomColors(len(trajectories))" | ||
1331 | ] | ||
1332 | }, | ||
1333 | { | ||
1334 | "cell_type": "code", | ||
1335 | "execution_count": 46, | ||
1336 | "metadata": {}, | ||
1337 | "outputs": [ | ||
1338 | { | ||
1339 | "data": { | ||
1340 | "application/vnd.jupyter.widget-view+json": { | ||
1341 | "model_id": "db15ac26aad84683b9da99fc54749850", | ||
1342 | "version_major": 2, | ||
1343 | "version_minor": 0 | ||
1344 | }, | ||
1345 | "text/plain": [ | ||
1346 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1347 | ] | ||
1348 | }, | ||
1349 | "metadata": {}, | ||
1350 | "output_type": "display_data" | ||
1351 | }, | ||
1352 | { | ||
1353 | "data": { | ||
1354 | "text/plain": [ | ||
1355 | "<function __main__.plot_out_degree(lines)>" | ||
1356 | ] | ||
1357 | }, | ||
1358 | "execution_count": 46, | ||
1359 | "metadata": {}, | ||
1360 | "output_type": "execute_result" | ||
1361 | } | ||
1362 | ], | ||
1363 | "source": [ | ||
1364 | "def plot_out_degree(lines):\n", | ||
1365 | " plot(con_viatra_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out_degree', '../output/controled_viatra_all/')\n", | ||
1366 | "interact(plot_out_degree, lines=w)" | ||
1367 | ] | ||
1368 | }, | ||
1369 | { | ||
1370 | "cell_type": "code", | ||
1371 | "execution_count": 47, | ||
1372 | "metadata": {}, | ||
1373 | "outputs": [ | ||
1374 | { | ||
1375 | "data": { | ||
1376 | "application/vnd.jupyter.widget-view+json": { | ||
1377 | "model_id": "30bfaf8dd45d4b21b0b43afe5e9fdb8a", | ||
1378 | "version_major": 2, | ||
1379 | "version_minor": 0 | ||
1380 | }, | ||
1381 | "text/plain": [ | ||
1382 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1383 | ] | ||
1384 | }, | ||
1385 | "metadata": {}, | ||
1386 | "output_type": "display_data" | ||
1387 | }, | ||
1388 | { | ||
1389 | "data": { | ||
1390 | "text/plain": [ | ||
1391 | "<function __main__.plot_na(lines)>" | ||
1392 | ] | ||
1393 | }, | ||
1394 | "execution_count": 47, | ||
1395 | "metadata": {}, | ||
1396 | "output_type": "execute_result" | ||
1397 | } | ||
1398 | ], | ||
1399 | "source": [ | ||
1400 | "def plot_na(lines):\n", | ||
1401 | " plot(con_viatra_dic, lines, 0, lambda a: a.na_distance, colors, 'Node Activity', '../output/controled_viatra_all/')\n", | ||
1402 | "interact(plot_na, lines=w)" | ||
1403 | ] | ||
1404 | }, | ||
1405 | { | ||
1406 | "cell_type": "code", | ||
1407 | "execution_count": 48, | ||
1408 | "metadata": {}, | ||
1409 | "outputs": [ | ||
1410 | { | ||
1411 | "data": { | ||
1412 | "application/vnd.jupyter.widget-view+json": { | ||
1413 | "model_id": "5636d37b4416474db5441fe47e7a8a30", | ||
1414 | "version_major": 2, | ||
1415 | "version_minor": 0 | ||
1416 | }, | ||
1417 | "text/plain": [ | ||
1418 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1419 | ] | ||
1420 | }, | ||
1421 | "metadata": {}, | ||
1422 | "output_type": "display_data" | ||
1423 | }, | ||
1424 | { | ||
1425 | "data": { | ||
1426 | "text/plain": [ | ||
1427 | "<function __main__.plot_mpc(lines)>" | ||
1428 | ] | ||
1429 | }, | ||
1430 | "execution_count": 48, | ||
1431 | "metadata": {}, | ||
1432 | "output_type": "execute_result" | ||
1433 | } | ||
1434 | ], | ||
1435 | "source": [ | ||
1436 | "def plot_mpc(lines):\n", | ||
1437 | " plot(con_viatra_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/controled_viatra_all/')\n", | ||
1438 | "interact(plot_mpc, lines=w)" | ||
1439 | ] | ||
1440 | }, | ||
1441 | { | ||
1442 | "cell_type": "markdown", | ||
1443 | "metadata": {}, | ||
1444 | "source": [ | ||
1445 | "### Viatra With Both metric and consistency" | ||
1446 | ] | ||
1447 | }, | ||
1448 | { | ||
1449 | "cell_type": "code", | ||
1450 | "execution_count": 53, | ||
1451 | "metadata": {}, | ||
1452 | "outputs": [], | ||
1453 | "source": [ | ||
1454 | "con_viatra_stats = readStats('../input/viatra_control_all_with_consistency_1/',20000)\n", | ||
1455 | "con_viatra_dic = calDistanceDic(con_viatra_stats, human_rep)\n", | ||
1456 | "\n", | ||
1457 | "# trajectories and colors\n", | ||
1458 | "trajectories = {}\n", | ||
1459 | "w = createSelectionWidge(trajectories)\n", | ||
1460 | "colors = createRandomColors(len(trajectories))" | ||
1461 | ] | ||
1462 | }, | ||
1463 | { | ||
1464 | "cell_type": "code", | ||
1465 | "execution_count": 54, | ||
1466 | "metadata": {}, | ||
1467 | "outputs": [ | ||
1468 | { | ||
1469 | "data": { | ||
1470 | "application/vnd.jupyter.widget-view+json": { | ||
1471 | "model_id": "e5c7231686544d959527cff36c1f1a5e", | ||
1472 | "version_major": 2, | ||
1473 | "version_minor": 0 | ||
1474 | }, | ||
1475 | "text/plain": [ | ||
1476 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1477 | ] | ||
1478 | }, | ||
1479 | "metadata": {}, | ||
1480 | "output_type": "display_data" | ||
1481 | }, | ||
1482 | { | ||
1483 | "data": { | ||
1484 | "text/plain": [ | ||
1485 | "<function __main__.plot_out_degree(lines)>" | ||
1486 | ] | ||
1487 | }, | ||
1488 | "execution_count": 54, | ||
1489 | "metadata": {}, | ||
1490 | "output_type": "execute_result" | ||
1491 | } | ||
1492 | ], | ||
1493 | "source": [ | ||
1494 | "def plot_out_degree(lines):\n", | ||
1495 | " plot(con_viatra_dic, lines, 0, lambda a: a.out_d_distance, colors, 'out_degree', '../output/viatra_control_all_with_consistency_1/')\n", | ||
1496 | "interact(plot_out_degree, lines=w)" | ||
1497 | ] | ||
1498 | }, | ||
1499 | { | ||
1500 | "cell_type": "code", | ||
1501 | "execution_count": 55, | ||
1502 | "metadata": {}, | ||
1503 | "outputs": [ | ||
1504 | { | ||
1505 | "data": { | ||
1506 | "application/vnd.jupyter.widget-view+json": { | ||
1507 | "model_id": "e043705333bb474e89582ea9358c57c3", | ||
1508 | "version_major": 2, | ||
1509 | "version_minor": 0 | ||
1510 | }, | ||
1511 | "text/plain": [ | ||
1512 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1513 | ] | ||
1514 | }, | ||
1515 | "metadata": {}, | ||
1516 | "output_type": "display_data" | ||
1517 | }, | ||
1518 | { | ||
1519 | "data": { | ||
1520 | "text/plain": [ | ||
1521 | "<function __main__.plot_na(lines)>" | ||
1522 | ] | ||
1523 | }, | ||
1524 | "execution_count": 55, | ||
1525 | "metadata": {}, | ||
1526 | "output_type": "execute_result" | ||
1527 | } | ||
1528 | ], | ||
1529 | "source": [ | ||
1530 | "def plot_na(lines):\n", | ||
1531 | " plot(con_viatra_dic, lines, 0, lambda a: a.na_distance, colors, 'Node Activity', '../output/viatra_control_all_with_consistency_1/')\n", | ||
1532 | "interact(plot_na, lines=w)" | ||
1533 | ] | ||
1534 | }, | ||
1535 | { | ||
1536 | "cell_type": "code", | ||
1537 | "execution_count": 56, | ||
1538 | "metadata": {}, | ||
1539 | "outputs": [ | ||
1540 | { | ||
1541 | "data": { | ||
1542 | "application/vnd.jupyter.widget-view+json": { | ||
1543 | "model_id": "ee4723b62293402e87e6a3f798019b36", | ||
1544 | "version_major": 2, | ||
1545 | "version_minor": 0 | ||
1546 | }, | ||
1547 | "text/plain": [ | ||
1548 | "interactive(children=(SelectMultiple(description='Trajectory:', options={}, value=()), Output()), _dom_classes…" | ||
1549 | ] | ||
1550 | }, | ||
1551 | "metadata": {}, | ||
1552 | "output_type": "display_data" | ||
1553 | }, | ||
1554 | { | ||
1555 | "data": { | ||
1556 | "text/plain": [ | ||
1557 | "<function __main__.plot_mpc(lines)>" | ||
1558 | ] | ||
1559 | }, | ||
1560 | "execution_count": 56, | ||
1561 | "metadata": {}, | ||
1562 | "output_type": "execute_result" | ||
1563 | } | ||
1564 | ], | ||
1565 | "source": [ | ||
1566 | "def plot_mpc(lines):\n", | ||
1567 | " plot(con_viatra_dic, lines, 0, lambda a: a.mpc_distance, colors, 'mpc', '../output/viatra_control_all_with_consistency_1/')\n", | ||
1568 | "interact(plot_mpc, lines=w)" | ||
1569 | ] | ||
1570 | }, | ||
1571 | { | ||
1572 | "cell_type": "code", | ||
1573 | "execution_count": null, | ||
1574 | "metadata": {}, | ||
1575 | "outputs": [], | ||
1576 | "source": [] | ||
1577 | } | ||
1578 | ], | ||
1579 | "metadata": { | ||
1580 | "kernelspec": { | ||
1581 | "display_name": "Python 3", | ||
1582 | "language": "python", | ||
1583 | "name": "python3" | ||
1584 | }, | ||
1585 | "language_info": { | ||
1586 | "codemirror_mode": { | ||
1587 | "name": "ipython", | ||
1588 | "version": 3 | ||
1589 | }, | ||
1590 | "file_extension": ".py", | ||
1591 | "mimetype": "text/x-python", | ||
1592 | "name": "python", | ||
1593 | "nbconvert_exporter": "python", | ||
1594 | "pygments_lexer": "ipython3", | ||
1595 | "version": "3.7.3" | ||
1596 | } | ||
1597 | }, | ||
1598 | "nbformat": 4, | ||
1599 | "nbformat_minor": 2 | ||
1600 | } | ||
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 new file mode 100644 index 00000000..32edb00c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb | |||
@@ -0,0 +1,392 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "markdown", | ||
5 | "metadata": {}, | ||
6 | "source": [ | ||
7 | "## Use K-medoid algorithm to find the suitable human model representitives" | ||
8 | ] | ||
9 | }, | ||
10 | { | ||
11 | "cell_type": "markdown", | ||
12 | "metadata": {}, | ||
13 | "source": [ | ||
14 | "### Imports" | ||
15 | ] | ||
16 | }, | ||
17 | { | ||
18 | "cell_type": "code", | ||
19 | "execution_count": 2, | ||
20 | "metadata": {}, | ||
21 | "outputs": [], | ||
22 | "source": [ | ||
23 | "import os, sys\n", | ||
24 | "lib_path = os.path.abspath(os.path.join('..', '..', 'utils'))\n", | ||
25 | "sys.path.append(lib_path)\n", | ||
26 | "from GraphType import GraphStat\n", | ||
27 | "import readCSV as reader\n", | ||
28 | "from scipy import stats\n", | ||
29 | "from ipywidgets import interact, fixed, interactive\n", | ||
30 | "import ipywidgets as widgets\n", | ||
31 | "from pyclustering.cluster.kmedoids import kmedoids\n", | ||
32 | "from pyclustering.utils.metric import distance_metric, type_metric\n", | ||
33 | "import random\n", | ||
34 | "import numpy as np" | ||
35 | ] | ||
36 | }, | ||
37 | { | ||
38 | "cell_type": "markdown", | ||
39 | "metadata": {}, | ||
40 | "source": [ | ||
41 | "### Define a new distance metric" | ||
42 | ] | ||
43 | }, | ||
44 | { | ||
45 | "cell_type": "code", | ||
46 | "execution_count": 3, | ||
47 | "metadata": {}, | ||
48 | "outputs": [], | ||
49 | "source": [ | ||
50 | "def ks_value(dest1, dest2):\n", | ||
51 | " value, p = stats.ks_2samp(dest1, dest2)\n", | ||
52 | " return value\n", | ||
53 | "\n", | ||
54 | "\n", | ||
55 | "ks_metric = distance_metric(type_metric.USER_DEFINED, func=ks_value)" | ||
56 | ] | ||
57 | }, | ||
58 | { | ||
59 | "cell_type": "markdown", | ||
60 | "metadata": {}, | ||
61 | "source": [ | ||
62 | "### Read Human Models" | ||
63 | ] | ||
64 | }, | ||
65 | { | ||
66 | "cell_type": "code", | ||
67 | "execution_count": 4, | ||
68 | "metadata": {}, | ||
69 | "outputs": [ | ||
70 | { | ||
71 | "data": { | ||
72 | "text/plain": [ | ||
73 | "304" | ||
74 | ] | ||
75 | }, | ||
76 | "execution_count": 4, | ||
77 | "metadata": {}, | ||
78 | "output_type": "execute_result" | ||
79 | } | ||
80 | ], | ||
81 | "source": [ | ||
82 | "# Progress Widge\n", | ||
83 | "w = widgets.FloatProgress(\n", | ||
84 | " value=0,\n", | ||
85 | " min=0,\n", | ||
86 | " max=1.0,\n", | ||
87 | " step=0.1,\n", | ||
88 | " description='Loading Files...:',\n", | ||
89 | " bar_style='info',\n", | ||
90 | " orientation='horizontal'\n", | ||
91 | ")\n", | ||
92 | "\n", | ||
93 | "humanFiles = reader.readmultiplefiles('../input/Human/', 1300, False)\n", | ||
94 | "modelToFileName = {}\n", | ||
95 | "for name in humanFiles:\n", | ||
96 | " modelToFileName[GraphStat(name)] = name\n", | ||
97 | "\n", | ||
98 | "models = list(modelToFileName.keys())\n", | ||
99 | "len(humanFiles)" | ||
100 | ] | ||
101 | }, | ||
102 | { | ||
103 | "cell_type": "markdown", | ||
104 | "metadata": {}, | ||
105 | "source": [ | ||
106 | "### Find Representative by K-medroid for different dists on GraphStat" | ||
107 | ] | ||
108 | }, | ||
109 | { | ||
110 | "cell_type": "markdown", | ||
111 | "metadata": {}, | ||
112 | "source": [ | ||
113 | "* Returns the index of the representative" | ||
114 | ] | ||
115 | }, | ||
116 | { | ||
117 | "cell_type": "code", | ||
118 | "execution_count": 5, | ||
119 | "metadata": {}, | ||
120 | "outputs": [], | ||
121 | "source": [ | ||
122 | "def findRep(graphStats, func):\n", | ||
123 | " out_ds = list(map(func, models))\n", | ||
124 | "\n", | ||
125 | " #choose a random starting point\n", | ||
126 | " start_index = random.randint(0, len(out_ds))\n", | ||
127 | "\n", | ||
128 | " # start with one initial metrid [start_index]\n", | ||
129 | " outdegree_kmedoid = kmedoids(out_ds, [start_index], metric=ks_metric)\n", | ||
130 | "\n", | ||
131 | " outdegree_kmedoid.process()\n", | ||
132 | " centoids = outdegree_kmedoid.get_medoids()\n", | ||
133 | " return centoids[0]" | ||
134 | ] | ||
135 | }, | ||
136 | { | ||
137 | "cell_type": "markdown", | ||
138 | "metadata": {}, | ||
139 | "source": [ | ||
140 | "## Find representative for out degree" | ||
141 | ] | ||
142 | }, | ||
143 | { | ||
144 | "cell_type": "markdown", | ||
145 | "metadata": {}, | ||
146 | "source": [ | ||
147 | "### For Yakindumm\n", | ||
148 | "#### For all human models\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", | ||
151 | "\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", | ||
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" | ||
163 | ] | ||
164 | }, | ||
165 | { | ||
166 | "cell_type": "code", | ||
167 | "execution_count": 6, | ||
168 | "metadata": {}, | ||
169 | "outputs": [ | ||
170 | { | ||
171 | "name": "stdout", | ||
172 | "output_type": "stream", | ||
173 | "text": [ | ||
174 | "../input/Human\\33_run_1.csv\n", | ||
175 | "../input/Human\\33_run_1.csv\n" | ||
176 | ] | ||
177 | } | ||
178 | ], | ||
179 | "source": [ | ||
180 | "od_rep_index = findRep(models, lambda m: m.out_d)\n", | ||
181 | "print(list(modelToFileName.values())[od_rep_index])\n", | ||
182 | "od_rep_model = models[od_rep_index]\n", | ||
183 | "print(modelToFileName[od_rep_model])\n" | ||
184 | ] | ||
185 | }, | ||
186 | { | ||
187 | "cell_type": "code", | ||
188 | "execution_count": 7, | ||
189 | "metadata": {}, | ||
190 | "outputs": [ | ||
191 | { | ||
192 | "name": "stdout", | ||
193 | "output_type": "stream", | ||
194 | "text": [ | ||
195 | "average distance: 0.04615092955852465\n", | ||
196 | "median: 0.04402137483980782\n", | ||
197 | "std: 0.017305709419913242\n", | ||
198 | "max: 0.1411706837186424\n", | ||
199 | "min: 0.0\n" | ||
200 | ] | ||
201 | } | ||
202 | ], | ||
203 | "source": [ | ||
204 | "distances = []\n", | ||
205 | "for model in models:\n", | ||
206 | " distances.append(ks_value(od_rep_model.out_d, model.out_d))\n", | ||
207 | "print('average distance: ', np.mean(distances))\n", | ||
208 | "print('median: ', np.median(distances))\n", | ||
209 | "print('std: ', np.std(distances))\n", | ||
210 | "print('max:', max(distances))\n", | ||
211 | "print('min:', min(distances))" | ||
212 | ] | ||
213 | }, | ||
214 | { | ||
215 | "cell_type": "markdown", | ||
216 | "metadata": {}, | ||
217 | "source": [ | ||
218 | "## Find Representative for node activities" | ||
219 | ] | ||
220 | }, | ||
221 | { | ||
222 | "cell_type": "markdown", | ||
223 | "metadata": {}, | ||
224 | "source": [ | ||
225 | "### For Yakindumm\n", | ||
226 | "#### For all human models\n", | ||
227 | "* the rep found is ../input/humanOutput\\R_2016176_run_1.csv\n", | ||
228 | "* the average distance between it and others is 0.05275267434589047\n", | ||
229 | "\n", | ||
230 | "#### For human models with $100 \\pm 10$ nodes\n", | ||
231 | "* the rep found is ../input/human_output_100\\R_2017419_run_1.csv\n", | ||
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" | ||
241 | ] | ||
242 | }, | ||
243 | { | ||
244 | "cell_type": "code", | ||
245 | "execution_count": 8, | ||
246 | "metadata": {}, | ||
247 | "outputs": [ | ||
248 | { | ||
249 | "name": "stdout", | ||
250 | "output_type": "stream", | ||
251 | "text": [ | ||
252 | "../input/Human\\288_run_1.csv\n", | ||
253 | "../input/Human\\288_run_1.csv\n" | ||
254 | ] | ||
255 | } | ||
256 | ], | ||
257 | "source": [ | ||
258 | "na_rep_index = findRep(models, lambda m: m.na)\n", | ||
259 | "print(list(modelToFileName.values())[na_rep_index])\n", | ||
260 | "na_rep_model = models[na_rep_index]\n", | ||
261 | "print(modelToFileName[na_rep_model])\n" | ||
262 | ] | ||
263 | }, | ||
264 | { | ||
265 | "cell_type": "code", | ||
266 | "execution_count": 9, | ||
267 | "metadata": {}, | ||
268 | "outputs": [ | ||
269 | { | ||
270 | "name": "stdout", | ||
271 | "output_type": "stream", | ||
272 | "text": [ | ||
273 | "average distance: 0.046794293118067494\n", | ||
274 | "median: 0.03898868458274401\n", | ||
275 | "std: 0.02880119213919405\n", | ||
276 | "max: 0.18702970297029703\n", | ||
277 | "min: 0.0\n" | ||
278 | ] | ||
279 | } | ||
280 | ], | ||
281 | "source": [ | ||
282 | "distances = []\n", | ||
283 | "for model in models:\n", | ||
284 | " distances.append(ks_value(na_rep_model.na, model.na))\n", | ||
285 | "print('average distance: ', np.mean(distances))\n", | ||
286 | "print('median: ', np.median(distances))\n", | ||
287 | "print('std: ', np.std(distances))\n", | ||
288 | "print('max:', max(distances))\n", | ||
289 | "print('min:', min(distances))" | ||
290 | ] | ||
291 | }, | ||
292 | { | ||
293 | "cell_type": "markdown", | ||
294 | "metadata": {}, | ||
295 | "source": [ | ||
296 | "## Find Representative for MPC" | ||
297 | ] | ||
298 | }, | ||
299 | { | ||
300 | "cell_type": "markdown", | ||
301 | "metadata": {}, | ||
302 | "source": [ | ||
303 | "### For Yakindumm\n", | ||
304 | "\n", | ||
305 | "#### For all human models\n", | ||
306 | "* the rep found is ../input/humanOutput\\R_2015246_run_1.csv\n", | ||
307 | "* the average distance between it and others is 0.08556632702185384\n", | ||
308 | "\n", | ||
309 | "#### For human models with $100 \\pm 10$ nodes\n", | ||
310 | "* the rep found is ../input/human_output_100\\R_2016324_run_1.csv\n", | ||
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" | ||
319 | ] | ||
320 | }, | ||
321 | { | ||
322 | "cell_type": "code", | ||
323 | "execution_count": 10, | ||
324 | "metadata": {}, | ||
325 | "outputs": [ | ||
326 | { | ||
327 | "name": "stdout", | ||
328 | "output_type": "stream", | ||
329 | "text": [ | ||
330 | "../input/Human\\151_run_1.csv\n", | ||
331 | "../input/Human\\151_run_1.csv\n" | ||
332 | ] | ||
333 | } | ||
334 | ], | ||
335 | "source": [ | ||
336 | "mpc_rep_index = findRep(models, lambda m: m.mpc)\n", | ||
337 | "print(list(modelToFileName.values())[mpc_rep_index])\n", | ||
338 | "mpc_rep_model = models[mpc_rep_index]\n", | ||
339 | "print(modelToFileName[mpc_rep_model])" | ||
340 | ] | ||
341 | }, | ||
342 | { | ||
343 | "cell_type": "code", | ||
344 | "execution_count": 11, | ||
345 | "metadata": {}, | ||
346 | "outputs": [ | ||
347 | { | ||
348 | "name": "stdout", | ||
349 | "output_type": "stream", | ||
350 | "text": [ | ||
351 | "average distance: 0.07028909225833632\n", | ||
352 | "median: 0.06254480286738351\n", | ||
353 | "std: 0.037281890512224164\n", | ||
354 | "max: 0.21961550993809065\n", | ||
355 | "min: 0.0\n" | ||
356 | ] | ||
357 | } | ||
358 | ], | ||
359 | "source": [ | ||
360 | "distances = []\n", | ||
361 | "for model in models:\n", | ||
362 | " distances.append(ks_value(mpc_rep_model.mpc, model.mpc))\n", | ||
363 | "print('average distance: ', np.mean(distances))\n", | ||
364 | "print('median: ', np.median(distances))\n", | ||
365 | "print('std: ', np.std(distances))\n", | ||
366 | "print('max:', max(distances))\n", | ||
367 | "print('min:', min(distances))" | ||
368 | ] | ||
369 | } | ||
370 | ], | ||
371 | "metadata": { | ||
372 | "kernelspec": { | ||
373 | "display_name": "Python 3", | ||
374 | "language": "python", | ||
375 | "name": "python3" | ||
376 | }, | ||
377 | "language_info": { | ||
378 | "codemirror_mode": { | ||
379 | "name": "ipython", | ||
380 | "version": 3 | ||
381 | }, | ||
382 | "file_extension": ".py", | ||
383 | "mimetype": "text/x-python", | ||
384 | "name": "python", | ||
385 | "nbconvert_exporter": "python", | ||
386 | "pygments_lexer": "ipython3", | ||
387 | "version": "3.7.3" | ||
388 | } | ||
389 | }, | ||
390 | "nbformat": 4, | ||
391 | "nbformat_minor": 2 | ||
392 | } | ||
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..b4e3432a --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb | |||
@@ -0,0 +1,435 @@ | |||
1 | { | ||
2 | "cells": [ | ||
3 | { | ||
4 | "cell_type": "code", | ||
5 | "execution_count": 2, | ||
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": 3, | ||
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": 4, | ||
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": 4, | ||
56 | "metadata": { | ||
57 | "scrolled": true | ||
58 | }, | ||
59 | "outputs": [ | ||
60 | { | ||
61 | "name": "stdout", | ||
62 | "output_type": "stream", | ||
63 | "text": [ | ||
64 | "['EPackage', 'EAttribute', 'EEnumLiteral', 'EGenericType', 'EAnnotation', 'EOperation', 'EEnum', 'ETypeParameter', 'EParameter', 'EReference', 'EClass', 'EStringToStringMapEntry', 'EDataType']\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": "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\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": "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\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 | "source": [ | ||
225 | "drawTypeDistributions('../input/human/', 1500)" | ||
226 | ] | ||
227 | }, | ||
228 | { | ||
229 | "cell_type": "code", | ||
230 | "execution_count": 5, | ||
231 | "metadata": { | ||
232 | "scrolled": true | ||
233 | }, | ||
234 | "outputs": [ | ||
235 | { | ||
236 | "name": "stdout", | ||
237 | "output_type": "stream", | ||
238 | "text": [ | ||
239 | "[]\n" | ||
240 | ] | ||
241 | } | ||
242 | ], | ||
243 | "source": [ | ||
244 | "drawTypeDistributions('../input/viatra_75/', 50)" | ||
245 | ] | ||
246 | }, | ||
247 | { | ||
248 | "cell_type": "markdown", | ||
249 | "metadata": {}, | ||
250 | "source": [ | ||
251 | "## Extract Human Models with size [90, 101]" | ||
252 | ] | ||
253 | }, | ||
254 | { | ||
255 | "cell_type": "code", | ||
256 | "execution_count": 6, | ||
257 | "metadata": {}, | ||
258 | "outputs": [], | ||
259 | "source": [ | ||
260 | "def extractModel():\n", | ||
261 | " from shutil import copy\n", | ||
262 | " list_of_files = reader.readmultiplefiles('../input/humanOutput/', 5000)\n", | ||
263 | " num_nodes_list =[]\n", | ||
264 | " human_size_dic = {}\n", | ||
265 | " for file in list_of_files:\n", | ||
266 | " contents = reader.readcsvfile(file)\n", | ||
267 | " num_of_node = contents[constants.NUMBER_NODES]\n", | ||
268 | " # human_size_dic[file] = int(num_of_node[0])\n", | ||
269 | " # num_nodes_list.append(int(num_of_node[0]))\n", | ||
270 | " if 90 <= num_of_node[0] <= 110:\n", | ||
271 | " copy(file, '../input/human_output_100/')" | ||
272 | ] | ||
273 | }, | ||
274 | { | ||
275 | "cell_type": "markdown", | ||
276 | "metadata": {}, | ||
277 | "source": [ | ||
278 | "## Multinomial Distribution Analysis" | ||
279 | ] | ||
280 | }, | ||
281 | { | ||
282 | "cell_type": "code", | ||
283 | "execution_count": 7, | ||
284 | "metadata": {}, | ||
285 | "outputs": [ | ||
286 | { | ||
287 | "name": "stdout", | ||
288 | "output_type": "stream", | ||
289 | "text": [ | ||
290 | "0.9999999999999998\n", | ||
291 | "{'EAttribute': 0.23539778449144008, 'EClass': 0.30996978851963747, 'EReference': 0.33081570996978854, 'EPackage': 0.012789526686807653, 'EAnnotation': 0.002517623363544813, 'EEnumLiteral': 0.07275931520644502, 'EEnum': 0.013645518630412891, 'EDataType': 0.004028197381671702, 'EParameter': 0.005941591137965764, 'EGenericType': 0.002014098690835851, 'EOperation': 0.009415911379657605, 'ETypeParameter': 0.0007049345417925478}\n" | ||
292 | ] | ||
293 | } | ||
294 | ], | ||
295 | "source": [ | ||
296 | "import numpy as np\n", | ||
297 | "import scipy.stats as stats\n", | ||
298 | "graphStats = getModels('../input/human_30_500_no_xml/', 1500)\n", | ||
299 | "totalNodes = 0\n", | ||
300 | "typeMap = {}\n", | ||
301 | "for g in graphStats:\n", | ||
302 | " gKeys = g.nodeTypeStat.keys()\n", | ||
303 | " size = g.numNodes[0]\n", | ||
304 | " totalNodes += size\n", | ||
305 | " for key in gKeys:\n", | ||
306 | " curNum = typeMap.get(key, 0)\n", | ||
307 | " typeMap[key] = curNum + float(g.nodeTypeStat[key]) * size\n", | ||
308 | " \n", | ||
309 | "for key in typeMap.keys():\n", | ||
310 | " typeMap[key] /= totalNodes\n", | ||
311 | "print(sum(typeMap.values()))\n", | ||
312 | "print(typeMap)" | ||
313 | ] | ||
314 | }, | ||
315 | { | ||
316 | "cell_type": "code", | ||
317 | "execution_count": 8, | ||
318 | "metadata": {}, | ||
319 | "outputs": [], | ||
320 | "source": [ | ||
321 | "def chiSquareMultinomialTest(freq, prob):\n", | ||
322 | " freq = np.array(freq)\n", | ||
323 | " prob = np.array(prob)\n", | ||
324 | " size = sum(freq)\n", | ||
325 | " e = prob * size\n", | ||
326 | " return stats.chisquare(freq, e)" | ||
327 | ] | ||
328 | }, | ||
329 | { | ||
330 | "cell_type": "code", | ||
331 | "execution_count": 9, | ||
332 | "metadata": {}, | ||
333 | "outputs": [], | ||
334 | "source": [ | ||
335 | "def typeDistributionTest(g):\n", | ||
336 | " size = g.numNodes[0]\n", | ||
337 | " freq = []\n", | ||
338 | " prob = []\n", | ||
339 | " for key in typeMap.keys():\n", | ||
340 | " value = float(g.nodeTypeStat.get(key, 0))\n", | ||
341 | " freq.append(np.round(value * size))\n", | ||
342 | " prob.append(typeMap[key])\n", | ||
343 | " test = chiSquareMultinomialTest(freq, prob)\n", | ||
344 | " return test" | ||
345 | ] | ||
346 | }, | ||
347 | { | ||
348 | "cell_type": "code", | ||
349 | "execution_count": 32, | ||
350 | "metadata": {}, | ||
351 | "outputs": [ | ||
352 | { | ||
353 | "name": "stdout", | ||
354 | "output_type": "stream", | ||
355 | "text": [ | ||
356 | "[7.26359261e+01 6.82490355e-02]\n", | ||
357 | "[3.31848655e+01 1.59841378e-03]\n" | ||
358 | ] | ||
359 | } | ||
360 | ], | ||
361 | "source": [ | ||
362 | "test = [typeDistributionTest(graphStats[i]) for i in range(len(graphStats))]\n", | ||
363 | "print(np.mean(test, 0))\n", | ||
364 | "print(np.median(test, 0))" | ||
365 | ] | ||
366 | }, | ||
367 | { | ||
368 | "cell_type": "markdown", | ||
369 | "metadata": {}, | ||
370 | "source": [ | ||
371 | "## Node Counts Distribution" | ||
372 | ] | ||
373 | }, | ||
374 | { | ||
375 | "cell_type": "code", | ||
376 | "execution_count": 5, | ||
377 | "metadata": {}, | ||
378 | "outputs": [], | ||
379 | "source": [ | ||
380 | "import matplotlib.pyplot as plt\n", | ||
381 | "from shutil import copyfile\n", | ||
382 | "import statistics \n", | ||
383 | "\n", | ||
384 | "graphStats = getModels('../input/human/', 1500)\n", | ||
385 | "sizes = []\n", | ||
386 | "filenames = reader.readmultiplefiles('../input/human/', 1500, False)\n", | ||
387 | "count = 1\n", | ||
388 | "for filename in filenames:\n", | ||
389 | " graphStat = GraphStat(filename)\n", | ||
390 | " size = graphStat.numNodes[0]\n", | ||
391 | " if size >= 30 and size <= 500 and not ('EAnnotation' in graphStat.nodeTypeStat.keys() and 'EStringToStringMapEntry' in graphStat.nodeTypeStat.keys()):\n", | ||
392 | " copyfile(filename, filename.replace('human', 'human_30_500_no_xml'))\n", | ||
393 | " \n", | ||
394 | " \n", | ||
395 | "# for g in graphStats:\n", | ||
396 | "# size = g.numNodes[0]\n", | ||
397 | "# if size >= 30 and size <= 500 and not ('EAnnotation' in g.nodeTypeStat.keys() and 'EStringToStringMapEntry' in g.nodeTypeStat.keys()):\n", | ||
398 | "# sizes.append(g.numNodes[0])\n", | ||
399 | "# print(max(sizes))\n", | ||
400 | "# print(min(sizes))\n", | ||
401 | "# print(statistics.mean(sizes))\n", | ||
402 | "# print(len(sizes))\n", | ||
403 | "# plt.hist(sizes, bins=10)\n" | ||
404 | ] | ||
405 | }, | ||
406 | { | ||
407 | "cell_type": "code", | ||
408 | "execution_count": null, | ||
409 | "metadata": {}, | ||
410 | "outputs": [], | ||
411 | "source": [] | ||
412 | } | ||
413 | ], | ||
414 | "metadata": { | ||
415 | "kernelspec": { | ||
416 | "display_name": "Python 3", | ||
417 | "language": "python", | ||
418 | "name": "python3" | ||
419 | }, | ||
420 | "language_info": { | ||
421 | "codemirror_mode": { | ||
422 | "name": "ipython", | ||
423 | "version": 3 | ||
424 | }, | ||
425 | "file_extension": ".py", | ||
426 | "mimetype": "text/x-python", | ||
427 | "name": "python", | ||
428 | "nbconvert_exporter": "python", | ||
429 | "pygments_lexer": "ipython3", | ||
430 | "version": "3.7.3" | ||
431 | } | ||
432 | }, | ||
433 | "nbformat": 4, | ||
434 | "nbformat_minor": 2 | ||
435 | } | ||
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/DistributionMetrics.py b/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py new file mode 100644 index 00000000..cf532bc5 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py | |||
@@ -0,0 +1,53 @@ | |||
1 | from scipy import stats | ||
2 | from scipy.spatial import distance | ||
3 | |||
4 | def ks_distance(samples1, samples2): | ||
5 | value, p = stats.ks_2samp(samples1, samples2) | ||
6 | return (value, p) | ||
7 | |||
8 | def manual_ks(pdf1, pdf2): | ||
9 | result = 0 | ||
10 | sum1 = 0 | ||
11 | sum2 = 0 | ||
12 | for(a, b) in zip(pdf1, pdf2): | ||
13 | sum1 += a | ||
14 | sum2 += b | ||
15 | result = max(result, abs(sum1-sum2)) | ||
16 | return result | ||
17 | |||
18 | def js_distance(samples1, samples2): | ||
19 | map1 = fromSamples(samples1) | ||
20 | map2 = fromSamples(samples2) | ||
21 | allKeys = set(map1.keys()) | set(map2.keys()) | ||
22 | dist1 = distributionFromMap(map1, allKeys) | ||
23 | dist2 = distributionFromMap(map2, allKeys) | ||
24 | return distance.jensenshannon(dist1, dist2, 2) | ||
25 | |||
26 | def euclidean_distance(samples1, samples2): | ||
27 | map1 = fromSamples(samples1) | ||
28 | map2 = fromSamples(samples2) | ||
29 | allKeys = set(map1.keys()) | set(map2.keys()) | ||
30 | dist1 = distributionFromMap(map1, allKeys) | ||
31 | dist2 = distributionFromMap(map2, allKeys) | ||
32 | distance = 0 | ||
33 | for i in range(len(dist2)): | ||
34 | distance += pow(dist1[i] - dist2[i], 2) | ||
35 | return pow(distance, 0.5) | ||
36 | |||
37 | def fromSamples(samples): | ||
38 | m = {} | ||
39 | length = len(samples) | ||
40 | for sample in samples: | ||
41 | value = m.get(sample, 0) | ||
42 | m[sample] = value + 1 | ||
43 | for key in list(m.keys()): | ||
44 | m[key] /= length | ||
45 | return m | ||
46 | |||
47 | def distributionFromMap(m, allKeys): | ||
48 | dist = [] | ||
49 | for key in allKeys: | ||
50 | value = m.get(key, 0) | ||
51 | dist.append(value) | ||
52 | return dist | ||
53 | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py new file mode 100644 index 00000000..48d96ccc --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py | |||
@@ -0,0 +1,46 @@ | |||
1 | import readCSV as reader | ||
2 | import constants | ||
3 | import numpy as np | ||
4 | |||
5 | # graph stats for a collection of graphs | ||
6 | class GraphCollection: | ||
7 | |||
8 | # init with path contrain files and number of files to read reader is imported from (readCSV) | ||
9 | def __init__(self, path, number, name, shouldShuffle = True): | ||
10 | self.out_ds = [] | ||
11 | self.nas = [] | ||
12 | self.mpcs = [] | ||
13 | self.nts = [] | ||
14 | self.name = name | ||
15 | self.tccs = [] | ||
16 | self.violations = [] | ||
17 | models = reader.readmultiplefiles(path, number, shouldShuffle) | ||
18 | print(len(models)) | ||
19 | self.size = len(models) | ||
20 | for i in range(len(models)): | ||
21 | contents, out_d, na, mpc = reader.getmetrics(models[i]) | ||
22 | self.out_ds.append(out_d) | ||
23 | self.nas.append(na) | ||
24 | self.mpcs.append(mpc) | ||
25 | if(constants.Node_TYPE_KEY in contents): | ||
26 | self.nts.append(contents[constants.Node_TYPE_KEY]) | ||
27 | if(constants.TCC_VALUE in contents): | ||
28 | self.tccs.append(contents[constants.TCC_VALUE]) | ||
29 | if(constants.VIOLATION in contents): | ||
30 | self.violations.append(contents[constants.VIOLATION][0]) | ||
31 | |||
32 | #Graph stat for one graph | ||
33 | class GraphStat: | ||
34 | # init with teh file name of the stat | ||
35 | def __init__(self, filename): | ||
36 | contents, self.out_d, self.na, self.mpc = reader.getmetrics(filename) | ||
37 | self.numNodes = np.array(contents[constants.NUMBER_NODES]) | ||
38 | if constants.STATE_ID in contents: | ||
39 | self.id = (contents[constants.STATE_ID])[0] | ||
40 | if constants.Node_TYPE_KEY in contents: | ||
41 | self.nodeTypeStat = contents[constants.Node_TYPE_KEY] | ||
42 | if constants.VIOLATION in contents: | ||
43 | self.violations = int(contents[constants.VIOLATION][0]) | ||
44 | if(constants.TCC_VALUE_KEY in contents): | ||
45 | self.tcc = contents[constants.TCC_VALUE_KEY] | ||
46 | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py b/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py new file mode 100644 index 00000000..e30cc583 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py | |||
@@ -0,0 +1,35 @@ | |||
1 | NUMBER_EDGE_TYPES = 'Number of Edge types' | ||
2 | |||
3 | NUMBER_NODES = 'Number Of Nodes' | ||
4 | |||
5 | OUT_DEGREE_COUNT = 'OutDegreeCount' | ||
6 | |||
7 | OUT_DEGREE_VALUE = 'OutDegreeValue' | ||
8 | |||
9 | NA_COUNT = 'NACount' | ||
10 | |||
11 | NA_VALUE = 'NAValue' | ||
12 | |||
13 | MPC_VALUE = 'MPCValue' | ||
14 | |||
15 | MPC_COUNT = 'MPCCount' | ||
16 | |||
17 | METAMODEL = 'Meta Mode' | ||
18 | |||
19 | STATE_ID = 'State Id' | ||
20 | |||
21 | NODE_TYPE = 'Node Type' | ||
22 | |||
23 | Node_TYPE_KEY = 'NodeType' | ||
24 | |||
25 | HUMAN_OUT_D_REP = '../input/humanOutput/R_2015225_run_1.csv' | ||
26 | |||
27 | HUMAN_MPC_REP = '../input/humanOutput/R_2016324_run_1.csv' | ||
28 | |||
29 | HUMAN_NA_REP = '../input/humanOutput/R_2017419_run_1.csv' | ||
30 | |||
31 | VIOLATION = 'violations' | ||
32 | |||
33 | TCC_VALUE= 'TCCValue' | ||
34 | |||
35 | TCC_COUNT = 'TCCCount' | ||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py b/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py new file mode 100644 index 00000000..a56caf45 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py | |||
@@ -0,0 +1,186 @@ | |||
1 | import numpy as np | ||
2 | import matplotlib.pyplot as plt | ||
3 | from scipy import stats | ||
4 | import glob | ||
5 | import random | ||
6 | import constants | ||
7 | |||
8 | # | ||
9 | # read csvfile returns outdegree, node activity, mpc | ||
10 | # as matrix with the first row of values and second row of count | ||
11 | # | ||
12 | def readcsvfile(filename): | ||
13 | |||
14 | contents = {} | ||
15 | with open(filename) as f: | ||
16 | data = list(f) | ||
17 | f.close() | ||
18 | for i, line in enumerate(data): | ||
19 | arr = line.replace('\n', '').split(',') | ||
20 | # if there is no element in the line, continue | ||
21 | if len(line) < 0: continue | ||
22 | # else check for contents | ||
23 | # if it is MPC then use float | ||
24 | if arr[0] == constants.MPC_VALUE: | ||
25 | contents[constants.MPC_VALUE] = list(map(float, arr[1:])) | ||
26 | # meta models are string | ||
27 | elif(arr[0] == constants.METAMODEL): | ||
28 | contents[constants.METAMODEL] = arr[1:] | ||
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 | #convert number to floats | ||
34 | numbers = [float(n) for n in numbers] | ||
35 | contents[constants.Node_TYPE_KEY] = {t : n for t, n in zip(types, numbers)} | ||
36 | elif(arr[0] == constants.TCC_VALUE): | ||
37 | contents[constants.TCC_VALUE] = list(map(float, arr[1:])) | ||
38 | # NA and OD are integers, and store other information as string | ||
39 | else: | ||
40 | try: | ||
41 | contents[arr[0]] = list(map(int, arr[1:])) | ||
42 | except: | ||
43 | contents[arr[0]] = arr[1:] | ||
44 | return contents | ||
45 | |||
46 | def checkAndReshape(arr): | ||
47 | if len(arr.shape) < 2: | ||
48 | arr = np.reshape(arr, (arr.shape[0],1)) | ||
49 | return arr | ||
50 | |||
51 | def readTrajectory(filename): | ||
52 | state_codes = [] | ||
53 | with open(filename) as f: | ||
54 | for i, line in enumerate(f): | ||
55 | if(line == ''): continue | ||
56 | state_codes.append(int(line)) | ||
57 | return state_codes | ||
58 | # | ||
59 | # take a matrix as input | ||
60 | # return the sample array | ||
61 | # | ||
62 | def getsample(dataMatrix): | ||
63 | data = [] | ||
64 | value = dataMatrix[0, :] | ||
65 | count = dataMatrix[1, :] | ||
66 | for i, v in enumerate(value): | ||
67 | for x in range(0, int(count[i])): | ||
68 | data.append(v) | ||
69 | return data | ||
70 | |||
71 | def reproduceSample(values, counts): | ||
72 | arr = np.array([values, counts]) | ||
73 | return getsample(arr) | ||
74 | |||
75 | # | ||
76 | # take an array of filenames as input | ||
77 | # return the samples of outdegree, na, mpc | ||
78 | # | ||
79 | def getmetrics(filename): | ||
80 | contents = readcsvfile(filename) | ||
81 | outdegree_sample = reproduceSample(contents[constants.OUT_DEGREE_VALUE], contents[constants.OUT_DEGREE_COUNT]) | ||
82 | na_sample = reproduceSample(contents[constants.NA_VALUE], contents[constants.NA_COUNT]) | ||
83 | mpc_sample = reproduceSample(contents[constants.MPC_VALUE], contents[constants.MPC_COUNT]) | ||
84 | |||
85 | if(constants.TCC_VALUE in contents): | ||
86 | contents[constants.TCC_VALUE] = reproduceSample(contents[constants.TCC_VALUE], contents[constants.TCC_COUNT]) | ||
87 | |||
88 | return contents,outdegree_sample, na_sample, mpc_sample | ||
89 | |||
90 | # | ||
91 | # read number of files in the given path RANDOMLY | ||
92 | # | ||
93 | def readmultiplefiles(dirName, maxNumberOfFiles, shouldShuffle = True): | ||
94 | list_of_files = glob.glob(dirName + '*.csv') # create the list of file | ||
95 | if shouldShuffle: | ||
96 | random.shuffle(list_of_files) | ||
97 | #if the number of files is out of bound then just give the whole list | ||
98 | file_names = list_of_files[:maxNumberOfFiles] | ||
99 | # print(file_names) | ||
100 | return file_names | ||
101 | |||
102 | |||
103 | def plotlines(x, y, ax): | ||
104 | l1, = ax.plot(x, y) | ||
105 | |||
106 | |||
107 | def testgetsamplesfromfiles(): | ||
108 | files = readmultiplefiles('../statistics/viatraOutput/', 2) | ||
109 | for file in files: | ||
110 | getmetrics(file) | ||
111 | |||
112 | def probability(data): | ||
113 | sum = np.sum(data) | ||
114 | probabilityList = [] | ||
115 | for d in data: | ||
116 | p = d/sum | ||
117 | probabilityList.append(p) | ||
118 | a = np.array(probabilityList) | ||
119 | return a | ||
120 | |||
121 | |||
122 | def cumulativeProbability(p): | ||
123 | cdf = np.cumsum(p) | ||
124 | return cdf | ||
125 | |||
126 | |||
127 | def plot(): | ||
128 | fig, ax = plt.subplots() | ||
129 | fig, ax1 = plt.subplots() | ||
130 | fig, ax2 = plt.subplots() | ||
131 | fig, ax3 = plt.subplots() | ||
132 | fig, ax4 = plt.subplots() | ||
133 | fig, ax5 = plt.subplots() | ||
134 | list_of_files = readmultiplefiles('../statistics/iatraOutput/') | ||
135 | for file_name in list_of_files: | ||
136 | contents = readcsvfile(file_name) | ||
137 | outdegree = [contents[constants.OUT_DEGREE_VALUE], contents[constants.OUT_DEGREE_COUNT]] | ||
138 | na = [contents[constants.NA_VALUE], contents[constants.NA_COUNT]] | ||
139 | mpc = [contents[constants.MPC_VALUE], contents[constants.MPC_COUNT]] | ||
140 | outV = outdegree[0, :] | ||
141 | outC = outdegree[1, :] | ||
142 | outP = probability(outC) | ||
143 | outCumP = cumulativeProbability(outP) | ||
144 | plotlines(outV, outP, ax) | ||
145 | naV = na[0, :] | ||
146 | naC = na[1, :] | ||
147 | naP = probability(naC) | ||
148 | naCumP = cumulativeProbability(naP) | ||
149 | plotlines(naV, naP, ax1) | ||
150 | mpcV = mpc[0, :] | ||
151 | mpcC = mpc[1, :] | ||
152 | mpcP = probability(mpcC) | ||
153 | mpcCumP = cumulativeProbability(mpcP) | ||
154 | plotlines(mpcV, mpcP, ax2) | ||
155 | plotlines(outV, outCumP, ax3) | ||
156 | plotlines(naV, naCumP, ax4) | ||
157 | plotlines(mpcV, mpcCumP, ax5) | ||
158 | ax.set_xlabel('ourdegree') | ||
159 | ax.set_ylabel('pdf') | ||
160 | ax.grid() | ||
161 | |||
162 | ax1.set_xlabel('node activity') | ||
163 | ax1.set_ylabel('pdf') | ||
164 | ax1.grid() | ||
165 | |||
166 | ax2.set_xlabel('multiplex participation coefficient') | ||
167 | ax2.set_ylabel('pdf') | ||
168 | ax2.grid() | ||
169 | |||
170 | ax3.set_xlabel('ourdegree') | ||
171 | ax3.set_ylabel('cdf') | ||
172 | ax3.grid() | ||
173 | |||
174 | ax4.set_xlabel('node activity') | ||
175 | ax4.set_ylabel('cdf') | ||
176 | ax4.grid() | ||
177 | |||
178 | ax5.set_xlabel('multiplex participation coefficient') | ||
179 | ax5.set_ylabel('cdf') | ||
180 | ax5.grid() | ||
181 | |||
182 | plt.show() | ||
183 | |||
184 | |||
185 | # plot() | ||
186 | |||