aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar 20001LastOrder <boqi.chen@mail.mcgill.ca>2019-08-13 18:10:02 -0400
committerLibravatar 20001LastOrder <boqi.chen@mail.mcgill.ca>2019-08-13 18:10:02 -0400
commita882ad00515e730bad5e52fa29b74f461a5b9cd6 (patch)
tree5c892f1dc5b501aa3f7355e97f24cca277a473db
parentConfigurations for generation and new domain for generation ecore model (diff)
downloadVIATRA-Generator-a882ad00515e730bad5e52fa29b74f461a5b9cd6.tar.gz
VIATRA-Generator-a882ad00515e730bad5e52fa29b74f461a5b9cd6.tar.zst
VIATRA-Generator-a882ad00515e730bad5e52fa29b74f461a5b9cd6.zip
change exploration value function
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF2
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore2
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore104
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/Sql.ecore (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore178
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt16
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig2
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml15
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql26
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql8
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore8
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore8
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore4
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java22
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java611
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java824
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java692
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig10
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF3
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore8
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java692
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java97
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore_pattern.java (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java)20
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java548
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java621
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java707
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java693
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java577
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend14
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend3
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend9
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.pngbin0 -> 237869 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.pngbin0 -> 229975 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.pngbin0 -> 215491 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.pngbin0 -> 240923 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.pngbin0 -> 221779 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.pngbin285347 -> 249645 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.pngbin285060 -> 247153 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.pngbin316647 -> 239303 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.pngbin322141 -> 240635 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.pngbin306030 -> 125245 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb102
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.pngbin60526 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.pngbin54889 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.pngbin57228 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.pngbin64516 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.pngbin66166 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.pngbin64141 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.pngbin76199 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.pngbin72990 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.pngbin73421 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.pngbin0 -> 241905 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.pngbin0 -> 289113 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.pngbin0 -> 284666 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.pngbin0 -> 332518 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.pngbin0 -> 183889 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.pngbin0 -> 230868 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.pngbin0 -> 238739 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.pngbin0 -> 197299 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.pngbin0 -> 244323 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.pngbin0 -> 145568 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types_lengend.pngbin0 -> 153817 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.pngbin0 -> 132109 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree_lengend.pngbin0 -> 147721 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.pngbin0 -> 220923 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.pngbin0 -> 253391 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.pngbin0 -> 178242 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.pngbin0 -> 212017 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.pngbin0 -> 291371 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.pngbin0 -> 324860 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.pngbin69414 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.pngbin64936 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.pngbin67587 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.pngbin67954 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.pngbin63561 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.pngbin67238 -> 0 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py71
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb76
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb286
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py10
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py3
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java136
83 files changed, 5891 insertions, 1396 deletions
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF
index a3f5076e..833b6fd8 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF
@@ -8,6 +8,8 @@ Bundle-Vendor: %providerName
8Bundle-Localization: plugin 8Bundle-Localization: plugin
9Export-Package: ca.mcgill.ecse.socialnetwork.plugin, 9Export-Package: ca.mcgill.ecse.socialnetwork.plugin,
10 ca.mcgill.ecse.socialnetwork.runner, 10 ca.mcgill.ecse.socialnetwork.runner,
11 constraints.ecore,
12 ecore,
11 queries, 13 queries,
12 socialnetwork, 14 socialnetwork,
13 socialnetwork.impl, 15 socialnetwork.impl,
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore
index 8b962bcf..464c03f5 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore
@@ -1,5 +1,7 @@
1/ca/ 1/ca/
2/constraints/
2/ecore.ecore 3/ecore.ecore
4/ecore/
3/queries/ 5/queries/
4/socialnetwork.aird 6/socialnetwork.aird
5/socialnetwork.ecore 7/socialnetwork.ecore
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore
deleted file mode 100644
index 57088b0c..00000000
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore
+++ /dev/null
@@ -1,104 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="San" nsURI="http://San/1.0" nsPrefix="San">
4 <eClassifiers xsi:type="ecore:EClass" name="Network" eSuperTypes="#//NamedElement">
5 <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
6 <eStructuralFeatures xsi:type="ecore:EAttribute" name="port" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
7 <eStructuralFeatures xsi:type="ecore:EReference" name="processes" upperBound="-1"
8 eType="#//Process" containment="true"/>
9 <eStructuralFeatures xsi:type="ecore:EReference" name="devices" upperBound="-1"
10 eType="#//Device" containment="true"/>
11 <eStructuralFeatures xsi:type="ecore:EReference" name="instruments" upperBound="-1"
12 eType="#//Instrument" containment="true"/>
13 <eStructuralFeatures xsi:type="ecore:EReference" name="measurands" upperBound="-1"
14 eType="#//Measurand" containment="true"/>
15 <eStructuralFeatures xsi:type="ecore:EReference" name="measures" upperBound="-1"
16 eType="#//Measure" containment="true"/>
17 <eStructuralFeatures xsi:type="ecore:EReference" name="bindings" upperBound="-1"
18 eType="#//Binding" containment="true"/>
19 <eStructuralFeatures xsi:type="ecore:EReference" name="triggers" upperBound="-1"
20 eType="#//Trigger" containment="true"/>
21 </eClassifiers>
22 <eClassifiers xsi:type="ecore:EClass" name="NamedElement">
23 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
24 </eClassifiers>
25 <eClassifiers xsi:type="ecore:EClass" name="Device" eSuperTypes="#//NamedElement">
26 <eStructuralFeatures xsi:type="ecore:EReference" name="instrument" lowerBound="1"
27 eType="#//Instrument"/>
28 <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1"
29 eType="#//Argument" containment="true"/>
30 </eClassifiers>
31 <eClassifiers xsi:type="ecore:EClass" name="Instrument" eSuperTypes="#//NamedElement">
32 <eStructuralFeatures xsi:type="ecore:EReference" name="features" ordered="false"
33 upperBound="-1" eType="#//Feature" changeable="false" containment="true"/>
34 <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
35 eType="#//Parameter" containment="true"/>
36 </eClassifiers>
37 <eClassifiers xsi:type="ecore:EClass" name="Measurand" eSuperTypes="#//NamedElement">
38 <eStructuralFeatures xsi:type="ecore:EReference" name="measurand" eType="#//Measurand"/>
39 </eClassifiers>
40 <eClassifiers xsi:type="ecore:EClass" name="Binding" eSuperTypes="#//NamedElement">
41 <eStructuralFeatures xsi:type="ecore:EReference" name="device" lowerBound="1"
42 eType="#//Device"/>
43 <eStructuralFeatures xsi:type="ecore:EReference" name="measurand" lowerBound="1"
44 eType="#//Measurand"/>
45 <eStructuralFeatures xsi:type="ecore:EReference" name="feature" lowerBound="1"
46 eType="#//Feature"/>
47 </eClassifiers>
48 <eClassifiers xsi:type="ecore:EClass" name="Measure" eSuperTypes="#//NamedElement">
49 <eStructuralFeatures xsi:type="ecore:EAttribute" name="unit" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
50 <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//Datatype"/>
51 </eClassifiers>
52 <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//NamedElement">
53 <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" lowerBound="1" eType="#//Datatype"/>
54 </eClassifiers>
55 <eClassifiers xsi:type="ecore:EClass" name="Argument" eSuperTypes="#//NamedElement">
56 <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
57 <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" eType="#//Parameter"/>
58 </eClassifiers>
59 <eClassifiers xsi:type="ecore:EClass" name="Feature" eSuperTypes="#//NamedElement">
60 <eStructuralFeatures xsi:type="ecore:EAttribute" name="factor" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
61 defaultValueLiteral="0"/>
62 <eStructuralFeatures xsi:type="ecore:EAttribute" name="mode" eType="#//Mode" defaultValueLiteral="Input"/>
63 <eStructuralFeatures xsi:type="ecore:EReference" name="measure" eType="#//Measure"/>
64 </eClassifiers>
65 <eClassifiers xsi:type="ecore:EEnum" name="Datatype">
66 <eLiterals name="Boolean"/>
67 <eLiterals name="Date" value="1"/>
68 <eLiterals name="Double" value="2"/>
69 <eLiterals name="Float" value="3"/>
70 <eLiterals name="Integer" value="4"/>
71 <eLiterals name="Long" value="5"/>
72 <eLiterals name="String" value="6"/>
73 <eLiterals name="Time" value="7"/>
74 <eLiterals name="TimeStamp" value="8"/>
75 <eLiterals name="Uri" value="9"/>
76 <eLiterals name="Uuid" value="10"/>
77 </eClassifiers>
78 <eClassifiers xsi:type="ecore:EEnum" name="Mode">
79 <eLiterals name="Input"/>
80 <eLiterals name="Output" value="1"/>
81 </eClassifiers>
82 <eClassifiers xsi:type="ecore:EClass" name="Process" eSuperTypes="#//NamedElement">
83 <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
84 eType="#//Parameter" containment="true"/>
85 </eClassifiers>
86 <eClassifiers xsi:type="ecore:EClass" name="Trigger">
87 <eStructuralFeatures xsi:type="ecore:EReference" name="process" lowerBound="1"
88 eType="#//Process"/>
89 <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1"
90 eType="#//Argument" containment="true"/>
91 </eClassifiers>
92 <eClassifiers xsi:type="ecore:EClass" name="Event" eSuperTypes="#//Trigger">
93 <eStructuralFeatures xsi:type="ecore:EReference" name="binding" lowerBound="1"
94 eType="#//Binding"/>
95 </eClassifiers>
96 <eClassifiers xsi:type="ecore:EClass" name="Task" eSuperTypes="#//Trigger">
97 <eStructuralFeatures xsi:type="ecore:EAttribute" name="period" lowerBound="1"
98 eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
99 </eClassifiers>
100 <eClassifiers xsi:type="ecore:EClass" name="Thing" eSuperTypes="#//Trigger">
101 <eStructuralFeatures xsi:type="ecore:EReference" name="instrument" lowerBound="1"
102 eType="#//Instrument"/>
103 </eClassifiers>
104</ecore:EPackage>
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/Sql.ecore
index 65d72135..65d72135 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/Sql.ecore
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore
new file mode 100644
index 00000000..5c01ab01
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore
@@ -0,0 +1,178 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
3 <ecore:EPackage name="PrimitiveTypes">
4 <eClassifiers xsi:type="ecore:EDataType" name="Integer"/>
5 <eClassifiers xsi:type="ecore:EDataType" name="Long"/>
6 <eClassifiers xsi:type="ecore:EDataType" name="Float"/>
7 <eClassifiers xsi:type="ecore:EDataType" name="Double"/>
8 <eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
9 <eClassifiers xsi:type="ecore:EDataType" name="String"/>
10 </ecore:EPackage>
11 <ecore:EPackage name="RDM">
12 <eClassifiers xsi:type="ecore:EClass" name="DifferentFrom" eSuperTypes="/1/PredicateSymbol"/>
13 <eClassifiers xsi:type="ecore:EClass" name="SameAs" eSuperTypes="/1/PredicateSymbol"/>
14 <eClassifiers xsi:type="ecore:EClass" name="IndividualVariable" eSuperTypes="/1/Variable">
15 <eStructuralFeatures xsi:type="ecore:EReference" name="classRef" ordered="false" eType="/1/ODM/Class"/>
16 </eClassifiers>
17 <eClassifiers xsi:type="ecore:EClass" name="DataVariable" eSuperTypes="/1/Variable"/>
18 <eClassifiers xsi:type="ecore:EClass" name="Constant" eSuperTypes="/1/Term"/>
19 <eClassifiers xsi:type="ecore:EClass" name="Variable" eSuperTypes="/1/Term">
20 <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" eType="/1/ODM/Datatype"/>
21 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
22 </eClassifiers>
23 <eClassifiers xsi:type="ecore:EClass" name="Term" abstract="true"/>
24 <eClassifiers xsi:type="ecore:EClass" name="BuiltIn" eSuperTypes="/1/PredicateSymbol">
25 <eStructuralFeatures xsi:type="ecore:EAttribute" name="buildInID" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
26 </eClassifiers>
27 <eClassifiers xsi:type="ecore:EClass" name="PredicateSymbol"/>
28 <eClassifiers xsi:type="ecore:EClass" name="Atom">
29 <eStructuralFeatures xsi:type="ecore:EReference" name="hasPredicateSymbol" ordered="false" lowerBound="1" eType="/1/PredicateSymbol"/>
30 <eStructuralFeatures xsi:type="ecore:EReference" name="terms" upperBound="-1" eType="/1/Term"/>
31 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
32 </eClassifiers>
33 <eClassifiers xsi:type="ecore:EClass" name="Consequent">
34 <eStructuralFeatures xsi:type="ecore:EReference" name="containsAtom" ordered="false" upperBound="-1" eType="/1/Atom"/>
35 </eClassifiers>
36 <eClassifiers xsi:type="ecore:EClass" name="Antecedent">
37 <eStructuralFeatures xsi:type="ecore:EReference" name="containsAtom" ordered="false" upperBound="-1" eType="/1/Atom"/>
38 </eClassifiers>
39 <eClassifiers xsi:type="ecore:EClass" name="Rule" eSuperTypes="/1/ODM/OntologyElement">
40 <eStructuralFeatures xsi:type="ecore:EReference" name="hasAntecedent" ordered="false" lowerBound="1" eType="/1/Antecedent"/>
41 <eStructuralFeatures xsi:type="ecore:EReference" name="hasConsequent" ordered="false" lowerBound="1" eType="/1/Consequent"/>
42 </eClassifiers>
43 <eSubpackages name="ODM">
44 <eClassifiers xsi:type="ecore:EClass" name="MinCardinalityRestriction" eSuperTypes="/1/ODM/Restriction">
45 <eStructuralFeatures xsi:type="ecore:EReference" name="minCardinality" ordered="false" lowerBound="1" eType="/1/ODM/TypedLiteral"/>
46 </eClassifiers>
47 <eClassifiers xsi:type="ecore:EClass" name="MaxCardinalityRestriction" eSuperTypes="/1/ODM/Restriction">
48 <eStructuralFeatures xsi:type="ecore:EReference" name="maxCardinality" ordered="false" lowerBound="1" eType="/1/ODM/TypedLiteral"/>
49 </eClassifiers>
50 <eClassifiers xsi:type="ecore:EClass" name="CardinalityRestriction" eSuperTypes="/1/ODM/Restriction">
51 <eStructuralFeatures xsi:type="ecore:EReference" name="cardinality" ordered="false" lowerBound="1" eType="/1/ODM/TypedLiteral"/>
52 </eClassifiers>
53 <eClassifiers xsi:type="ecore:EClass" name="TransitiveProperty" eSuperTypes="/1/ODM/ObjectProperty"/>
54 <eClassifiers xsi:type="ecore:EClass" name="SymmetricProperty" eSuperTypes="/1/ODM/ObjectProperty"/>
55 <eClassifiers xsi:type="ecore:EClass" name="InverseFunctionalProperty" eSuperTypes="/1/ODM/ObjectProperty"/>
56 <eClassifiers xsi:type="ecore:EClass" name="FunctionalProperty" eSuperTypes="/1/ODM/Property"/>
57 <eClassifiers xsi:type="ecore:EClass" name="PlainLiteral" eSuperTypes="/1/ODM/Literal">
58 <eStructuralFeatures xsi:type="ecore:EAttribute" name="language" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
59 </eClassifiers>
60 <eClassifiers xsi:type="ecore:EClass" name="TypedLiteral" eSuperTypes="/1/ODM/Literal">
61 <eStructuralFeatures xsi:type="ecore:EAttribute" name="theType" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
62 </eClassifiers>
63 <eClassifiers xsi:type="ecore:EClass" name="Literal" abstract="true" eSuperTypes="/1/ODM/Datatype">
64 <eStructuralFeatures xsi:type="ecore:EAttribute" name="lexicalForm" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
65 </eClassifiers>
66 <eClassifiers xsi:type="ecore:EClass" name="Datatype" abstract="true" eSuperTypes="/1/ODM/OntologyElement"/>
67 <eClassifiers xsi:type="ecore:EClass" name="DataRange" eSuperTypes="/1/ODM/Class">
68 <eStructuralFeatures xsi:type="ecore:EReference" name="datatype" ordered="false" eType="/1/ODM/Datatype"/>
69 <eStructuralFeatures xsi:type="ecore:EReference" name="oneOf" ordered="false" upperBound="-1" eType="/1/ODM/Literal"/>
70 </eClassifiers>
71 <eClassifiers xsi:type="ecore:EClass" name="AllValuesFromRestriction" eSuperTypes="/1/ODM/Restriction">
72 <eStructuralFeatures xsi:type="ecore:EReference" name="allValuesFromRange" ordered="false" eType="/1/ODM/DataRange"/>
73 <eStructuralFeatures xsi:type="ecore:EReference" name="allValuesFromClass" ordered="false" eType="/1/ODM/Class"/>
74 </eClassifiers>
75 <eClassifiers xsi:type="ecore:EClass" name="SomeValuesFromRestriction" eSuperTypes="/1/ODM/Restriction">
76 <eStructuralFeatures xsi:type="ecore:EReference" name="someValuesFromClass" ordered="false" eType="/1/ODM/Class"/>
77 <eStructuralFeatures xsi:type="ecore:EReference" name="someValuesFromRange" ordered="false" eType="/1/ODM/DataRange"/>
78 </eClassifiers>
79 <eClassifiers xsi:type="ecore:EClass" name="OntologyPropertyValue" eSuperTypes="/1/ODM/OntologyProperty"/>
80 <eClassifiers xsi:type="ecore:EClass" name="URI" eSuperTypes="/1/ODM/Annotation"/>
81 <eClassifiers xsi:type="ecore:EClass" name="Annotation" abstract="true"/>
82 <eClassifiers xsi:type="ecore:EClass" name="AnnotationPropertyValue">
83 <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false" lowerBound="1" eType="/1/ODM/Annotation"/>
84 <eStructuralFeatures xsi:type="ecore:EReference" name="subject" ordered="false" lowerBound="1" eType="/1/ODM/AnnotatableElement"/>
85 <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/1/ODM/AnnotationProperty"/>
86 </eClassifiers>
87 <eClassifiers xsi:type="ecore:EClass" name="EnumeratedDatatype" eSuperTypes="/1/ODM/Datatype">
88 <eStructuralFeatures xsi:type="ecore:EReference" name="collectionOf" ordered="false" upperBound="-1" eType="/1/ODM/DataValue"/>
89 </eClassifiers>
90 <eClassifiers xsi:type="ecore:EClass" name="PrimitiveType" eSuperTypes="/1/ODM/Datatype"/>
91 <eClassifiers xsi:type="ecore:EClass" name="HasValueRestriction" eSuperTypes="/1/ODM/Restriction">
92 <eStructuralFeatures xsi:type="ecore:EReference" name="hasLiteralValue" ordered="false" eType="/1/ODM/Literal"/>
93 <eStructuralFeatures xsi:type="ecore:EReference" name="hasValue" ordered="false" eType="/1/ODM/Individual"/>
94 </eClassifiers>
95 <eClassifiers xsi:type="ecore:EClass" name="Restriction" abstract="true" eSuperTypes="/1/ODM/Class">
96 <eStructuralFeatures xsi:type="ecore:EReference" name="onProperty" ordered="false" upperBound="-1" eType="/1/ODM/Property"/>
97 <eStructuralFeatures xsi:type="ecore:EReference" name="toDatatype" ordered="false" eType="/1/ODM/Datatype"/>
98 </eClassifiers>
99 <eClassifiers xsi:type="ecore:EClass" name="AllDiferent" eSuperTypes="/1/ODM/Class">
100 <eStructuralFeatures xsi:type="ecore:EReference" name="distinctMembers" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/>
101 </eClassifiers>
102 <eClassifiers xsi:type="ecore:EClass" name="DataValue" eSuperTypes="/1/Constant /1/ODM/Annotation">
103 <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/1/ODM/Datatype"/>
104 <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
105 </eClassifiers>
106 <eClassifiers xsi:type="ecore:EClass" name="DatatypePropertyValue" eSuperTypes="/1/ODM/PropertyValue">
107 <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false" lowerBound="1" eType="/1/ODM/DataValue"/>
108 </eClassifiers>
109 <eClassifiers xsi:type="ecore:EClass" name="ObjectPropertyValue" eSuperTypes="/1/ODM/PropertyValue">
110 <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false" lowerBound="1" eType="/1/ODM/Individual"/>
111 </eClassifiers>
112 <eClassifiers xsi:type="ecore:EClass" name="PropertyValue" abstract="true">
113 <eStructuralFeatures xsi:type="ecore:EReference" name="subject" ordered="false" lowerBound="1" eType="/1/ODM/Individual"/>
114 </eClassifiers>
115 <eClassifiers xsi:type="ecore:EClass" name="UnionClass" eSuperTypes="/1/ODM/Class">
116 <eStructuralFeatures xsi:type="ecore:EReference" name="unionOf" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
117 </eClassifiers>
118 <eClassifiers xsi:type="ecore:EClass" name="IntersectionClass" eSuperTypes="/1/ODM/Class">
119 <eStructuralFeatures xsi:type="ecore:EReference" name="intersectionOf" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
120 </eClassifiers>
121 <eClassifiers xsi:type="ecore:EClass" name="ComplementClass" eSuperTypes="/1/ODM/Class">
122 <eStructuralFeatures xsi:type="ecore:EReference" name="complementOf" ordered="false" lowerBound="1" eType="/1/ODM/Class"/>
123 </eClassifiers>
124 <eClassifiers xsi:type="ecore:EClass" name="EnumeratedClass" eSuperTypes="/1/ODM/Class">
125 <eStructuralFeatures xsi:type="ecore:EReference" name="oneOf" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/>
126 </eClassifiers>
127 <eClassifiers xsi:type="ecore:EClass" name="Namespace">
128 <eStructuralFeatures xsi:type="ecore:EReference" name="members" ordered="false" upperBound="-1" eType="/1/ODM/NamedElement" containment="true"/>
129 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
130 <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
131 </eClassifiers>
132 <eClassifiers xsi:type="ecore:EClass" name="DatatypeProperty" eSuperTypes="/1/ODM/Property">
133 <eStructuralFeatures xsi:type="ecore:EReference" name="range" ordered="false" upperBound="-1" eType="/1/ODM/DataRange"/>
134 </eClassifiers>
135 <eClassifiers xsi:type="ecore:EClass" name="ObjectProperty" eSuperTypes="/1/ODM/Property">
136 <eStructuralFeatures xsi:type="ecore:EReference" name="range" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
137 <eStructuralFeatures xsi:type="ecore:EReference" name="inverseOf" ordered="false" upperBound="-1" eType="/1/ODM/ObjectProperty"/>
138 <eStructuralFeatures xsi:type="ecore:EAttribute" name="transitive" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
139 <eStructuralFeatures xsi:type="ecore:EAttribute" name="symmetric" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
140 <eStructuralFeatures xsi:type="ecore:EAttribute" name="inverseFunctional" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
141 <eStructuralFeatures xsi:type="ecore:EAttribute" name="complex" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
142 </eClassifiers>
143 <eClassifiers xsi:type="ecore:EClass" name="Individual" eSuperTypes="/1/Constant /1/ODM/Annotation /1/ODM/Class">
144 <eStructuralFeatures xsi:type="ecore:EReference" name="sameAs" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/>
145 <eStructuralFeatures xsi:type="ecore:EReference" name="differentFrom" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/>
146 <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/1/ODM/Class"/>
147 </eClassifiers>
148 <eClassifiers xsi:type="ecore:EClass" name="Class" eSuperTypes="/1/PredicateSymbol /1/ODM/OntologyElement">
149 <eStructuralFeatures xsi:type="ecore:EReference" name="disjointWith" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
150 <eStructuralFeatures xsi:type="ecore:EReference" name="subClassOf" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
151 <eStructuralFeatures xsi:type="ecore:EReference" name="equivalentClass" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
152 </eClassifiers>
153 <eClassifiers xsi:type="ecore:EClass" name="Property" abstract="true" eSuperTypes="/1/PredicateSymbol /1/ODM/OntologyElement">
154 <eStructuralFeatures xsi:type="ecore:EReference" name="domain" ordered="false" upperBound="-1" eType="/1/ODM/Class"/>
155 <eStructuralFeatures xsi:type="ecore:EReference" name="equivalentProperty" ordered="false" upperBound="-1" eType="/1/ODM/Property"/>
156 <eStructuralFeatures xsi:type="ecore:EReference" name="subPropertyOf" ordered="false" upperBound="-1" eType="/1/ODM/Property"/>
157 <eStructuralFeatures xsi:type="ecore:EAttribute" name="deprecated" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
158 <eStructuralFeatures xsi:type="ecore:EAttribute" name="functional" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
159 </eClassifiers>
160 <eClassifiers xsi:type="ecore:EClass" name="AnnotationProperty" eSuperTypes="/1/ODM/OntologyElement"/>
161 <eClassifiers xsi:type="ecore:EClass" name="OntologyProperty" abstract="true" eSuperTypes="/1/ODM/OntologyElement"/>
162 <eClassifiers xsi:type="ecore:EClass" name="OntologyElement" eSuperTypes="/1/ODM/NamedElement /1/ODM/AnnotatableElement"/>
163 <eClassifiers xsi:type="ecore:EClass" name="Ontology" eSuperTypes="/1/ODM/AnnotatableElement">
164 <eStructuralFeatures xsi:type="ecore:EReference" name="imports" ordered="false" upperBound="-1" eType="/1/ODM/Ontology"/>
165 <eStructuralFeatures xsi:type="ecore:EReference" name="priorVersion" ordered="false" eType="/1/ODM/Ontology"/>
166 <eStructuralFeatures xsi:type="ecore:EReference" name="elements" ordered="false" upperBound="-1" eType="/1/ODM/NamedElement" containment="true"/>
167 <eStructuralFeatures xsi:type="ecore:EReference" name="incompatibleWith" ordered="false" upperBound="-1" eType="/1/ODM/Ontology"/>
168 <eStructuralFeatures xsi:type="ecore:EReference" name="reference" ordered="false" upperBound="-1" eType="/1/ODM/OntologyPropertyValue"/>
169 </eClassifiers>
170 <eClassifiers xsi:type="ecore:EClass" name="AnnotatableElement" abstract="true"/>
171 <eClassifiers xsi:type="ecore:EClass" name="NamedElement">
172 <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
173 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
174 <eStructuralFeatures xsi:type="ecore:EAttribute" name="qualifiedName" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
175 </eClassifiers>
176 </eSubpackages>
177 </ecore:EPackage>
178</xmi:XMI>
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt
index e4925b3c..fb05996a 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt
@@ -1,10 +1,12 @@
1Error occured (IllegalArgumentException): Class EObject is not translated to logic! 1Error occured (NullPointerException):
2 hu.bme.mit.inf.dslreasoner.ecore2logic.EClassMapper_AllElementAsObject.TypeofEClass(EClassMapper_AllElementAsObject.java:63) 2 hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder.toTypeReference(LogicProblemBuilder.java:302)
3 hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes.createIndicatorDeclarations(EReferenceMapper_RelationsOverTypes.java:88) 3 hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder.lambda$11(LogicProblemBuilder.java:313)
4 hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes.transformEReferences(EReferenceMapper_RelationsOverTypes.java:67) 4 org.eclipse.xtext.xbase.lib.ObjectExtensions.operator_doubleArrow(ObjectExtensions.java:139)
5 hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic.transformEReferences(Ecore2Logic.java:120) 5 hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder.createVar(LogicProblemBuilder.java:315)
6 hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic.transformMetamodel(Ecore2Logic.java:81) 6 hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic.transformBody(Viatra2Logic.java:335)
7 hu.bme.mit.inf.dslreasoner.application.execution.GenerationTaskExecutor.executeGenerationTask(GenerationTaskExecutor.java:189) 7 hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic.transformQuerySpecification(Viatra2Logic.java:237)
8 hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic.transformQueries(Viatra2Logic.java:149)
9 hu.bme.mit.inf.dslreasoner.application.execution.GenerationTaskExecutor.executeGenerationTask(GenerationTaskExecutor.java:196)
8 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor._execute(ScriptExecutor.java:129) 10 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor._execute(ScriptExecutor.java:129)
9 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.execute(ScriptExecutor.java:338) 11 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.execute(ScriptExecutor.java:338)
10 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.executeScript(ScriptExecutor.java:110) 12 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.executeScript(ScriptExecutor.java:110)
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig
index 7da4f563..ff9155a4 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig
@@ -32,7 +32,7 @@ generate {
32 } 32 }
33 33
34 number = 1 34 number = 1
35 runs = 1 35 runs = 30
36 config = { 36 config = {
37 log-level = none, 37 log-level = none,
38 "optional-wf" = "true", 38 "optional-wf" = "true",
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml
index 975fd574..269d4b7b 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml
@@ -4,14 +4,6 @@
4 <!-- @generated socialnetwork --> 4 <!-- @generated socialnetwork -->
5 <package class="socialnetwork.SocialnetworkPackage" genModel="model/socialnetwork.genmodel" uri="http://ecse.mcgill.ca/socialnetwork"/> 5 <package class="socialnetwork.SocialnetworkPackage" genModel="model/socialnetwork.genmodel" uri="http://ecse.mcgill.ca/socialnetwork"/>
6 </extension> 6 </extension>
7 <extension id="ca.mcgill.ecse.socialnetwork.plugin.Queries" point="org.eclipse.viatra.query.runtime.queryspecification">
8 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:ca.mcgill.ecse.socialnetwork.plugin.Queries" id="ca.mcgill.ecse.socialnetwork.plugin.Queries">
9 <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.singleFriendship"/>
10 <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.noFriend"/>
11 <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.selfFriend"/>
12 <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.friendship"/>
13 </group>
14 </extension>
15 <extension id="queries.Ecore" point="org.eclipse.viatra.query.runtime.queryspecification"> 7 <extension id="queries.Ecore" point="org.eclipse.viatra.query.runtime.queryspecification">
16 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore" id="queries.Ecore"> 8 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore" id="queries.Ecore">
17 <query-specification fqn="queries.directSupertype"/> 9 <query-specification fqn="queries.directSupertype"/>
@@ -19,11 +11,8 @@
19 <query-specification fqn="queries.opposite"/> 11 <query-specification fqn="queries.opposite"/>
20 <query-specification fqn="queries.oppositeDifferentClass"/> 12 <query-specification fqn="queries.oppositeDifferentClass"/>
21 <query-specification fqn="queries.nonSymmetricOpposite"/> 13 <query-specification fqn="queries.nonSymmetricOpposite"/>
22 </group> 14 <query-specification fqn="queries.superTypes"/>
23 </extension> 15 <query-specification fqn="queries.moreThenFiveSuperTypes"/>
24 <extension id="queries.Ecore_pattern" point="org.eclipse.viatra.query.runtime.queryspecification">
25 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore_pattern" id="queries.Ecore_pattern">
26 <query-specification fqn="queries.sameSuperClass"/>
27 </group> 16 </group>
28 </extension> 17 </extension>
29</plugin> 18</plugin>
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql
index 3b0e7fd9..315e7d34 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql
@@ -26,4 +26,28 @@ pattern oppositeDifferentClass(a:EReference) {
26pattern nonSymmetricOpposite(a:EReference, b:EReference) { 26pattern nonSymmetricOpposite(a:EReference, b:EReference) {
27 find opposite(a,b); 27 find opposite(a,b);
28 neg find opposite(b,a); 28 neg find opposite(b,a);
29} \ No newline at end of file 29}
30
31pattern superTypes(c1:EClass, c2:EClass){
32 EClass.eSuperTypes(c1,c2);
33}
34
35@Constraint(severity="error", message="error", key = {c})
36pattern moreThenFiveSuperTypes(c: EClass){
37 find superTypes(c1, s1);
38 find superTypes(c1, s2);
39 find superTypes(c1, s3);
40 find superTypes(c1, s4);
41 find superTypes(c1, s5);
42 s1 != s2;
43 s1 != s3;
44 s1 != s4;
45 s1 != s5;
46 s2 != s3;
47 s2 != s4;
48 s2 != s5;
49 s3 != s4;
50 s3 != s5;
51 s4 != s5;
52}
53
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql
index a6f384d9..7e51dc69 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql
@@ -1,9 +1,9 @@
1package queries 1package queries
2import epackage "http://www.eclipse.org/emf/2002/Ecore" 2import epackage "http://www.eclipse.org/emf/2002/Ecore"
3 3
4
4@Constraint(severity="error", message="error", key = {c}) 5@Constraint(severity="error", message="error", key = {c})
5pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { 6pattern moreThenFiveSuperTypes(c: EClass){
6 EClass.eSuperTypes(c, s1); 7 m == count EClass.eSuperTypes(c,_);
7 EClass.eSuperTypes(c, s2); 8 check(m >= 5);
8 s1 == s2;
9} \ No newline at end of file 9} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore
new file mode 100644
index 00000000..c42ca056
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore
@@ -0,0 +1,8 @@
1/.Ecore_pattern.java._trace
2/.MoreThenFiveSuperTypes.java._trace
3/.DirectSupertype.java._trace
4/.Ecore.java._trace
5/.LoopInInheritence.java._trace
6/.NonSymmetricOpposite.java._trace
7/.Opposite.java._trace
8/.OppositeDifferentClass.java._trace
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore
new file mode 100644
index 00000000..c42ca056
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore
@@ -0,0 +1,8 @@
1/.Ecore_pattern.java._trace
2/.MoreThenFiveSuperTypes.java._trace
3/.DirectSupertype.java._trace
4/.Ecore.java._trace
5/.LoopInInheritence.java._trace
6/.NonSymmetricOpposite.java._trace
7/.Opposite.java._trace
8/.OppositeDifferentClass.java._trace
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore
index 9ceca817..e9d711d4 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore
@@ -1,9 +1,9 @@
1/.Ecore_pattern.java._trace 1/.Ecore_pattern.java._trace
2/.MultipleTransitionFromEntry.java._trace 2/.MoreThenFiveSuperTypes.java._trace
3/.SameSuperClass.java._trace
4/.DirectSupertype.java._trace 3/.DirectSupertype.java._trace
5/.Ecore.java._trace 4/.Ecore.java._trace
6/.LoopInInheritence.java._trace 5/.LoopInInheritence.java._trace
7/.NonSymmetricOpposite.java._trace 6/.NonSymmetricOpposite.java._trace
8/.Opposite.java._trace 7/.Opposite.java._trace
9/.OppositeDifferentClass.java._trace 8/.OppositeDifferentClass.java._trace
9/.SuperTypes.java._trace
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java
index e4f254d3..ebafb74b 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java
@@ -7,9 +7,11 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
7import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; 7import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup;
8import queries.DirectSupertype; 8import queries.DirectSupertype;
9import queries.LoopInInheritence; 9import queries.LoopInInheritence;
10import queries.MoreThenFiveSuperTypes;
10import queries.NonSymmetricOpposite; 11import queries.NonSymmetricOpposite;
11import queries.Opposite; 12import queries.Opposite;
12import queries.OppositeDifferentClass; 13import queries.OppositeDifferentClass;
14import queries.SuperTypes;
13 15
14/** 16/**
15 * A pattern group formed of all public patterns defined in Ecore.vql. 17 * A pattern group formed of all public patterns defined in Ecore.vql.
@@ -24,6 +26,8 @@ import queries.OppositeDifferentClass;
24 * <li>opposite</li> 26 * <li>opposite</li>
25 * <li>oppositeDifferentClass</li> 27 * <li>oppositeDifferentClass</li>
26 * <li>nonSymmetricOpposite</li> 28 * <li>nonSymmetricOpposite</li>
29 * <li>superTypes</li>
30 * <li>moreThenFiveSuperTypes</li>
27 * </ul> 31 * </ul>
28 * 32 *
29 * @see IQueryGroup 33 * @see IQueryGroup
@@ -53,6 +57,8 @@ public final class Ecore extends BaseGeneratedPatternGroup {
53 querySpecifications.add(Opposite.instance()); 57 querySpecifications.add(Opposite.instance());
54 querySpecifications.add(OppositeDifferentClass.instance()); 58 querySpecifications.add(OppositeDifferentClass.instance());
55 querySpecifications.add(NonSymmetricOpposite.instance()); 59 querySpecifications.add(NonSymmetricOpposite.instance());
60 querySpecifications.add(SuperTypes.instance());
61 querySpecifications.add(MoreThenFiveSuperTypes.instance());
56 } 62 }
57 63
58 public DirectSupertype getDirectSupertype() { 64 public DirectSupertype getDirectSupertype() {
@@ -94,4 +100,20 @@ public final class Ecore extends BaseGeneratedPatternGroup {
94 public NonSymmetricOpposite.Matcher getNonSymmetricOpposite(final ViatraQueryEngine engine) { 100 public NonSymmetricOpposite.Matcher getNonSymmetricOpposite(final ViatraQueryEngine engine) {
95 return NonSymmetricOpposite.Matcher.on(engine); 101 return NonSymmetricOpposite.Matcher.on(engine);
96 } 102 }
103
104 public SuperTypes getSuperTypes() {
105 return SuperTypes.instance();
106 }
107
108 public SuperTypes.Matcher getSuperTypes(final ViatraQueryEngine engine) {
109 return SuperTypes.Matcher.on(engine);
110 }
111
112 public MoreThenFiveSuperTypes getMoreThenFiveSuperTypes() {
113 return MoreThenFiveSuperTypes.instance();
114 }
115
116 public MoreThenFiveSuperTypes.Matcher getMoreThenFiveSuperTypes(final ViatraQueryEngine engine) {
117 return MoreThenFiveSuperTypes.Matcher.on(engine);
118 }
97} 119}
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java
new file mode 100644
index 00000000..867ffd01
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java
@@ -0,0 +1,611 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/Ecore.vql
3 */
4package queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.EClass;
18import org.eclipse.viatra.query.runtime.api.IPatternMatch;
19import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
20import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
21import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
23import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
24import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
25import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
26import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
27import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
29import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
30import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41import queries.SuperTypes;
42
43/**
44 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
45 *
46 * <p>Original source:
47 * <code><pre>
48 * {@literal @}Constraint(severity="error", message="error", key = {c})
49 * pattern moreThenFiveSuperTypes(c: EClass){
50 * find superTypes(c1, s1);
51 * find superTypes(c1, s2);
52 * find superTypes(c1, s3);
53 * find superTypes(c1, s4);
54 * find superTypes(c1, s5);
55 * s1 != s2;
56 * s1 != s3;
57 * s1 != s4;
58 * s1 != s5;
59 * s2 != s3;
60 * s2 != s4;
61 * s2 != s5;
62 * s3 != s4;
63 * s3 != s5;
64 * s4 != s5;
65 * }
66 * </pre></code>
67 *
68 * @see Matcher
69 * @see Match
70 *
71 */
72@SuppressWarnings("all")
73public final class MoreThenFiveSuperTypes extends BaseGeneratedEMFQuerySpecification<MoreThenFiveSuperTypes.Matcher> {
74 /**
75 * Pattern-specific match representation of the queries.moreThenFiveSuperTypes pattern,
76 * to be used in conjunction with {@link Matcher}.
77 *
78 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
79 * Each instance is a (possibly partial) substitution of pattern parameters,
80 * usable to represent a match of the pattern in the result of a query,
81 * or to specify the bound (fixed) input parameters when issuing a query.
82 *
83 * @see Matcher
84 *
85 */
86 public static abstract class Match extends BasePatternMatch {
87 private EClass fC;
88
89 private static List<String> parameterNames = makeImmutableList("c");
90
91 private Match(final EClass pC) {
92 this.fC = pC;
93 }
94
95 @Override
96 public Object get(final String parameterName) {
97 if ("c".equals(parameterName)) return this.fC;
98 return null;
99 }
100
101 public EClass getC() {
102 return this.fC;
103 }
104
105 @Override
106 public boolean set(final String parameterName, final Object newValue) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 if ("c".equals(parameterName) ) {
109 this.fC = (EClass) newValue;
110 return true;
111 }
112 return false;
113 }
114
115 public void setC(final EClass pC) {
116 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
117 this.fC = pC;
118 }
119
120 @Override
121 public String patternName() {
122 return "queries.moreThenFiveSuperTypes";
123 }
124
125 @Override
126 public List<String> parameterNames() {
127 return MoreThenFiveSuperTypes.Match.parameterNames;
128 }
129
130 @Override
131 public Object[] toArray() {
132 return new Object[]{fC};
133 }
134
135 @Override
136 public MoreThenFiveSuperTypes.Match toImmutable() {
137 return isMutable() ? newMatch(fC) : this;
138 }
139
140 @Override
141 public String prettyPrint() {
142 StringBuilder result = new StringBuilder();
143 result.append("\"c\"=" + prettyPrintValue(fC));
144 return result.toString();
145 }
146
147 @Override
148 public int hashCode() {
149 return Objects.hash(fC);
150 }
151
152 @Override
153 public boolean equals(final Object obj) {
154 if (this == obj)
155 return true;
156 if (obj == null) {
157 return false;
158 }
159 if ((obj instanceof MoreThenFiveSuperTypes.Match)) {
160 MoreThenFiveSuperTypes.Match other = (MoreThenFiveSuperTypes.Match) obj;
161 return Objects.equals(fC, other.fC);
162 } else {
163 // this should be infrequent
164 if (!(obj instanceof IPatternMatch)) {
165 return false;
166 }
167 IPatternMatch otherSig = (IPatternMatch) obj;
168 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
169 }
170 }
171
172 @Override
173 public MoreThenFiveSuperTypes specification() {
174 return MoreThenFiveSuperTypes.instance();
175 }
176
177 /**
178 * Returns an empty, mutable match.
179 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
180 *
181 * @return the empty match.
182 *
183 */
184 public static MoreThenFiveSuperTypes.Match newEmptyMatch() {
185 return new Mutable(null);
186 }
187
188 /**
189 * Returns a mutable (partial) match.
190 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
191 *
192 * @param pC the fixed value of pattern parameter c, or null if not bound.
193 * @return the new, mutable (partial) match object.
194 *
195 */
196 public static MoreThenFiveSuperTypes.Match newMutableMatch(final EClass pC) {
197 return new Mutable(pC);
198 }
199
200 /**
201 * Returns a new (partial) match.
202 * This can be used e.g. to call the matcher with a partial match.
203 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
204 * @param pC the fixed value of pattern parameter c, or null if not bound.
205 * @return the (partial) match object.
206 *
207 */
208 public static MoreThenFiveSuperTypes.Match newMatch(final EClass pC) {
209 return new Immutable(pC);
210 }
211
212 private static final class Mutable extends MoreThenFiveSuperTypes.Match {
213 Mutable(final EClass pC) {
214 super(pC);
215 }
216
217 @Override
218 public boolean isMutable() {
219 return true;
220 }
221 }
222
223 private static final class Immutable extends MoreThenFiveSuperTypes.Match {
224 Immutable(final EClass pC) {
225 super(pC);
226 }
227
228 @Override
229 public boolean isMutable() {
230 return false;
231 }
232 }
233 }
234
235 /**
236 * Generated pattern matcher API of the queries.moreThenFiveSuperTypes pattern,
237 * providing pattern-specific query methods.
238 *
239 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
240 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
241 *
242 * <p>Matches of the pattern will be represented as {@link Match}.
243 *
244 * <p>Original source:
245 * <code><pre>
246 * {@literal @}Constraint(severity="error", message="error", key = {c})
247 * pattern moreThenFiveSuperTypes(c: EClass){
248 * find superTypes(c1, s1);
249 * find superTypes(c1, s2);
250 * find superTypes(c1, s3);
251 * find superTypes(c1, s4);
252 * find superTypes(c1, s5);
253 * s1 != s2;
254 * s1 != s3;
255 * s1 != s4;
256 * s1 != s5;
257 * s2 != s3;
258 * s2 != s4;
259 * s2 != s5;
260 * s3 != s4;
261 * s3 != s5;
262 * s4 != s5;
263 * }
264 * </pre></code>
265 *
266 * @see Match
267 * @see MoreThenFiveSuperTypes
268 *
269 */
270 public static class Matcher extends BaseMatcher<MoreThenFiveSuperTypes.Match> {
271 /**
272 * Initializes the pattern matcher within an existing VIATRA Query engine.
273 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
274 *
275 * @param engine the existing VIATRA Query engine in which this matcher will be created.
276 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
277 *
278 */
279 public static MoreThenFiveSuperTypes.Matcher on(final ViatraQueryEngine engine) {
280 // check if matcher already exists
281 Matcher matcher = engine.getExistingMatcher(querySpecification());
282 if (matcher == null) {
283 matcher = (Matcher)engine.getMatcher(querySpecification());
284 }
285 return matcher;
286 }
287
288 /**
289 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
290 * @return an initialized matcher
291 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
292 *
293 */
294 public static MoreThenFiveSuperTypes.Matcher create() {
295 return new Matcher();
296 }
297
298 private static final int POSITION_C = 0;
299
300 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(MoreThenFiveSuperTypes.Matcher.class);
301
302 /**
303 * Initializes the pattern matcher within an existing VIATRA Query engine.
304 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
305 *
306 * @param engine the existing VIATRA Query engine in which this matcher will be created.
307 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
308 *
309 */
310 private Matcher() {
311 super(querySpecification());
312 }
313
314 /**
315 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
316 * @param pC the fixed value of pattern parameter c, or null if not bound.
317 * @return matches represented as a Match object.
318 *
319 */
320 public Collection<MoreThenFiveSuperTypes.Match> getAllMatches(final EClass pC) {
321 return rawStreamAllMatches(new Object[]{pC}).collect(Collectors.toSet());
322 }
323
324 /**
325 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
326 * </p>
327 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
328 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
329 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
330 * @param pC the fixed value of pattern parameter c, or null if not bound.
331 * @return a stream of matches represented as a Match object.
332 *
333 */
334 public Stream<MoreThenFiveSuperTypes.Match> streamAllMatches(final EClass pC) {
335 return rawStreamAllMatches(new Object[]{pC});
336 }
337
338 /**
339 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
340 * Neither determinism nor randomness of selection is guaranteed.
341 * @param pC the fixed value of pattern parameter c, or null if not bound.
342 * @return a match represented as a Match object, or null if no match is found.
343 *
344 */
345 public Optional<MoreThenFiveSuperTypes.Match> getOneArbitraryMatch(final EClass pC) {
346 return rawGetOneArbitraryMatch(new Object[]{pC});
347 }
348
349 /**
350 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
351 * under any possible substitution of the unspecified parameters (if any).
352 * @param pC the fixed value of pattern parameter c, or null if not bound.
353 * @return true if the input is a valid (partial) match of the pattern.
354 *
355 */
356 public boolean hasMatch(final EClass pC) {
357 return rawHasMatch(new Object[]{pC});
358 }
359
360 /**
361 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
362 * @param pC the fixed value of pattern parameter c, or null if not bound.
363 * @return the number of pattern matches found.
364 *
365 */
366 public int countMatches(final EClass pC) {
367 return rawCountMatches(new Object[]{pC});
368 }
369
370 /**
371 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
372 * Neither determinism nor randomness of selection is guaranteed.
373 * @param pC the fixed value of pattern parameter c, or null if not bound.
374 * @param processor the action that will process the selected match.
375 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
376 *
377 */
378 public boolean forOneArbitraryMatch(final EClass pC, final Consumer<? super MoreThenFiveSuperTypes.Match> processor) {
379 return rawForOneArbitraryMatch(new Object[]{pC}, processor);
380 }
381
382 /**
383 * Returns a new (partial) match.
384 * This can be used e.g. to call the matcher with a partial match.
385 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
386 * @param pC the fixed value of pattern parameter c, or null if not bound.
387 * @return the (partial) match object.
388 *
389 */
390 public MoreThenFiveSuperTypes.Match newMatch(final EClass pC) {
391 return MoreThenFiveSuperTypes.Match.newMatch(pC);
392 }
393
394 /**
395 * Retrieve the set of values that occur in matches for c.
396 * @return the Set of all values or empty set if there are no matches
397 *
398 */
399 protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) {
400 return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast);
401 }
402
403 /**
404 * Retrieve the set of values that occur in matches for c.
405 * @return the Set of all values or empty set if there are no matches
406 *
407 */
408 public Set<EClass> getAllValuesOfc() {
409 return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet());
410 }
411
412 /**
413 * Retrieve the set of values that occur in matches for c.
414 * @return the Set of all values or empty set if there are no matches
415 *
416 */
417 public Stream<EClass> streamAllValuesOfc() {
418 return rawStreamAllValuesOfc(emptyArray());
419 }
420
421 @Override
422 protected MoreThenFiveSuperTypes.Match tupleToMatch(final Tuple t) {
423 try {
424 return MoreThenFiveSuperTypes.Match.newMatch((EClass) t.get(POSITION_C));
425 } catch(ClassCastException e) {
426 LOGGER.error("Element(s) in tuple not properly typed!",e);
427 return null;
428 }
429 }
430
431 @Override
432 protected MoreThenFiveSuperTypes.Match arrayToMatch(final Object[] match) {
433 try {
434 return MoreThenFiveSuperTypes.Match.newMatch((EClass) match[POSITION_C]);
435 } catch(ClassCastException e) {
436 LOGGER.error("Element(s) in array not properly typed!",e);
437 return null;
438 }
439 }
440
441 @Override
442 protected MoreThenFiveSuperTypes.Match arrayToMatchMutable(final Object[] match) {
443 try {
444 return MoreThenFiveSuperTypes.Match.newMutableMatch((EClass) match[POSITION_C]);
445 } catch(ClassCastException e) {
446 LOGGER.error("Element(s) in array not properly typed!",e);
447 return null;
448 }
449 }
450
451 /**
452 * @return the singleton instance of the query specification of this pattern
453 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
454 *
455 */
456 public static IQuerySpecification<MoreThenFiveSuperTypes.Matcher> querySpecification() {
457 return MoreThenFiveSuperTypes.instance();
458 }
459 }
460
461 private MoreThenFiveSuperTypes() {
462 super(GeneratedPQuery.INSTANCE);
463 }
464
465 /**
466 * @return the singleton instance of the query specification
467 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
468 *
469 */
470 public static MoreThenFiveSuperTypes instance() {
471 try{
472 return LazyHolder.INSTANCE;
473 } catch (ExceptionInInitializerError err) {
474 throw processInitializerError(err);
475 }
476 }
477
478 @Override
479 protected MoreThenFiveSuperTypes.Matcher instantiate(final ViatraQueryEngine engine) {
480 return MoreThenFiveSuperTypes.Matcher.on(engine);
481 }
482
483 @Override
484 public MoreThenFiveSuperTypes.Matcher instantiate() {
485 return MoreThenFiveSuperTypes.Matcher.create();
486 }
487
488 @Override
489 public MoreThenFiveSuperTypes.Match newEmptyMatch() {
490 return MoreThenFiveSuperTypes.Match.newEmptyMatch();
491 }
492
493 @Override
494 public MoreThenFiveSuperTypes.Match newMatch(final Object... parameters) {
495 return MoreThenFiveSuperTypes.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0]);
496 }
497
498 /**
499 * Inner class allowing the singleton instance of {@link JvmGenericType: queries.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: queries.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
500 * <b>not</b> at the class load time of the outer class,
501 * but rather at the first call to {@link JvmGenericType: queries.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: queries.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
502 *
503 * <p> This workaround is required e.g. to support recursion.
504 *
505 */
506 private static class LazyHolder {
507 private static final MoreThenFiveSuperTypes INSTANCE = new MoreThenFiveSuperTypes();
508
509 /**
510 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
511 * This initialization order is required to support indirect recursion.
512 *
513 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
514 *
515 */
516 private static final Object STATIC_INITIALIZER = ensureInitialized();
517
518 public static Object ensureInitialized() {
519 INSTANCE.ensureInitializedInternal();
520 return null;
521 }
522 }
523
524 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
525 private static final MoreThenFiveSuperTypes.GeneratedPQuery INSTANCE = new GeneratedPQuery();
526
527 private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
528
529 private final List<PParameter> parameters = Arrays.asList(parameter_c);
530
531 private GeneratedPQuery() {
532 super(PVisibility.PUBLIC);
533 }
534
535 @Override
536 public String getFullyQualifiedName() {
537 return "queries.moreThenFiveSuperTypes";
538 }
539
540 @Override
541 public List<String> getParameterNames() {
542 return Arrays.asList("c");
543 }
544
545 @Override
546 public List<PParameter> getParameters() {
547 return parameters;
548 }
549
550 @Override
551 public Set<PBody> doGetContainedBodies() {
552 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
553 Set<PBody> bodies = new LinkedHashSet<>();
554 {
555 PBody body = new PBody(this);
556 PVariable var_c = body.getOrCreateVariableByName("c");
557 PVariable var_c1 = body.getOrCreateVariableByName("c1");
558 PVariable var_s1 = body.getOrCreateVariableByName("s1");
559 PVariable var_s2 = body.getOrCreateVariableByName("s2");
560 PVariable var_s3 = body.getOrCreateVariableByName("s3");
561 PVariable var_s4 = body.getOrCreateVariableByName("s4");
562 PVariable var_s5 = body.getOrCreateVariableByName("s5");
563 new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
564 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
565 new ExportedParameter(body, var_c, parameter_c)
566 ));
567 // find superTypes(c1, s1)
568 new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s1), SuperTypes.instance().getInternalQueryRepresentation());
569 // find superTypes(c1, s2)
570 new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s2), SuperTypes.instance().getInternalQueryRepresentation());
571 // find superTypes(c1, s3)
572 new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s3), SuperTypes.instance().getInternalQueryRepresentation());
573 // find superTypes(c1, s4)
574 new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s4), SuperTypes.instance().getInternalQueryRepresentation());
575 // find superTypes(c1, s5)
576 new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s5), SuperTypes.instance().getInternalQueryRepresentation());
577 // s1 != s2
578 new Inequality(body, var_s1, var_s2);
579 // s1 != s3
580 new Inequality(body, var_s1, var_s3);
581 // s1 != s4
582 new Inequality(body, var_s1, var_s4);
583 // s1 != s5
584 new Inequality(body, var_s1, var_s5);
585 // s2 != s3
586 new Inequality(body, var_s2, var_s3);
587 // s2 != s4
588 new Inequality(body, var_s2, var_s4);
589 // s2 != s5
590 new Inequality(body, var_s2, var_s5);
591 // s3 != s4
592 new Inequality(body, var_s3, var_s4);
593 // s3 != s5
594 new Inequality(body, var_s3, var_s5);
595 // s4 != s5
596 new Inequality(body, var_s4, var_s5);
597 bodies.add(body);
598 }
599 {
600 PAnnotation annotation = new PAnnotation("Constraint");
601 annotation.addAttribute("severity", "error");
602 annotation.addAttribute("message", "error");
603 annotation.addAttribute("key", Arrays.asList(new Object[] {
604 new ParameterReference("c")
605 }));
606 addAnnotation(annotation);
607 }
608 return bodies;
609 }
610 }
611}
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java
deleted file mode 100644
index 2e8a19d8..00000000
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java
+++ /dev/null
@@ -1,824 +0,0 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql
3 */
4package queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.EClass;
18import org.eclipse.viatra.query.runtime.api.IPatternMatch;
19import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
20import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
21import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
23import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
24import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
25import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
26import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
27import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
30import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * {@literal @}Constraint(severity="error", message="error", key = {c})
48 * pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) {
49 * EClass.eSuperTypes(c, s1);
50 * EClass.eSuperTypes(c, s2);
51 * s1 == s2;
52 * }
53 * </pre></code>
54 *
55 * @see Matcher
56 * @see Match
57 *
58 */
59@SuppressWarnings("all")
60public final class SameSuperClass extends BaseGeneratedEMFQuerySpecification<SameSuperClass.Matcher> {
61 /**
62 * Pattern-specific match representation of the queries.sameSuperClass pattern,
63 * to be used in conjunction with {@link Matcher}.
64 *
65 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
66 * Each instance is a (possibly partial) substitution of pattern parameters,
67 * usable to represent a match of the pattern in the result of a query,
68 * or to specify the bound (fixed) input parameters when issuing a query.
69 *
70 * @see Matcher
71 *
72 */
73 public static abstract class Match extends BasePatternMatch {
74 private EClass fC;
75
76 private EClass fS1;
77
78 private EClass fS2;
79
80 private static List<String> parameterNames = makeImmutableList("c", "s1", "s2");
81
82 private Match(final EClass pC, final EClass pS1, final EClass pS2) {
83 this.fC = pC;
84 this.fS1 = pS1;
85 this.fS2 = pS2;
86 }
87
88 @Override
89 public Object get(final String parameterName) {
90 if ("c".equals(parameterName)) return this.fC;
91 if ("s1".equals(parameterName)) return this.fS1;
92 if ("s2".equals(parameterName)) return this.fS2;
93 return null;
94 }
95
96 public EClass getC() {
97 return this.fC;
98 }
99
100 public EClass getS1() {
101 return this.fS1;
102 }
103
104 public EClass getS2() {
105 return this.fS2;
106 }
107
108 @Override
109 public boolean set(final String parameterName, final Object newValue) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 if ("c".equals(parameterName) ) {
112 this.fC = (EClass) newValue;
113 return true;
114 }
115 if ("s1".equals(parameterName) ) {
116 this.fS1 = (EClass) newValue;
117 return true;
118 }
119 if ("s2".equals(parameterName) ) {
120 this.fS2 = (EClass) newValue;
121 return true;
122 }
123 return false;
124 }
125
126 public void setC(final EClass pC) {
127 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
128 this.fC = pC;
129 }
130
131 public void setS1(final EClass pS1) {
132 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
133 this.fS1 = pS1;
134 }
135
136 public void setS2(final EClass pS2) {
137 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
138 this.fS2 = pS2;
139 }
140
141 @Override
142 public String patternName() {
143 return "queries.sameSuperClass";
144 }
145
146 @Override
147 public List<String> parameterNames() {
148 return SameSuperClass.Match.parameterNames;
149 }
150
151 @Override
152 public Object[] toArray() {
153 return new Object[]{fC, fS1, fS2};
154 }
155
156 @Override
157 public SameSuperClass.Match toImmutable() {
158 return isMutable() ? newMatch(fC, fS1, fS2) : this;
159 }
160
161 @Override
162 public String prettyPrint() {
163 StringBuilder result = new StringBuilder();
164 result.append("\"c\"=" + prettyPrintValue(fC) + ", ");
165 result.append("\"s1\"=" + prettyPrintValue(fS1) + ", ");
166 result.append("\"s2\"=" + prettyPrintValue(fS2));
167 return result.toString();
168 }
169
170 @Override
171 public int hashCode() {
172 return Objects.hash(fC, fS1, fS2);
173 }
174
175 @Override
176 public boolean equals(final Object obj) {
177 if (this == obj)
178 return true;
179 if (obj == null) {
180 return false;
181 }
182 if ((obj instanceof SameSuperClass.Match)) {
183 SameSuperClass.Match other = (SameSuperClass.Match) obj;
184 return Objects.equals(fC, other.fC) && Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2);
185 } else {
186 // this should be infrequent
187 if (!(obj instanceof IPatternMatch)) {
188 return false;
189 }
190 IPatternMatch otherSig = (IPatternMatch) obj;
191 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
192 }
193 }
194
195 @Override
196 public SameSuperClass specification() {
197 return SameSuperClass.instance();
198 }
199
200 /**
201 * Returns an empty, mutable match.
202 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
203 *
204 * @return the empty match.
205 *
206 */
207 public static SameSuperClass.Match newEmptyMatch() {
208 return new Mutable(null, null, null);
209 }
210
211 /**
212 * Returns a mutable (partial) match.
213 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
214 *
215 * @param pC the fixed value of pattern parameter c, or null if not bound.
216 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
217 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
218 * @return the new, mutable (partial) match object.
219 *
220 */
221 public static SameSuperClass.Match newMutableMatch(final EClass pC, final EClass pS1, final EClass pS2) {
222 return new Mutable(pC, pS1, pS2);
223 }
224
225 /**
226 * Returns a new (partial) match.
227 * This can be used e.g. to call the matcher with a partial match.
228 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
229 * @param pC the fixed value of pattern parameter c, or null if not bound.
230 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
231 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
232 * @return the (partial) match object.
233 *
234 */
235 public static SameSuperClass.Match newMatch(final EClass pC, final EClass pS1, final EClass pS2) {
236 return new Immutable(pC, pS1, pS2);
237 }
238
239 private static final class Mutable extends SameSuperClass.Match {
240 Mutable(final EClass pC, final EClass pS1, final EClass pS2) {
241 super(pC, pS1, pS2);
242 }
243
244 @Override
245 public boolean isMutable() {
246 return true;
247 }
248 }
249
250 private static final class Immutable extends SameSuperClass.Match {
251 Immutable(final EClass pC, final EClass pS1, final EClass pS2) {
252 super(pC, pS1, pS2);
253 }
254
255 @Override
256 public boolean isMutable() {
257 return false;
258 }
259 }
260 }
261
262 /**
263 * Generated pattern matcher API of the queries.sameSuperClass pattern,
264 * providing pattern-specific query methods.
265 *
266 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
267 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
268 *
269 * <p>Matches of the pattern will be represented as {@link Match}.
270 *
271 * <p>Original source:
272 * <code><pre>
273 * {@literal @}Constraint(severity="error", message="error", key = {c})
274 * pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) {
275 * EClass.eSuperTypes(c, s1);
276 * EClass.eSuperTypes(c, s2);
277 * s1 == s2;
278 * }
279 * </pre></code>
280 *
281 * @see Match
282 * @see SameSuperClass
283 *
284 */
285 public static class Matcher extends BaseMatcher<SameSuperClass.Match> {
286 /**
287 * Initializes the pattern matcher within an existing VIATRA Query engine.
288 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
289 *
290 * @param engine the existing VIATRA Query engine in which this matcher will be created.
291 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
292 *
293 */
294 public static SameSuperClass.Matcher on(final ViatraQueryEngine engine) {
295 // check if matcher already exists
296 Matcher matcher = engine.getExistingMatcher(querySpecification());
297 if (matcher == null) {
298 matcher = (Matcher)engine.getMatcher(querySpecification());
299 }
300 return matcher;
301 }
302
303 /**
304 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
305 * @return an initialized matcher
306 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
307 *
308 */
309 public static SameSuperClass.Matcher create() {
310 return new Matcher();
311 }
312
313 private static final int POSITION_C = 0;
314
315 private static final int POSITION_S1 = 1;
316
317 private static final int POSITION_S2 = 2;
318
319 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(SameSuperClass.Matcher.class);
320
321 /**
322 * Initializes the pattern matcher within an existing VIATRA Query engine.
323 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
324 *
325 * @param engine the existing VIATRA Query engine in which this matcher will be created.
326 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
327 *
328 */
329 private Matcher() {
330 super(querySpecification());
331 }
332
333 /**
334 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
335 * @param pC the fixed value of pattern parameter c, or null if not bound.
336 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
337 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
338 * @return matches represented as a Match object.
339 *
340 */
341 public Collection<SameSuperClass.Match> getAllMatches(final EClass pC, final EClass pS1, final EClass pS2) {
342 return rawStreamAllMatches(new Object[]{pC, pS1, pS2}).collect(Collectors.toSet());
343 }
344
345 /**
346 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
347 * </p>
348 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
349 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
350 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
351 * @param pC the fixed value of pattern parameter c, or null if not bound.
352 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
353 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
354 * @return a stream of matches represented as a Match object.
355 *
356 */
357 public Stream<SameSuperClass.Match> streamAllMatches(final EClass pC, final EClass pS1, final EClass pS2) {
358 return rawStreamAllMatches(new Object[]{pC, pS1, pS2});
359 }
360
361 /**
362 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
363 * Neither determinism nor randomness of selection is guaranteed.
364 * @param pC the fixed value of pattern parameter c, or null if not bound.
365 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
366 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
367 * @return a match represented as a Match object, or null if no match is found.
368 *
369 */
370 public Optional<SameSuperClass.Match> getOneArbitraryMatch(final EClass pC, final EClass pS1, final EClass pS2) {
371 return rawGetOneArbitraryMatch(new Object[]{pC, pS1, pS2});
372 }
373
374 /**
375 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
376 * under any possible substitution of the unspecified parameters (if any).
377 * @param pC the fixed value of pattern parameter c, or null if not bound.
378 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
379 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
380 * @return true if the input is a valid (partial) match of the pattern.
381 *
382 */
383 public boolean hasMatch(final EClass pC, final EClass pS1, final EClass pS2) {
384 return rawHasMatch(new Object[]{pC, pS1, pS2});
385 }
386
387 /**
388 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
389 * @param pC the fixed value of pattern parameter c, or null if not bound.
390 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
391 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
392 * @return the number of pattern matches found.
393 *
394 */
395 public int countMatches(final EClass pC, final EClass pS1, final EClass pS2) {
396 return rawCountMatches(new Object[]{pC, pS1, pS2});
397 }
398
399 /**
400 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
401 * Neither determinism nor randomness of selection is guaranteed.
402 * @param pC the fixed value of pattern parameter c, or null if not bound.
403 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
404 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
405 * @param processor the action that will process the selected match.
406 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
407 *
408 */
409 public boolean forOneArbitraryMatch(final EClass pC, final EClass pS1, final EClass pS2, final Consumer<? super SameSuperClass.Match> processor) {
410 return rawForOneArbitraryMatch(new Object[]{pC, pS1, pS2}, processor);
411 }
412
413 /**
414 * Returns a new (partial) match.
415 * This can be used e.g. to call the matcher with a partial match.
416 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
417 * @param pC the fixed value of pattern parameter c, or null if not bound.
418 * @param pS1 the fixed value of pattern parameter s1, or null if not bound.
419 * @param pS2 the fixed value of pattern parameter s2, or null if not bound.
420 * @return the (partial) match object.
421 *
422 */
423 public SameSuperClass.Match newMatch(final EClass pC, final EClass pS1, final EClass pS2) {
424 return SameSuperClass.Match.newMatch(pC, pS1, pS2);
425 }
426
427 /**
428 * Retrieve the set of values that occur in matches for c.
429 * @return the Set of all values or empty set if there are no matches
430 *
431 */
432 protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) {
433 return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast);
434 }
435
436 /**
437 * Retrieve the set of values that occur in matches for c.
438 * @return the Set of all values or empty set if there are no matches
439 *
440 */
441 public Set<EClass> getAllValuesOfc() {
442 return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet());
443 }
444
445 /**
446 * Retrieve the set of values that occur in matches for c.
447 * @return the Set of all values or empty set if there are no matches
448 *
449 */
450 public Stream<EClass> streamAllValuesOfc() {
451 return rawStreamAllValuesOfc(emptyArray());
452 }
453
454 /**
455 * Retrieve the set of values that occur in matches for c.
456 * </p>
457 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
458 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
459 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
460 *
461 * @return the Stream of all values or empty set if there are no matches
462 *
463 */
464 public Stream<EClass> streamAllValuesOfc(final SameSuperClass.Match partialMatch) {
465 return rawStreamAllValuesOfc(partialMatch.toArray());
466 }
467
468 /**
469 * Retrieve the set of values that occur in matches for c.
470 * </p>
471 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
472 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
473 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
474 *
475 * @return the Stream of all values or empty set if there are no matches
476 *
477 */
478 public Stream<EClass> streamAllValuesOfc(final EClass pS1, final EClass pS2) {
479 return rawStreamAllValuesOfc(new Object[]{null, pS1, pS2});
480 }
481
482 /**
483 * Retrieve the set of values that occur in matches for c.
484 * @return the Set of all values or empty set if there are no matches
485 *
486 */
487 public Set<EClass> getAllValuesOfc(final SameSuperClass.Match partialMatch) {
488 return rawStreamAllValuesOfc(partialMatch.toArray()).collect(Collectors.toSet());
489 }
490
491 /**
492 * Retrieve the set of values that occur in matches for c.
493 * @return the Set of all values or empty set if there are no matches
494 *
495 */
496 public Set<EClass> getAllValuesOfc(final EClass pS1, final EClass pS2) {
497 return rawStreamAllValuesOfc(new Object[]{null, pS1, pS2}).collect(Collectors.toSet());
498 }
499
500 /**
501 * Retrieve the set of values that occur in matches for s1.
502 * @return the Set of all values or empty set if there are no matches
503 *
504 */
505 protected Stream<EClass> rawStreamAllValuesOfs1(final Object[] parameters) {
506 return rawStreamAllValues(POSITION_S1, parameters).map(EClass.class::cast);
507 }
508
509 /**
510 * Retrieve the set of values that occur in matches for s1.
511 * @return the Set of all values or empty set if there are no matches
512 *
513 */
514 public Set<EClass> getAllValuesOfs1() {
515 return rawStreamAllValuesOfs1(emptyArray()).collect(Collectors.toSet());
516 }
517
518 /**
519 * Retrieve the set of values that occur in matches for s1.
520 * @return the Set of all values or empty set if there are no matches
521 *
522 */
523 public Stream<EClass> streamAllValuesOfs1() {
524 return rawStreamAllValuesOfs1(emptyArray());
525 }
526
527 /**
528 * Retrieve the set of values that occur in matches for s1.
529 * </p>
530 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
531 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
532 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
533 *
534 * @return the Stream of all values or empty set if there are no matches
535 *
536 */
537 public Stream<EClass> streamAllValuesOfs1(final SameSuperClass.Match partialMatch) {
538 return rawStreamAllValuesOfs1(partialMatch.toArray());
539 }
540
541 /**
542 * Retrieve the set of values that occur in matches for s1.
543 * </p>
544 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
545 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
546 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
547 *
548 * @return the Stream of all values or empty set if there are no matches
549 *
550 */
551 public Stream<EClass> streamAllValuesOfs1(final EClass pC, final EClass pS2) {
552 return rawStreamAllValuesOfs1(new Object[]{pC, null, pS2});
553 }
554
555 /**
556 * Retrieve the set of values that occur in matches for s1.
557 * @return the Set of all values or empty set if there are no matches
558 *
559 */
560 public Set<EClass> getAllValuesOfs1(final SameSuperClass.Match partialMatch) {
561 return rawStreamAllValuesOfs1(partialMatch.toArray()).collect(Collectors.toSet());
562 }
563
564 /**
565 * Retrieve the set of values that occur in matches for s1.
566 * @return the Set of all values or empty set if there are no matches
567 *
568 */
569 public Set<EClass> getAllValuesOfs1(final EClass pC, final EClass pS2) {
570 return rawStreamAllValuesOfs1(new Object[]{pC, null, pS2}).collect(Collectors.toSet());
571 }
572
573 /**
574 * Retrieve the set of values that occur in matches for s2.
575 * @return the Set of all values or empty set if there are no matches
576 *
577 */
578 protected Stream<EClass> rawStreamAllValuesOfs2(final Object[] parameters) {
579 return rawStreamAllValues(POSITION_S2, parameters).map(EClass.class::cast);
580 }
581
582 /**
583 * Retrieve the set of values that occur in matches for s2.
584 * @return the Set of all values or empty set if there are no matches
585 *
586 */
587 public Set<EClass> getAllValuesOfs2() {
588 return rawStreamAllValuesOfs2(emptyArray()).collect(Collectors.toSet());
589 }
590
591 /**
592 * Retrieve the set of values that occur in matches for s2.
593 * @return the Set of all values or empty set if there are no matches
594 *
595 */
596 public Stream<EClass> streamAllValuesOfs2() {
597 return rawStreamAllValuesOfs2(emptyArray());
598 }
599
600 /**
601 * Retrieve the set of values that occur in matches for s2.
602 * </p>
603 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
604 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
605 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
606 *
607 * @return the Stream of all values or empty set if there are no matches
608 *
609 */
610 public Stream<EClass> streamAllValuesOfs2(final SameSuperClass.Match partialMatch) {
611 return rawStreamAllValuesOfs2(partialMatch.toArray());
612 }
613
614 /**
615 * Retrieve the set of values that occur in matches for s2.
616 * </p>
617 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
618 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
619 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
620 *
621 * @return the Stream of all values or empty set if there are no matches
622 *
623 */
624 public Stream<EClass> streamAllValuesOfs2(final EClass pC, final EClass pS1) {
625 return rawStreamAllValuesOfs2(new Object[]{pC, pS1, null});
626 }
627
628 /**
629 * Retrieve the set of values that occur in matches for s2.
630 * @return the Set of all values or empty set if there are no matches
631 *
632 */
633 public Set<EClass> getAllValuesOfs2(final SameSuperClass.Match partialMatch) {
634 return rawStreamAllValuesOfs2(partialMatch.toArray()).collect(Collectors.toSet());
635 }
636
637 /**
638 * Retrieve the set of values that occur in matches for s2.
639 * @return the Set of all values or empty set if there are no matches
640 *
641 */
642 public Set<EClass> getAllValuesOfs2(final EClass pC, final EClass pS1) {
643 return rawStreamAllValuesOfs2(new Object[]{pC, pS1, null}).collect(Collectors.toSet());
644 }
645
646 @Override
647 protected SameSuperClass.Match tupleToMatch(final Tuple t) {
648 try {
649 return SameSuperClass.Match.newMatch((EClass) t.get(POSITION_C), (EClass) t.get(POSITION_S1), (EClass) t.get(POSITION_S2));
650 } catch(ClassCastException e) {
651 LOGGER.error("Element(s) in tuple not properly typed!",e);
652 return null;
653 }
654 }
655
656 @Override
657 protected SameSuperClass.Match arrayToMatch(final Object[] match) {
658 try {
659 return SameSuperClass.Match.newMatch((EClass) match[POSITION_C], (EClass) match[POSITION_S1], (EClass) match[POSITION_S2]);
660 } catch(ClassCastException e) {
661 LOGGER.error("Element(s) in array not properly typed!",e);
662 return null;
663 }
664 }
665
666 @Override
667 protected SameSuperClass.Match arrayToMatchMutable(final Object[] match) {
668 try {
669 return SameSuperClass.Match.newMutableMatch((EClass) match[POSITION_C], (EClass) match[POSITION_S1], (EClass) match[POSITION_S2]);
670 } catch(ClassCastException e) {
671 LOGGER.error("Element(s) in array not properly typed!",e);
672 return null;
673 }
674 }
675
676 /**
677 * @return the singleton instance of the query specification of this pattern
678 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
679 *
680 */
681 public static IQuerySpecification<SameSuperClass.Matcher> querySpecification() {
682 return SameSuperClass.instance();
683 }
684 }
685
686 private SameSuperClass() {
687 super(GeneratedPQuery.INSTANCE);
688 }
689
690 /**
691 * @return the singleton instance of the query specification
692 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
693 *
694 */
695 public static SameSuperClass instance() {
696 try{
697 return LazyHolder.INSTANCE;
698 } catch (ExceptionInInitializerError err) {
699 throw processInitializerError(err);
700 }
701 }
702
703 @Override
704 protected SameSuperClass.Matcher instantiate(final ViatraQueryEngine engine) {
705 return SameSuperClass.Matcher.on(engine);
706 }
707
708 @Override
709 public SameSuperClass.Matcher instantiate() {
710 return SameSuperClass.Matcher.create();
711 }
712
713 @Override
714 public SameSuperClass.Match newEmptyMatch() {
715 return SameSuperClass.Match.newEmptyMatch();
716 }
717
718 @Override
719 public SameSuperClass.Match newMatch(final Object... parameters) {
720 return SameSuperClass.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1], (org.eclipse.emf.ecore.EClass) parameters[2]);
721 }
722
723 /**
724 * Inner class allowing the singleton instance of {@link JvmGenericType: queries.SameSuperClass (visibility: PUBLIC, simpleName: SameSuperClass, identifier: queries.SameSuperClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
725 * <b>not</b> at the class load time of the outer class,
726 * but rather at the first call to {@link JvmGenericType: queries.SameSuperClass (visibility: PUBLIC, simpleName: SameSuperClass, identifier: queries.SameSuperClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
727 *
728 * <p> This workaround is required e.g. to support recursion.
729 *
730 */
731 private static class LazyHolder {
732 private static final SameSuperClass INSTANCE = new SameSuperClass();
733
734 /**
735 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
736 * This initialization order is required to support indirect recursion.
737 *
738 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
739 *
740 */
741 private static final Object STATIC_INITIALIZER = ensureInitialized();
742
743 public static Object ensureInitialized() {
744 INSTANCE.ensureInitializedInternal();
745 return null;
746 }
747 }
748
749 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
750 private static final SameSuperClass.GeneratedPQuery INSTANCE = new GeneratedPQuery();
751
752 private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
753
754 private final PParameter parameter_s1 = new PParameter("s1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
755
756 private final PParameter parameter_s2 = new PParameter("s2", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
757
758 private final List<PParameter> parameters = Arrays.asList(parameter_c, parameter_s1, parameter_s2);
759
760 private GeneratedPQuery() {
761 super(PVisibility.PUBLIC);
762 }
763
764 @Override
765 public String getFullyQualifiedName() {
766 return "queries.sameSuperClass";
767 }
768
769 @Override
770 public List<String> getParameterNames() {
771 return Arrays.asList("c","s1","s2");
772 }
773
774 @Override
775 public List<PParameter> getParameters() {
776 return parameters;
777 }
778
779 @Override
780 public Set<PBody> doGetContainedBodies() {
781 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
782 Set<PBody> bodies = new LinkedHashSet<>();
783 {
784 PBody body = new PBody(this);
785 PVariable var_c = body.getOrCreateVariableByName("c");
786 PVariable var_s1 = body.getOrCreateVariableByName("s1");
787 PVariable var_s2 = body.getOrCreateVariableByName("s2");
788 new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
789 new TypeConstraint(body, Tuples.flatTupleOf(var_s1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
790 new TypeConstraint(body, Tuples.flatTupleOf(var_s2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
791 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
792 new ExportedParameter(body, var_c, parameter_c),
793 new ExportedParameter(body, var_s1, parameter_s1),
794 new ExportedParameter(body, var_s2, parameter_s2)
795 ));
796 // EClass.eSuperTypes(c, s1)
797 new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
798 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
799 new TypeConstraint(body, Tuples.flatTupleOf(var_c, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes")));
800 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
801 new Equality(body, var__virtual_0_, var_s1);
802 // EClass.eSuperTypes(c, s2)
803 new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
804 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
805 new TypeConstraint(body, Tuples.flatTupleOf(var_c, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes")));
806 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
807 new Equality(body, var__virtual_1_, var_s2);
808 // s1 == s2
809 new Equality(body, var_s1, var_s2);
810 bodies.add(body);
811 }
812 {
813 PAnnotation annotation = new PAnnotation("Constraint");
814 annotation.addAttribute("severity", "error");
815 annotation.addAttribute("message", "error");
816 annotation.addAttribute("key", Arrays.asList(new Object[] {
817 new ParameterReference("c")
818 }));
819 addAnnotation(annotation);
820 }
821 return bodies;
822 }
823 }
824}
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java
new file mode 100644
index 00000000..823e55da
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java
@@ -0,0 +1,692 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/Ecore.vql
3 */
4package queries;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.EClass;
18import org.eclipse.viatra.query.runtime.api.IPatternMatch;
19import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
20import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
21import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
23import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
24import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
25import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
26import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
27import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
30import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
33import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
36import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
37import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
38import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
39
40/**
41 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
42 *
43 * <p>Original source:
44 * <code><pre>
45 * pattern superTypes(c1:EClass, c2:EClass){
46 * EClass.eSuperTypes(c1,c2);
47 * }
48 * </pre></code>
49 *
50 * @see Matcher
51 * @see Match
52 *
53 */
54@SuppressWarnings("all")
55public final class SuperTypes extends BaseGeneratedEMFQuerySpecification<SuperTypes.Matcher> {
56 /**
57 * Pattern-specific match representation of the queries.superTypes pattern,
58 * to be used in conjunction with {@link Matcher}.
59 *
60 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
61 * Each instance is a (possibly partial) substitution of pattern parameters,
62 * usable to represent a match of the pattern in the result of a query,
63 * or to specify the bound (fixed) input parameters when issuing a query.
64 *
65 * @see Matcher
66 *
67 */
68 public static abstract class Match extends BasePatternMatch {
69 private EClass fC1;
70
71 private EClass fC2;
72
73 private static List<String> parameterNames = makeImmutableList("c1", "c2");
74
75 private Match(final EClass pC1, final EClass pC2) {
76 this.fC1 = pC1;
77 this.fC2 = pC2;
78 }
79
80 @Override
81 public Object get(final String parameterName) {
82 if ("c1".equals(parameterName)) return this.fC1;
83 if ("c2".equals(parameterName)) return this.fC2;
84 return null;
85 }
86
87 public EClass getC1() {
88 return this.fC1;
89 }
90
91 public EClass getC2() {
92 return this.fC2;
93 }
94
95 @Override
96 public boolean set(final String parameterName, final Object newValue) {
97 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
98 if ("c1".equals(parameterName) ) {
99 this.fC1 = (EClass) newValue;
100 return true;
101 }
102 if ("c2".equals(parameterName) ) {
103 this.fC2 = (EClass) newValue;
104 return true;
105 }
106 return false;
107 }
108
109 public void setC1(final EClass pC1) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 this.fC1 = pC1;
112 }
113
114 public void setC2(final EClass pC2) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 this.fC2 = pC2;
117 }
118
119 @Override
120 public String patternName() {
121 return "queries.superTypes";
122 }
123
124 @Override
125 public List<String> parameterNames() {
126 return SuperTypes.Match.parameterNames;
127 }
128
129 @Override
130 public Object[] toArray() {
131 return new Object[]{fC1, fC2};
132 }
133
134 @Override
135 public SuperTypes.Match toImmutable() {
136 return isMutable() ? newMatch(fC1, fC2) : this;
137 }
138
139 @Override
140 public String prettyPrint() {
141 StringBuilder result = new StringBuilder();
142 result.append("\"c1\"=" + prettyPrintValue(fC1) + ", ");
143 result.append("\"c2\"=" + prettyPrintValue(fC2));
144 return result.toString();
145 }
146
147 @Override
148 public int hashCode() {
149 return Objects.hash(fC1, fC2);
150 }
151
152 @Override
153 public boolean equals(final Object obj) {
154 if (this == obj)
155 return true;
156 if (obj == null) {
157 return false;
158 }
159 if ((obj instanceof SuperTypes.Match)) {
160 SuperTypes.Match other = (SuperTypes.Match) obj;
161 return Objects.equals(fC1, other.fC1) && Objects.equals(fC2, other.fC2);
162 } else {
163 // this should be infrequent
164 if (!(obj instanceof IPatternMatch)) {
165 return false;
166 }
167 IPatternMatch otherSig = (IPatternMatch) obj;
168 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
169 }
170 }
171
172 @Override
173 public SuperTypes specification() {
174 return SuperTypes.instance();
175 }
176
177 /**
178 * Returns an empty, mutable match.
179 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
180 *
181 * @return the empty match.
182 *
183 */
184 public static SuperTypes.Match newEmptyMatch() {
185 return new Mutable(null, null);
186 }
187
188 /**
189 * Returns a mutable (partial) match.
190 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
191 *
192 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
193 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
194 * @return the new, mutable (partial) match object.
195 *
196 */
197 public static SuperTypes.Match newMutableMatch(final EClass pC1, final EClass pC2) {
198 return new Mutable(pC1, pC2);
199 }
200
201 /**
202 * Returns a new (partial) match.
203 * This can be used e.g. to call the matcher with a partial match.
204 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
205 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
206 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
207 * @return the (partial) match object.
208 *
209 */
210 public static SuperTypes.Match newMatch(final EClass pC1, final EClass pC2) {
211 return new Immutable(pC1, pC2);
212 }
213
214 private static final class Mutable extends SuperTypes.Match {
215 Mutable(final EClass pC1, final EClass pC2) {
216 super(pC1, pC2);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return true;
222 }
223 }
224
225 private static final class Immutable extends SuperTypes.Match {
226 Immutable(final EClass pC1, final EClass pC2) {
227 super(pC1, pC2);
228 }
229
230 @Override
231 public boolean isMutable() {
232 return false;
233 }
234 }
235 }
236
237 /**
238 * Generated pattern matcher API of the queries.superTypes pattern,
239 * providing pattern-specific query methods.
240 *
241 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
242 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
243 *
244 * <p>Matches of the pattern will be represented as {@link Match}.
245 *
246 * <p>Original source:
247 * <code><pre>
248 * pattern superTypes(c1:EClass, c2:EClass){
249 * EClass.eSuperTypes(c1,c2);
250 * }
251 * </pre></code>
252 *
253 * @see Match
254 * @see SuperTypes
255 *
256 */
257 public static class Matcher extends BaseMatcher<SuperTypes.Match> {
258 /**
259 * Initializes the pattern matcher within an existing VIATRA Query engine.
260 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
261 *
262 * @param engine the existing VIATRA Query engine in which this matcher will be created.
263 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
264 *
265 */
266 public static SuperTypes.Matcher on(final ViatraQueryEngine engine) {
267 // check if matcher already exists
268 Matcher matcher = engine.getExistingMatcher(querySpecification());
269 if (matcher == null) {
270 matcher = (Matcher)engine.getMatcher(querySpecification());
271 }
272 return matcher;
273 }
274
275 /**
276 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
277 * @return an initialized matcher
278 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
279 *
280 */
281 public static SuperTypes.Matcher create() {
282 return new Matcher();
283 }
284
285 private static final int POSITION_C1 = 0;
286
287 private static final int POSITION_C2 = 1;
288
289 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(SuperTypes.Matcher.class);
290
291 /**
292 * Initializes the pattern matcher within an existing VIATRA Query engine.
293 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
294 *
295 * @param engine the existing VIATRA Query engine in which this matcher will be created.
296 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
297 *
298 */
299 private Matcher() {
300 super(querySpecification());
301 }
302
303 /**
304 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
305 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
306 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
307 * @return matches represented as a Match object.
308 *
309 */
310 public Collection<SuperTypes.Match> getAllMatches(final EClass pC1, final EClass pC2) {
311 return rawStreamAllMatches(new Object[]{pC1, pC2}).collect(Collectors.toSet());
312 }
313
314 /**
315 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
316 * </p>
317 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
318 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
319 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
320 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
321 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
322 * @return a stream of matches represented as a Match object.
323 *
324 */
325 public Stream<SuperTypes.Match> streamAllMatches(final EClass pC1, final EClass pC2) {
326 return rawStreamAllMatches(new Object[]{pC1, pC2});
327 }
328
329 /**
330 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
331 * Neither determinism nor randomness of selection is guaranteed.
332 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
333 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
334 * @return a match represented as a Match object, or null if no match is found.
335 *
336 */
337 public Optional<SuperTypes.Match> getOneArbitraryMatch(final EClass pC1, final EClass pC2) {
338 return rawGetOneArbitraryMatch(new Object[]{pC1, pC2});
339 }
340
341 /**
342 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
343 * under any possible substitution of the unspecified parameters (if any).
344 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
345 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
346 * @return true if the input is a valid (partial) match of the pattern.
347 *
348 */
349 public boolean hasMatch(final EClass pC1, final EClass pC2) {
350 return rawHasMatch(new Object[]{pC1, pC2});
351 }
352
353 /**
354 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
355 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
356 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
357 * @return the number of pattern matches found.
358 *
359 */
360 public int countMatches(final EClass pC1, final EClass pC2) {
361 return rawCountMatches(new Object[]{pC1, pC2});
362 }
363
364 /**
365 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
366 * Neither determinism nor randomness of selection is guaranteed.
367 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
368 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
369 * @param processor the action that will process the selected match.
370 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
371 *
372 */
373 public boolean forOneArbitraryMatch(final EClass pC1, final EClass pC2, final Consumer<? super SuperTypes.Match> processor) {
374 return rawForOneArbitraryMatch(new Object[]{pC1, pC2}, processor);
375 }
376
377 /**
378 * Returns a new (partial) match.
379 * This can be used e.g. to call the matcher with a partial match.
380 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
381 * @param pC1 the fixed value of pattern parameter c1, or null if not bound.
382 * @param pC2 the fixed value of pattern parameter c2, or null if not bound.
383 * @return the (partial) match object.
384 *
385 */
386 public SuperTypes.Match newMatch(final EClass pC1, final EClass pC2) {
387 return SuperTypes.Match.newMatch(pC1, pC2);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for c1.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 protected Stream<EClass> rawStreamAllValuesOfc1(final Object[] parameters) {
396 return rawStreamAllValues(POSITION_C1, parameters).map(EClass.class::cast);
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for c1.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Set<EClass> getAllValuesOfc1() {
405 return rawStreamAllValuesOfc1(emptyArray()).collect(Collectors.toSet());
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for c1.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 public Stream<EClass> streamAllValuesOfc1() {
414 return rawStreamAllValuesOfc1(emptyArray());
415 }
416
417 /**
418 * Retrieve the set of values that occur in matches for c1.
419 * </p>
420 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
421 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
422 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
423 *
424 * @return the Stream of all values or empty set if there are no matches
425 *
426 */
427 public Stream<EClass> streamAllValuesOfc1(final SuperTypes.Match partialMatch) {
428 return rawStreamAllValuesOfc1(partialMatch.toArray());
429 }
430
431 /**
432 * Retrieve the set of values that occur in matches for c1.
433 * </p>
434 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
435 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
436 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
437 *
438 * @return the Stream of all values or empty set if there are no matches
439 *
440 */
441 public Stream<EClass> streamAllValuesOfc1(final EClass pC2) {
442 return rawStreamAllValuesOfc1(new Object[]{null, pC2});
443 }
444
445 /**
446 * Retrieve the set of values that occur in matches for c1.
447 * @return the Set of all values or empty set if there are no matches
448 *
449 */
450 public Set<EClass> getAllValuesOfc1(final SuperTypes.Match partialMatch) {
451 return rawStreamAllValuesOfc1(partialMatch.toArray()).collect(Collectors.toSet());
452 }
453
454 /**
455 * Retrieve the set of values that occur in matches for c1.
456 * @return the Set of all values or empty set if there are no matches
457 *
458 */
459 public Set<EClass> getAllValuesOfc1(final EClass pC2) {
460 return rawStreamAllValuesOfc1(new Object[]{null, pC2}).collect(Collectors.toSet());
461 }
462
463 /**
464 * Retrieve the set of values that occur in matches for c2.
465 * @return the Set of all values or empty set if there are no matches
466 *
467 */
468 protected Stream<EClass> rawStreamAllValuesOfc2(final Object[] parameters) {
469 return rawStreamAllValues(POSITION_C2, parameters).map(EClass.class::cast);
470 }
471
472 /**
473 * Retrieve the set of values that occur in matches for c2.
474 * @return the Set of all values or empty set if there are no matches
475 *
476 */
477 public Set<EClass> getAllValuesOfc2() {
478 return rawStreamAllValuesOfc2(emptyArray()).collect(Collectors.toSet());
479 }
480
481 /**
482 * Retrieve the set of values that occur in matches for c2.
483 * @return the Set of all values or empty set if there are no matches
484 *
485 */
486 public Stream<EClass> streamAllValuesOfc2() {
487 return rawStreamAllValuesOfc2(emptyArray());
488 }
489
490 /**
491 * Retrieve the set of values that occur in matches for c2.
492 * </p>
493 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
494 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
495 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
496 *
497 * @return the Stream of all values or empty set if there are no matches
498 *
499 */
500 public Stream<EClass> streamAllValuesOfc2(final SuperTypes.Match partialMatch) {
501 return rawStreamAllValuesOfc2(partialMatch.toArray());
502 }
503
504 /**
505 * Retrieve the set of values that occur in matches for c2.
506 * </p>
507 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
508 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
509 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
510 *
511 * @return the Stream of all values or empty set if there are no matches
512 *
513 */
514 public Stream<EClass> streamAllValuesOfc2(final EClass pC1) {
515 return rawStreamAllValuesOfc2(new Object[]{pC1, null});
516 }
517
518 /**
519 * Retrieve the set of values that occur in matches for c2.
520 * @return the Set of all values or empty set if there are no matches
521 *
522 */
523 public Set<EClass> getAllValuesOfc2(final SuperTypes.Match partialMatch) {
524 return rawStreamAllValuesOfc2(partialMatch.toArray()).collect(Collectors.toSet());
525 }
526
527 /**
528 * Retrieve the set of values that occur in matches for c2.
529 * @return the Set of all values or empty set if there are no matches
530 *
531 */
532 public Set<EClass> getAllValuesOfc2(final EClass pC1) {
533 return rawStreamAllValuesOfc2(new Object[]{pC1, null}).collect(Collectors.toSet());
534 }
535
536 @Override
537 protected SuperTypes.Match tupleToMatch(final Tuple t) {
538 try {
539 return SuperTypes.Match.newMatch((EClass) t.get(POSITION_C1), (EClass) t.get(POSITION_C2));
540 } catch(ClassCastException e) {
541 LOGGER.error("Element(s) in tuple not properly typed!",e);
542 return null;
543 }
544 }
545
546 @Override
547 protected SuperTypes.Match arrayToMatch(final Object[] match) {
548 try {
549 return SuperTypes.Match.newMatch((EClass) match[POSITION_C1], (EClass) match[POSITION_C2]);
550 } catch(ClassCastException e) {
551 LOGGER.error("Element(s) in array not properly typed!",e);
552 return null;
553 }
554 }
555
556 @Override
557 protected SuperTypes.Match arrayToMatchMutable(final Object[] match) {
558 try {
559 return SuperTypes.Match.newMutableMatch((EClass) match[POSITION_C1], (EClass) match[POSITION_C2]);
560 } catch(ClassCastException e) {
561 LOGGER.error("Element(s) in array not properly typed!",e);
562 return null;
563 }
564 }
565
566 /**
567 * @return the singleton instance of the query specification of this pattern
568 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
569 *
570 */
571 public static IQuerySpecification<SuperTypes.Matcher> querySpecification() {
572 return SuperTypes.instance();
573 }
574 }
575
576 private SuperTypes() {
577 super(GeneratedPQuery.INSTANCE);
578 }
579
580 /**
581 * @return the singleton instance of the query specification
582 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
583 *
584 */
585 public static SuperTypes instance() {
586 try{
587 return LazyHolder.INSTANCE;
588 } catch (ExceptionInInitializerError err) {
589 throw processInitializerError(err);
590 }
591 }
592
593 @Override
594 protected SuperTypes.Matcher instantiate(final ViatraQueryEngine engine) {
595 return SuperTypes.Matcher.on(engine);
596 }
597
598 @Override
599 public SuperTypes.Matcher instantiate() {
600 return SuperTypes.Matcher.create();
601 }
602
603 @Override
604 public SuperTypes.Match newEmptyMatch() {
605 return SuperTypes.Match.newEmptyMatch();
606 }
607
608 @Override
609 public SuperTypes.Match newMatch(final Object... parameters) {
610 return SuperTypes.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1]);
611 }
612
613 /**
614 * Inner class allowing the singleton instance of {@link JvmGenericType: queries.SuperTypes (visibility: PUBLIC, simpleName: SuperTypes, identifier: queries.SuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
615 * <b>not</b> at the class load time of the outer class,
616 * but rather at the first call to {@link JvmGenericType: queries.SuperTypes (visibility: PUBLIC, simpleName: SuperTypes, identifier: queries.SuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
617 *
618 * <p> This workaround is required e.g. to support recursion.
619 *
620 */
621 private static class LazyHolder {
622 private static final SuperTypes INSTANCE = new SuperTypes();
623
624 /**
625 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
626 * This initialization order is required to support indirect recursion.
627 *
628 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
629 *
630 */
631 private static final Object STATIC_INITIALIZER = ensureInitialized();
632
633 public static Object ensureInitialized() {
634 INSTANCE.ensureInitializedInternal();
635 return null;
636 }
637 }
638
639 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
640 private static final SuperTypes.GeneratedPQuery INSTANCE = new GeneratedPQuery();
641
642 private final PParameter parameter_c1 = new PParameter("c1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
643
644 private final PParameter parameter_c2 = new PParameter("c2", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
645
646 private final List<PParameter> parameters = Arrays.asList(parameter_c1, parameter_c2);
647
648 private GeneratedPQuery() {
649 super(PVisibility.PUBLIC);
650 }
651
652 @Override
653 public String getFullyQualifiedName() {
654 return "queries.superTypes";
655 }
656
657 @Override
658 public List<String> getParameterNames() {
659 return Arrays.asList("c1","c2");
660 }
661
662 @Override
663 public List<PParameter> getParameters() {
664 return parameters;
665 }
666
667 @Override
668 public Set<PBody> doGetContainedBodies() {
669 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
670 Set<PBody> bodies = new LinkedHashSet<>();
671 {
672 PBody body = new PBody(this);
673 PVariable var_c1 = body.getOrCreateVariableByName("c1");
674 PVariable var_c2 = body.getOrCreateVariableByName("c2");
675 new TypeConstraint(body, Tuples.flatTupleOf(var_c1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
676 new TypeConstraint(body, Tuples.flatTupleOf(var_c2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
677 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
678 new ExportedParameter(body, var_c1, parameter_c1),
679 new ExportedParameter(body, var_c2, parameter_c2)
680 ));
681 // EClass.eSuperTypes(c1,c2)
682 new TypeConstraint(body, Tuples.flatTupleOf(var_c1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
683 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
684 new TypeConstraint(body, Tuples.flatTupleOf(var_c1, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes")));
685 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
686 new Equality(body, var__virtual_0_, var_c2);
687 bodies.add(body);
688 }
689 return bodies;
690 }
691 }
692}
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig
index 4ce9da27..04351a6e 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig
@@ -9,19 +9,19 @@ generate {
9 solver = ViatraSolver 9 solver = ViatraSolver
10 10
11 scope = { 11 scope = {
12 #node = 98 12 #node = 30
13 } 13 }
14 14
15 number = 1 15 number = 1
16 runs = 1 16 runs = 100
17 config = { 17 config = {
18 log-level = none, 18 log-level = none,
19 "optional-wf" = "true", 19 "optional-wf" = "false",
20 "realistic-guidance" = "Composite", 20 "realistic-guidance" = "Composite",
21 "allow-must-violations" = "true", 21 "allow-must-violations" = "false",
22 "domain" = "Yakindumm" 22 "domain" = "Yakindumm"
23 } 23 }
24 24
25 debug = "debug" 25 debug = "debug"
26 output = "output/Viatra_100/" 26 output = "output/real_30+v/"
27} \ No newline at end of file 27} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF
index 138f034a..71eeb2c4 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF
@@ -18,7 +18,8 @@ Require-Bundle: com.google.guava,
18 org.eclipse.viatra.query.runtime.rete;bundle-version="2.1.2", 18 org.eclipse.viatra.query.runtime.rete;bundle-version="2.1.2",
19 org.eclipse.viatra.addon.validation.core;bundle-version="2.1.2", 19 org.eclipse.viatra.addon.validation.core;bundle-version="2.1.2",
20 org.eclipse.collections;bundle-version="9.2.0", 20 org.eclipse.collections;bundle-version="9.2.0",
21 org.eclipse.viatra.query.runtime.localsearch;bundle-version="2.1.2" 21 org.eclipse.viatra.query.runtime.localsearch;bundle-version="2.1.2",
22 org.apache.log4j;bundle-version="1.2.15"
22Export-Package: ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app, 23Export-Package: ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app,
23 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance, 24 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance,
24 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph, 25 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph,
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java
new file mode 100644
index 00000000..5243b104
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql
3*/
4package constraints.ecore;
5
6import java.util.Arrays;
7import java.util.HashMap;
8import java.util.HashSet;
9import java.util.List;
10import java.util.Map;
11import java.util.Set;
12
13import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
14import org.eclipse.viatra.addon.validation.core.api.Severity;
15import org.eclipse.viatra.query.runtime.api.IPatternMatch;
16import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
17import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher;
18
19import ecore.MoreThenFiveSuperTypes;
20
21public class MoreThenFiveSuperTypesConstraint0 implements IConstraintSpecification {
22
23 private MoreThenFiveSuperTypes querySpecification;
24
25 public MoreThenFiveSuperTypesConstraint0() {
26 querySpecification = MoreThenFiveSuperTypes.instance();
27 }
28
29 @Override
30 public String getMessageFormat() {
31 return "error";
32 }
33
34
35 @Override
36 public Map<String,Object> getKeyObjects(IPatternMatch signature) {
37 Map<String,Object> map = new HashMap<>();
38 map.put("c",signature.get("c"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "c"
46 );
47 return keyNames;
48 }
49
50 @Override
51 public List<String> getPropertyNames() {
52 List<String> propertyNames = Arrays.asList(
53 );
54 return propertyNames;
55 }
56
57 @Override
58 public Set<List<String>> getSymmetricPropertyNames() {
59 Set<List<String>> symmetricPropertyNamesSet = new HashSet<>();
60 return symmetricPropertyNamesSet;
61 }
62
63 @Override
64 public Set<List<String>> getSymmetricKeyNames() {
65 Set<List<String>> symmetricKeyNamesSet = new HashSet<>();
66 return symmetricKeyNamesSet;
67 }
68
69 @Override
70 public Severity getSeverity() {
71 return Severity.ERROR;
72 }
73
74 @Override
75 public IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> getQuerySpecification() {
76 return querySpecification;
77 }
78
79}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore
new file mode 100644
index 00000000..c42ca056
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore
@@ -0,0 +1,8 @@
1/.Ecore_pattern.java._trace
2/.MoreThenFiveSuperTypes.java._trace
3/.DirectSupertype.java._trace
4/.Ecore.java._trace
5/.LoopInInheritence.java._trace
6/.NonSymmetricOpposite.java._trace
7/.Opposite.java._trace
8/.OppositeDifferentClass.java._trace
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java
new file mode 100644
index 00000000..a6ffad45
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java
@@ -0,0 +1,692 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql
3 */
4package ecore;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.EClass;
18import org.eclipse.viatra.query.runtime.api.IPatternMatch;
19import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
20import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
21import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
23import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
24import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
25import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
26import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
27import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
30import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
33import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
36import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
37import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
38import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
39
40/**
41 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
42 *
43 * <p>Original source:
44 * <code><pre>
45 * pattern directSupertype(a: EClass, b:EClass) {
46 * EClass.eSuperTypes(a,b);
47 * }
48 * </pre></code>
49 *
50 * @see Matcher
51 * @see Match
52 *
53 */
54@SuppressWarnings("all")
55public final class DirectSupertype extends BaseGeneratedEMFQuerySpecification<DirectSupertype.Matcher> {
56 /**
57 * Pattern-specific match representation of the ecore.directSupertype pattern,
58 * to be used in conjunction with {@link Matcher}.
59 *
60 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
61 * Each instance is a (possibly partial) substitution of pattern parameters,
62 * usable to represent a match of the pattern in the result of a query,
63 * or to specify the bound (fixed) input parameters when issuing a query.
64 *
65 * @see Matcher
66 *
67 */
68 public static abstract class Match extends BasePatternMatch {
69 private EClass fA;
70
71 private EClass fB;
72
73 private static List<String> parameterNames = makeImmutableList("a", "b");
74
75 private Match(final EClass pA, final EClass pB) {
76 this.fA = pA;
77 this.fB = pB;
78 }
79
80 @Override
81 public Object get(final String parameterName) {
82 if ("a".equals(parameterName)) return this.fA;
83 if ("b".equals(parameterName)) return this.fB;
84 return null;
85 }
86
87 public EClass getA() {
88 return this.fA;
89 }
90
91 public EClass getB() {
92 return this.fB;
93 }
94
95 @Override
96 public boolean set(final String parameterName, final Object newValue) {
97 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
98 if ("a".equals(parameterName) ) {
99 this.fA = (EClass) newValue;
100 return true;
101 }
102 if ("b".equals(parameterName) ) {
103 this.fB = (EClass) newValue;
104 return true;
105 }
106 return false;
107 }
108
109 public void setA(final EClass pA) {
110 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
111 this.fA = pA;
112 }
113
114 public void setB(final EClass pB) {
115 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
116 this.fB = pB;
117 }
118
119 @Override
120 public String patternName() {
121 return "ecore.directSupertype";
122 }
123
124 @Override
125 public List<String> parameterNames() {
126 return DirectSupertype.Match.parameterNames;
127 }
128
129 @Override
130 public Object[] toArray() {
131 return new Object[]{fA, fB};
132 }
133
134 @Override
135 public DirectSupertype.Match toImmutable() {
136 return isMutable() ? newMatch(fA, fB) : this;
137 }
138
139 @Override
140 public String prettyPrint() {
141 StringBuilder result = new StringBuilder();
142 result.append("\"a\"=" + prettyPrintValue(fA) + ", ");
143 result.append("\"b\"=" + prettyPrintValue(fB));
144 return result.toString();
145 }
146
147 @Override
148 public int hashCode() {
149 return Objects.hash(fA, fB);
150 }
151
152 @Override
153 public boolean equals(final Object obj) {
154 if (this == obj)
155 return true;
156 if (obj == null) {
157 return false;
158 }
159 if ((obj instanceof DirectSupertype.Match)) {
160 DirectSupertype.Match other = (DirectSupertype.Match) obj;
161 return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB);
162 } else {
163 // this should be infrequent
164 if (!(obj instanceof IPatternMatch)) {
165 return false;
166 }
167 IPatternMatch otherSig = (IPatternMatch) obj;
168 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
169 }
170 }
171
172 @Override
173 public DirectSupertype specification() {
174 return DirectSupertype.instance();
175 }
176
177 /**
178 * Returns an empty, mutable match.
179 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
180 *
181 * @return the empty match.
182 *
183 */
184 public static DirectSupertype.Match newEmptyMatch() {
185 return new Mutable(null, null);
186 }
187
188 /**
189 * Returns a mutable (partial) match.
190 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
191 *
192 * @param pA the fixed value of pattern parameter a, or null if not bound.
193 * @param pB the fixed value of pattern parameter b, or null if not bound.
194 * @return the new, mutable (partial) match object.
195 *
196 */
197 public static DirectSupertype.Match newMutableMatch(final EClass pA, final EClass pB) {
198 return new Mutable(pA, pB);
199 }
200
201 /**
202 * Returns a new (partial) match.
203 * This can be used e.g. to call the matcher with a partial match.
204 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
205 * @param pA the fixed value of pattern parameter a, or null if not bound.
206 * @param pB the fixed value of pattern parameter b, or null if not bound.
207 * @return the (partial) match object.
208 *
209 */
210 public static DirectSupertype.Match newMatch(final EClass pA, final EClass pB) {
211 return new Immutable(pA, pB);
212 }
213
214 private static final class Mutable extends DirectSupertype.Match {
215 Mutable(final EClass pA, final EClass pB) {
216 super(pA, pB);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return true;
222 }
223 }
224
225 private static final class Immutable extends DirectSupertype.Match {
226 Immutable(final EClass pA, final EClass pB) {
227 super(pA, pB);
228 }
229
230 @Override
231 public boolean isMutable() {
232 return false;
233 }
234 }
235 }
236
237 /**
238 * Generated pattern matcher API of the ecore.directSupertype pattern,
239 * providing pattern-specific query methods.
240 *
241 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
242 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
243 *
244 * <p>Matches of the pattern will be represented as {@link Match}.
245 *
246 * <p>Original source:
247 * <code><pre>
248 * pattern directSupertype(a: EClass, b:EClass) {
249 * EClass.eSuperTypes(a,b);
250 * }
251 * </pre></code>
252 *
253 * @see Match
254 * @see DirectSupertype
255 *
256 */
257 public static class Matcher extends BaseMatcher<DirectSupertype.Match> {
258 /**
259 * Initializes the pattern matcher within an existing VIATRA Query engine.
260 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
261 *
262 * @param engine the existing VIATRA Query engine in which this matcher will be created.
263 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
264 *
265 */
266 public static DirectSupertype.Matcher on(final ViatraQueryEngine engine) {
267 // check if matcher already exists
268 Matcher matcher = engine.getExistingMatcher(querySpecification());
269 if (matcher == null) {
270 matcher = (Matcher)engine.getMatcher(querySpecification());
271 }
272 return matcher;
273 }
274
275 /**
276 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
277 * @return an initialized matcher
278 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
279 *
280 */
281 public static DirectSupertype.Matcher create() {
282 return new Matcher();
283 }
284
285 private static final int POSITION_A = 0;
286
287 private static final int POSITION_B = 1;
288
289 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(DirectSupertype.Matcher.class);
290
291 /**
292 * Initializes the pattern matcher within an existing VIATRA Query engine.
293 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
294 *
295 * @param engine the existing VIATRA Query engine in which this matcher will be created.
296 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
297 *
298 */
299 private Matcher() {
300 super(querySpecification());
301 }
302
303 /**
304 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
305 * @param pA the fixed value of pattern parameter a, or null if not bound.
306 * @param pB the fixed value of pattern parameter b, or null if not bound.
307 * @return matches represented as a Match object.
308 *
309 */
310 public Collection<DirectSupertype.Match> getAllMatches(final EClass pA, final EClass pB) {
311 return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet());
312 }
313
314 /**
315 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
316 * </p>
317 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
318 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
319 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
320 * @param pA the fixed value of pattern parameter a, or null if not bound.
321 * @param pB the fixed value of pattern parameter b, or null if not bound.
322 * @return a stream of matches represented as a Match object.
323 *
324 */
325 public Stream<DirectSupertype.Match> streamAllMatches(final EClass pA, final EClass pB) {
326 return rawStreamAllMatches(new Object[]{pA, pB});
327 }
328
329 /**
330 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
331 * Neither determinism nor randomness of selection is guaranteed.
332 * @param pA the fixed value of pattern parameter a, or null if not bound.
333 * @param pB the fixed value of pattern parameter b, or null if not bound.
334 * @return a match represented as a Match object, or null if no match is found.
335 *
336 */
337 public Optional<DirectSupertype.Match> getOneArbitraryMatch(final EClass pA, final EClass pB) {
338 return rawGetOneArbitraryMatch(new Object[]{pA, pB});
339 }
340
341 /**
342 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
343 * under any possible substitution of the unspecified parameters (if any).
344 * @param pA the fixed value of pattern parameter a, or null if not bound.
345 * @param pB the fixed value of pattern parameter b, or null if not bound.
346 * @return true if the input is a valid (partial) match of the pattern.
347 *
348 */
349 public boolean hasMatch(final EClass pA, final EClass pB) {
350 return rawHasMatch(new Object[]{pA, pB});
351 }
352
353 /**
354 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
355 * @param pA the fixed value of pattern parameter a, or null if not bound.
356 * @param pB the fixed value of pattern parameter b, or null if not bound.
357 * @return the number of pattern matches found.
358 *
359 */
360 public int countMatches(final EClass pA, final EClass pB) {
361 return rawCountMatches(new Object[]{pA, pB});
362 }
363
364 /**
365 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
366 * Neither determinism nor randomness of selection is guaranteed.
367 * @param pA the fixed value of pattern parameter a, or null if not bound.
368 * @param pB the fixed value of pattern parameter b, or null if not bound.
369 * @param processor the action that will process the selected match.
370 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
371 *
372 */
373 public boolean forOneArbitraryMatch(final EClass pA, final EClass pB, final Consumer<? super DirectSupertype.Match> processor) {
374 return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor);
375 }
376
377 /**
378 * Returns a new (partial) match.
379 * This can be used e.g. to call the matcher with a partial match.
380 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
381 * @param pA the fixed value of pattern parameter a, or null if not bound.
382 * @param pB the fixed value of pattern parameter b, or null if not bound.
383 * @return the (partial) match object.
384 *
385 */
386 public DirectSupertype.Match newMatch(final EClass pA, final EClass pB) {
387 return DirectSupertype.Match.newMatch(pA, pB);
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for a.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 protected Stream<EClass> rawStreamAllValuesOfa(final Object[] parameters) {
396 return rawStreamAllValues(POSITION_A, parameters).map(EClass.class::cast);
397 }
398
399 /**
400 * Retrieve the set of values that occur in matches for a.
401 * @return the Set of all values or empty set if there are no matches
402 *
403 */
404 public Set<EClass> getAllValuesOfa() {
405 return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet());
406 }
407
408 /**
409 * Retrieve the set of values that occur in matches for a.
410 * @return the Set of all values or empty set if there are no matches
411 *
412 */
413 public Stream<EClass> streamAllValuesOfa() {
414 return rawStreamAllValuesOfa(emptyArray());
415 }
416
417 /**
418 * Retrieve the set of values that occur in matches for a.
419 * </p>
420 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
421 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
422 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
423 *
424 * @return the Stream of all values or empty set if there are no matches
425 *
426 */
427 public Stream<EClass> streamAllValuesOfa(final DirectSupertype.Match partialMatch) {
428 return rawStreamAllValuesOfa(partialMatch.toArray());
429 }
430
431 /**
432 * Retrieve the set of values that occur in matches for a.
433 * </p>
434 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
435 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
436 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
437 *
438 * @return the Stream of all values or empty set if there are no matches
439 *
440 */
441 public Stream<EClass> streamAllValuesOfa(final EClass pB) {
442 return rawStreamAllValuesOfa(new Object[]{null, pB});
443 }
444
445 /**
446 * Retrieve the set of values that occur in matches for a.
447 * @return the Set of all values or empty set if there are no matches
448 *
449 */
450 public Set<EClass> getAllValuesOfa(final DirectSupertype.Match partialMatch) {
451 return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet());
452 }
453
454 /**
455 * Retrieve the set of values that occur in matches for a.
456 * @return the Set of all values or empty set if there are no matches
457 *
458 */
459 public Set<EClass> getAllValuesOfa(final EClass pB) {
460 return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet());
461 }
462
463 /**
464 * Retrieve the set of values that occur in matches for b.
465 * @return the Set of all values or empty set if there are no matches
466 *
467 */
468 protected Stream<EClass> rawStreamAllValuesOfb(final Object[] parameters) {
469 return rawStreamAllValues(POSITION_B, parameters).map(EClass.class::cast);
470 }
471
472 /**
473 * Retrieve the set of values that occur in matches for b.
474 * @return the Set of all values or empty set if there are no matches
475 *
476 */
477 public Set<EClass> getAllValuesOfb() {
478 return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet());
479 }
480
481 /**
482 * Retrieve the set of values that occur in matches for b.
483 * @return the Set of all values or empty set if there are no matches
484 *
485 */
486 public Stream<EClass> streamAllValuesOfb() {
487 return rawStreamAllValuesOfb(emptyArray());
488 }
489
490 /**
491 * Retrieve the set of values that occur in matches for b.
492 * </p>
493 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
494 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
495 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
496 *
497 * @return the Stream of all values or empty set if there are no matches
498 *
499 */
500 public Stream<EClass> streamAllValuesOfb(final DirectSupertype.Match partialMatch) {
501 return rawStreamAllValuesOfb(partialMatch.toArray());
502 }
503
504 /**
505 * Retrieve the set of values that occur in matches for b.
506 * </p>
507 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
508 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
509 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
510 *
511 * @return the Stream of all values or empty set if there are no matches
512 *
513 */
514 public Stream<EClass> streamAllValuesOfb(final EClass pA) {
515 return rawStreamAllValuesOfb(new Object[]{pA, null});
516 }
517
518 /**
519 * Retrieve the set of values that occur in matches for b.
520 * @return the Set of all values or empty set if there are no matches
521 *
522 */
523 public Set<EClass> getAllValuesOfb(final DirectSupertype.Match partialMatch) {
524 return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet());
525 }
526
527 /**
528 * Retrieve the set of values that occur in matches for b.
529 * @return the Set of all values or empty set if there are no matches
530 *
531 */
532 public Set<EClass> getAllValuesOfb(final EClass pA) {
533 return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet());
534 }
535
536 @Override
537 protected DirectSupertype.Match tupleToMatch(final Tuple t) {
538 try {
539 return DirectSupertype.Match.newMatch((EClass) t.get(POSITION_A), (EClass) t.get(POSITION_B));
540 } catch(ClassCastException e) {
541 LOGGER.error("Element(s) in tuple not properly typed!",e);
542 return null;
543 }
544 }
545
546 @Override
547 protected DirectSupertype.Match arrayToMatch(final Object[] match) {
548 try {
549 return DirectSupertype.Match.newMatch((EClass) match[POSITION_A], (EClass) match[POSITION_B]);
550 } catch(ClassCastException e) {
551 LOGGER.error("Element(s) in array not properly typed!",e);
552 return null;
553 }
554 }
555
556 @Override
557 protected DirectSupertype.Match arrayToMatchMutable(final Object[] match) {
558 try {
559 return DirectSupertype.Match.newMutableMatch((EClass) match[POSITION_A], (EClass) match[POSITION_B]);
560 } catch(ClassCastException e) {
561 LOGGER.error("Element(s) in array not properly typed!",e);
562 return null;
563 }
564 }
565
566 /**
567 * @return the singleton instance of the query specification of this pattern
568 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
569 *
570 */
571 public static IQuerySpecification<DirectSupertype.Matcher> querySpecification() {
572 return DirectSupertype.instance();
573 }
574 }
575
576 private DirectSupertype() {
577 super(GeneratedPQuery.INSTANCE);
578 }
579
580 /**
581 * @return the singleton instance of the query specification
582 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
583 *
584 */
585 public static DirectSupertype instance() {
586 try{
587 return LazyHolder.INSTANCE;
588 } catch (ExceptionInInitializerError err) {
589 throw processInitializerError(err);
590 }
591 }
592
593 @Override
594 protected DirectSupertype.Matcher instantiate(final ViatraQueryEngine engine) {
595 return DirectSupertype.Matcher.on(engine);
596 }
597
598 @Override
599 public DirectSupertype.Matcher instantiate() {
600 return DirectSupertype.Matcher.create();
601 }
602
603 @Override
604 public DirectSupertype.Match newEmptyMatch() {
605 return DirectSupertype.Match.newEmptyMatch();
606 }
607
608 @Override
609 public DirectSupertype.Match newMatch(final Object... parameters) {
610 return DirectSupertype.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1]);
611 }
612
613 /**
614 * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.DirectSupertype (visibility: PUBLIC, simpleName: DirectSupertype, identifier: ecore.DirectSupertype, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
615 * <b>not</b> at the class load time of the outer class,
616 * but rather at the first call to {@link JvmGenericType: ecore.DirectSupertype (visibility: PUBLIC, simpleName: DirectSupertype, identifier: ecore.DirectSupertype, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
617 *
618 * <p> This workaround is required e.g. to support recursion.
619 *
620 */
621 private static class LazyHolder {
622 private static final DirectSupertype INSTANCE = new DirectSupertype();
623
624 /**
625 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
626 * This initialization order is required to support indirect recursion.
627 *
628 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
629 *
630 */
631 private static final Object STATIC_INITIALIZER = ensureInitialized();
632
633 public static Object ensureInitialized() {
634 INSTANCE.ensureInitializedInternal();
635 return null;
636 }
637 }
638
639 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
640 private static final DirectSupertype.GeneratedPQuery INSTANCE = new GeneratedPQuery();
641
642 private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
643
644 private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
645
646 private final List<PParameter> parameters = Arrays.asList(parameter_a, parameter_b);
647
648 private GeneratedPQuery() {
649 super(PVisibility.PUBLIC);
650 }
651
652 @Override
653 public String getFullyQualifiedName() {
654 return "ecore.directSupertype";
655 }
656
657 @Override
658 public List<String> getParameterNames() {
659 return Arrays.asList("a","b");
660 }
661
662 @Override
663 public List<PParameter> getParameters() {
664 return parameters;
665 }
666
667 @Override
668 public Set<PBody> doGetContainedBodies() {
669 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
670 Set<PBody> bodies = new LinkedHashSet<>();
671 {
672 PBody body = new PBody(this);
673 PVariable var_a = body.getOrCreateVariableByName("a");
674 PVariable var_b = body.getOrCreateVariableByName("b");
675 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
676 new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
677 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
678 new ExportedParameter(body, var_a, parameter_a),
679 new ExportedParameter(body, var_b, parameter_b)
680 ));
681 // EClass.eSuperTypes(a,b)
682 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
683 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
684 new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes")));
685 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
686 new Equality(body, var__virtual_0_, var_b);
687 bodies.add(body);
688 }
689 return bodies;
690 }
691 }
692}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java
new file mode 100644
index 00000000..bca43a17
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java
@@ -0,0 +1,97 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql
3 */
4package ecore;
5
6import ecore.DirectSupertype;
7import ecore.LoopInInheritence;
8import ecore.NonSymmetricOpposite;
9import ecore.Opposite;
10import ecore.OppositeDifferentClass;
11import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
12import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup;
13
14/**
15 * A pattern group formed of all public patterns defined in Ecore.vql.
16 *
17 * <p>Use the static instance as any {@link interface org.eclipse.viatra.query.runtime.api.IQueryGroup}, to conveniently prepare
18 * a VIATRA Query engine for matching all patterns originally defined in file Ecore.vql,
19 * in order to achieve better performance than one-by-one on-demand matcher initialization.
20 *
21 * <p> From package ecore, the group contains the definition of the following patterns: <ul>
22 * <li>directSupertype</li>
23 * <li>loopInInheritence</li>
24 * <li>opposite</li>
25 * <li>oppositeDifferentClass</li>
26 * <li>nonSymmetricOpposite</li>
27 * </ul>
28 *
29 * @see IQueryGroup
30 *
31 */
32@SuppressWarnings("all")
33public final class Ecore extends BaseGeneratedPatternGroup {
34 /**
35 * Access the pattern group.
36 *
37 * @return the singleton instance of the group
38 * @throws ViatraQueryRuntimeException if there was an error loading the generated code of pattern specifications
39 *
40 */
41 public static Ecore instance() {
42 if (INSTANCE == null) {
43 INSTANCE = new Ecore();
44 }
45 return INSTANCE;
46 }
47
48 private static Ecore INSTANCE;
49
50 private Ecore() {
51 querySpecifications.add(DirectSupertype.instance());
52 querySpecifications.add(LoopInInheritence.instance());
53 querySpecifications.add(Opposite.instance());
54 querySpecifications.add(OppositeDifferentClass.instance());
55 querySpecifications.add(NonSymmetricOpposite.instance());
56 }
57
58 public DirectSupertype getDirectSupertype() {
59 return DirectSupertype.instance();
60 }
61
62 public DirectSupertype.Matcher getDirectSupertype(final ViatraQueryEngine engine) {
63 return DirectSupertype.Matcher.on(engine);
64 }
65
66 public LoopInInheritence getLoopInInheritence() {
67 return LoopInInheritence.instance();
68 }
69
70 public LoopInInheritence.Matcher getLoopInInheritence(final ViatraQueryEngine engine) {
71 return LoopInInheritence.Matcher.on(engine);
72 }
73
74 public Opposite getOpposite() {
75 return Opposite.instance();
76 }
77
78 public Opposite.Matcher getOpposite(final ViatraQueryEngine engine) {
79 return Opposite.Matcher.on(engine);
80 }
81
82 public OppositeDifferentClass getOppositeDifferentClass() {
83 return OppositeDifferentClass.instance();
84 }
85
86 public OppositeDifferentClass.Matcher getOppositeDifferentClass(final ViatraQueryEngine engine) {
87 return OppositeDifferentClass.Matcher.on(engine);
88 }
89
90 public NonSymmetricOpposite getNonSymmetricOpposite() {
91 return NonSymmetricOpposite.instance();
92 }
93
94 public NonSymmetricOpposite.Matcher getNonSymmetricOpposite(final ViatraQueryEngine engine) {
95 return NonSymmetricOpposite.Matcher.on(engine);
96 }
97}
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore_pattern.java
index e2627646..6da94486 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore_pattern.java
@@ -1,11 +1,11 @@
1/** 1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql 2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/ecore_pattern.vql
3 */ 3 */
4package queries; 4package ecore;
5 5
6import ecore.MoreThenFiveSuperTypes;
6import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; 7import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
7import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; 8import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup;
8import queries.SameSuperClass;
9 9
10/** 10/**
11 * A pattern group formed of all public patterns defined in ecore_pattern.vql. 11 * A pattern group formed of all public patterns defined in ecore_pattern.vql.
@@ -14,8 +14,8 @@ import queries.SameSuperClass;
14 * a VIATRA Query engine for matching all patterns originally defined in file ecore_pattern.vql, 14 * a VIATRA Query engine for matching all patterns originally defined in file ecore_pattern.vql,
15 * in order to achieve better performance than one-by-one on-demand matcher initialization. 15 * in order to achieve better performance than one-by-one on-demand matcher initialization.
16 * 16 *
17 * <p> From package queries, the group contains the definition of the following patterns: <ul> 17 * <p> From package ecore, the group contains the definition of the following patterns: <ul>
18 * <li>sameSuperClass</li> 18 * <li>moreThenFiveSuperTypes</li>
19 * </ul> 19 * </ul>
20 * 20 *
21 * @see IQueryGroup 21 * @see IQueryGroup
@@ -40,14 +40,14 @@ public final class Ecore_pattern extends BaseGeneratedPatternGroup {
40 private static Ecore_pattern INSTANCE; 40 private static Ecore_pattern INSTANCE;
41 41
42 private Ecore_pattern() { 42 private Ecore_pattern() {
43 querySpecifications.add(SameSuperClass.instance()); 43 querySpecifications.add(MoreThenFiveSuperTypes.instance());
44 } 44 }
45 45
46 public SameSuperClass getSameSuperClass() { 46 public MoreThenFiveSuperTypes getMoreThenFiveSuperTypes() {
47 return SameSuperClass.instance(); 47 return MoreThenFiveSuperTypes.instance();
48 } 48 }
49 49
50 public SameSuperClass.Matcher getSameSuperClass(final ViatraQueryEngine engine) { 50 public MoreThenFiveSuperTypes.Matcher getMoreThenFiveSuperTypes(final ViatraQueryEngine engine) {
51 return SameSuperClass.Matcher.on(engine); 51 return MoreThenFiveSuperTypes.Matcher.on(engine);
52 } 52 }
53} 53}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java
new file mode 100644
index 00000000..fb14941f
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java
@@ -0,0 +1,548 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql
3 */
4package ecore;
5
6import ecore.DirectSupertype;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
28import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
30import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
40import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
41
42/**
43 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
44 *
45 * <p>Original source:
46 * <code><pre>
47 * {@literal @}Constraint(key={a}, severity="error", message="error")
48 * pattern loopInInheritence(a: EClass) {
49 * find directSupertype+(a,a);
50 * }
51 * </pre></code>
52 *
53 * @see Matcher
54 * @see Match
55 *
56 */
57@SuppressWarnings("all")
58public final class LoopInInheritence extends BaseGeneratedEMFQuerySpecification<LoopInInheritence.Matcher> {
59 /**
60 * Pattern-specific match representation of the ecore.loopInInheritence pattern,
61 * to be used in conjunction with {@link Matcher}.
62 *
63 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
64 * Each instance is a (possibly partial) substitution of pattern parameters,
65 * usable to represent a match of the pattern in the result of a query,
66 * or to specify the bound (fixed) input parameters when issuing a query.
67 *
68 * @see Matcher
69 *
70 */
71 public static abstract class Match extends BasePatternMatch {
72 private EClass fA;
73
74 private static List<String> parameterNames = makeImmutableList("a");
75
76 private Match(final EClass pA) {
77 this.fA = pA;
78 }
79
80 @Override
81 public Object get(final String parameterName) {
82 if ("a".equals(parameterName)) return this.fA;
83 return null;
84 }
85
86 public EClass getA() {
87 return this.fA;
88 }
89
90 @Override
91 public boolean set(final String parameterName, final Object newValue) {
92 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
93 if ("a".equals(parameterName) ) {
94 this.fA = (EClass) newValue;
95 return true;
96 }
97 return false;
98 }
99
100 public void setA(final EClass pA) {
101 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
102 this.fA = pA;
103 }
104
105 @Override
106 public String patternName() {
107 return "ecore.loopInInheritence";
108 }
109
110 @Override
111 public List<String> parameterNames() {
112 return LoopInInheritence.Match.parameterNames;
113 }
114
115 @Override
116 public Object[] toArray() {
117 return new Object[]{fA};
118 }
119
120 @Override
121 public LoopInInheritence.Match toImmutable() {
122 return isMutable() ? newMatch(fA) : this;
123 }
124
125 @Override
126 public String prettyPrint() {
127 StringBuilder result = new StringBuilder();
128 result.append("\"a\"=" + prettyPrintValue(fA));
129 return result.toString();
130 }
131
132 @Override
133 public int hashCode() {
134 return Objects.hash(fA);
135 }
136
137 @Override
138 public boolean equals(final Object obj) {
139 if (this == obj)
140 return true;
141 if (obj == null) {
142 return false;
143 }
144 if ((obj instanceof LoopInInheritence.Match)) {
145 LoopInInheritence.Match other = (LoopInInheritence.Match) obj;
146 return Objects.equals(fA, other.fA);
147 } else {
148 // this should be infrequent
149 if (!(obj instanceof IPatternMatch)) {
150 return false;
151 }
152 IPatternMatch otherSig = (IPatternMatch) obj;
153 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
154 }
155 }
156
157 @Override
158 public LoopInInheritence specification() {
159 return LoopInInheritence.instance();
160 }
161
162 /**
163 * Returns an empty, mutable match.
164 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
165 *
166 * @return the empty match.
167 *
168 */
169 public static LoopInInheritence.Match newEmptyMatch() {
170 return new Mutable(null);
171 }
172
173 /**
174 * Returns a mutable (partial) match.
175 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
176 *
177 * @param pA the fixed value of pattern parameter a, or null if not bound.
178 * @return the new, mutable (partial) match object.
179 *
180 */
181 public static LoopInInheritence.Match newMutableMatch(final EClass pA) {
182 return new Mutable(pA);
183 }
184
185 /**
186 * Returns a new (partial) match.
187 * This can be used e.g. to call the matcher with a partial match.
188 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
189 * @param pA the fixed value of pattern parameter a, or null if not bound.
190 * @return the (partial) match object.
191 *
192 */
193 public static LoopInInheritence.Match newMatch(final EClass pA) {
194 return new Immutable(pA);
195 }
196
197 private static final class Mutable extends LoopInInheritence.Match {
198 Mutable(final EClass pA) {
199 super(pA);
200 }
201
202 @Override
203 public boolean isMutable() {
204 return true;
205 }
206 }
207
208 private static final class Immutable extends LoopInInheritence.Match {
209 Immutable(final EClass pA) {
210 super(pA);
211 }
212
213 @Override
214 public boolean isMutable() {
215 return false;
216 }
217 }
218 }
219
220 /**
221 * Generated pattern matcher API of the ecore.loopInInheritence pattern,
222 * providing pattern-specific query methods.
223 *
224 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
225 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
226 *
227 * <p>Matches of the pattern will be represented as {@link Match}.
228 *
229 * <p>Original source:
230 * <code><pre>
231 * {@literal @}Constraint(key={a}, severity="error", message="error")
232 * pattern loopInInheritence(a: EClass) {
233 * find directSupertype+(a,a);
234 * }
235 * </pre></code>
236 *
237 * @see Match
238 * @see LoopInInheritence
239 *
240 */
241 public static class Matcher extends BaseMatcher<LoopInInheritence.Match> {
242 /**
243 * Initializes the pattern matcher within an existing VIATRA Query engine.
244 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
245 *
246 * @param engine the existing VIATRA Query engine in which this matcher will be created.
247 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
248 *
249 */
250 public static LoopInInheritence.Matcher on(final ViatraQueryEngine engine) {
251 // check if matcher already exists
252 Matcher matcher = engine.getExistingMatcher(querySpecification());
253 if (matcher == null) {
254 matcher = (Matcher)engine.getMatcher(querySpecification());
255 }
256 return matcher;
257 }
258
259 /**
260 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
261 * @return an initialized matcher
262 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
263 *
264 */
265 public static LoopInInheritence.Matcher create() {
266 return new Matcher();
267 }
268
269 private static final int POSITION_A = 0;
270
271 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(LoopInInheritence.Matcher.class);
272
273 /**
274 * Initializes the pattern matcher within an existing VIATRA Query engine.
275 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
276 *
277 * @param engine the existing VIATRA Query engine in which this matcher will be created.
278 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
279 *
280 */
281 private Matcher() {
282 super(querySpecification());
283 }
284
285 /**
286 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
287 * @param pA the fixed value of pattern parameter a, or null if not bound.
288 * @return matches represented as a Match object.
289 *
290 */
291 public Collection<LoopInInheritence.Match> getAllMatches(final EClass pA) {
292 return rawStreamAllMatches(new Object[]{pA}).collect(Collectors.toSet());
293 }
294
295 /**
296 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
297 * </p>
298 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
299 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
300 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
301 * @param pA the fixed value of pattern parameter a, or null if not bound.
302 * @return a stream of matches represented as a Match object.
303 *
304 */
305 public Stream<LoopInInheritence.Match> streamAllMatches(final EClass pA) {
306 return rawStreamAllMatches(new Object[]{pA});
307 }
308
309 /**
310 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
311 * Neither determinism nor randomness of selection is guaranteed.
312 * @param pA the fixed value of pattern parameter a, or null if not bound.
313 * @return a match represented as a Match object, or null if no match is found.
314 *
315 */
316 public Optional<LoopInInheritence.Match> getOneArbitraryMatch(final EClass pA) {
317 return rawGetOneArbitraryMatch(new Object[]{pA});
318 }
319
320 /**
321 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
322 * under any possible substitution of the unspecified parameters (if any).
323 * @param pA the fixed value of pattern parameter a, or null if not bound.
324 * @return true if the input is a valid (partial) match of the pattern.
325 *
326 */
327 public boolean hasMatch(final EClass pA) {
328 return rawHasMatch(new Object[]{pA});
329 }
330
331 /**
332 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
333 * @param pA the fixed value of pattern parameter a, or null if not bound.
334 * @return the number of pattern matches found.
335 *
336 */
337 public int countMatches(final EClass pA) {
338 return rawCountMatches(new Object[]{pA});
339 }
340
341 /**
342 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
343 * Neither determinism nor randomness of selection is guaranteed.
344 * @param pA the fixed value of pattern parameter a, or null if not bound.
345 * @param processor the action that will process the selected match.
346 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
347 *
348 */
349 public boolean forOneArbitraryMatch(final EClass pA, final Consumer<? super LoopInInheritence.Match> processor) {
350 return rawForOneArbitraryMatch(new Object[]{pA}, processor);
351 }
352
353 /**
354 * Returns a new (partial) match.
355 * This can be used e.g. to call the matcher with a partial match.
356 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
357 * @param pA the fixed value of pattern parameter a, or null if not bound.
358 * @return the (partial) match object.
359 *
360 */
361 public LoopInInheritence.Match newMatch(final EClass pA) {
362 return LoopInInheritence.Match.newMatch(pA);
363 }
364
365 /**
366 * Retrieve the set of values that occur in matches for a.
367 * @return the Set of all values or empty set if there are no matches
368 *
369 */
370 protected Stream<EClass> rawStreamAllValuesOfa(final Object[] parameters) {
371 return rawStreamAllValues(POSITION_A, parameters).map(EClass.class::cast);
372 }
373
374 /**
375 * Retrieve the set of values that occur in matches for a.
376 * @return the Set of all values or empty set if there are no matches
377 *
378 */
379 public Set<EClass> getAllValuesOfa() {
380 return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet());
381 }
382
383 /**
384 * Retrieve the set of values that occur in matches for a.
385 * @return the Set of all values or empty set if there are no matches
386 *
387 */
388 public Stream<EClass> streamAllValuesOfa() {
389 return rawStreamAllValuesOfa(emptyArray());
390 }
391
392 @Override
393 protected LoopInInheritence.Match tupleToMatch(final Tuple t) {
394 try {
395 return LoopInInheritence.Match.newMatch((EClass) t.get(POSITION_A));
396 } catch(ClassCastException e) {
397 LOGGER.error("Element(s) in tuple not properly typed!",e);
398 return null;
399 }
400 }
401
402 @Override
403 protected LoopInInheritence.Match arrayToMatch(final Object[] match) {
404 try {
405 return LoopInInheritence.Match.newMatch((EClass) match[POSITION_A]);
406 } catch(ClassCastException e) {
407 LOGGER.error("Element(s) in array not properly typed!",e);
408 return null;
409 }
410 }
411
412 @Override
413 protected LoopInInheritence.Match arrayToMatchMutable(final Object[] match) {
414 try {
415 return LoopInInheritence.Match.newMutableMatch((EClass) match[POSITION_A]);
416 } catch(ClassCastException e) {
417 LOGGER.error("Element(s) in array not properly typed!",e);
418 return null;
419 }
420 }
421
422 /**
423 * @return the singleton instance of the query specification of this pattern
424 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
425 *
426 */
427 public static IQuerySpecification<LoopInInheritence.Matcher> querySpecification() {
428 return LoopInInheritence.instance();
429 }
430 }
431
432 private LoopInInheritence() {
433 super(GeneratedPQuery.INSTANCE);
434 }
435
436 /**
437 * @return the singleton instance of the query specification
438 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
439 *
440 */
441 public static LoopInInheritence instance() {
442 try{
443 return LazyHolder.INSTANCE;
444 } catch (ExceptionInInitializerError err) {
445 throw processInitializerError(err);
446 }
447 }
448
449 @Override
450 protected LoopInInheritence.Matcher instantiate(final ViatraQueryEngine engine) {
451 return LoopInInheritence.Matcher.on(engine);
452 }
453
454 @Override
455 public LoopInInheritence.Matcher instantiate() {
456 return LoopInInheritence.Matcher.create();
457 }
458
459 @Override
460 public LoopInInheritence.Match newEmptyMatch() {
461 return LoopInInheritence.Match.newEmptyMatch();
462 }
463
464 @Override
465 public LoopInInheritence.Match newMatch(final Object... parameters) {
466 return LoopInInheritence.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0]);
467 }
468
469 /**
470 * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.LoopInInheritence (visibility: PUBLIC, simpleName: LoopInInheritence, identifier: ecore.LoopInInheritence, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
471 * <b>not</b> at the class load time of the outer class,
472 * but rather at the first call to {@link JvmGenericType: ecore.LoopInInheritence (visibility: PUBLIC, simpleName: LoopInInheritence, identifier: ecore.LoopInInheritence, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
473 *
474 * <p> This workaround is required e.g. to support recursion.
475 *
476 */
477 private static class LazyHolder {
478 private static final LoopInInheritence INSTANCE = new LoopInInheritence();
479
480 /**
481 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
482 * This initialization order is required to support indirect recursion.
483 *
484 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
485 *
486 */
487 private static final Object STATIC_INITIALIZER = ensureInitialized();
488
489 public static Object ensureInitialized() {
490 INSTANCE.ensureInitializedInternal();
491 return null;
492 }
493 }
494
495 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
496 private static final LoopInInheritence.GeneratedPQuery INSTANCE = new GeneratedPQuery();
497
498 private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
499
500 private final List<PParameter> parameters = Arrays.asList(parameter_a);
501
502 private GeneratedPQuery() {
503 super(PVisibility.PUBLIC);
504 }
505
506 @Override
507 public String getFullyQualifiedName() {
508 return "ecore.loopInInheritence";
509 }
510
511 @Override
512 public List<String> getParameterNames() {
513 return Arrays.asList("a");
514 }
515
516 @Override
517 public List<PParameter> getParameters() {
518 return parameters;
519 }
520
521 @Override
522 public Set<PBody> doGetContainedBodies() {
523 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
524 Set<PBody> bodies = new LinkedHashSet<>();
525 {
526 PBody body = new PBody(this);
527 PVariable var_a = body.getOrCreateVariableByName("a");
528 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
529 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
530 new ExportedParameter(body, var_a, parameter_a)
531 ));
532 // find directSupertype+(a,a)
533 new BinaryTransitiveClosure(body, Tuples.flatTupleOf(var_a, var_a), DirectSupertype.instance().getInternalQueryRepresentation());
534 bodies.add(body);
535 }
536 {
537 PAnnotation annotation = new PAnnotation("Constraint");
538 annotation.addAttribute("key", Arrays.asList(new Object[] {
539 new ParameterReference("a")
540 }));
541 annotation.addAttribute("severity", "error");
542 annotation.addAttribute("message", "error");
543 addAnnotation(annotation);
544 }
545 return bodies;
546 }
547 }
548}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java
new file mode 100644
index 00000000..da64d899
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java
@@ -0,0 +1,621 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/ecore_pattern.vql
3 */
4package ecore;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.Collections;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.IExpressionEvaluator;
30import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider;
31import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
32import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
33import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
34import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation;
38import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter;
39import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
40import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
41import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
42import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
43import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
44import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
45import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
46
47/**
48 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
49 *
50 * <p>Original source:
51 * <code><pre>
52 * {@literal @}Constraint(severity="error", message="error", key = {c})
53 * pattern moreThenFiveSuperTypes(c: EClass){
54 * m == count EClass.eSuperTypes(c,_);
55 * check(m {@literal >}= 5);
56 * }
57 * </pre></code>
58 *
59 * @see Matcher
60 * @see Match
61 *
62 */
63@SuppressWarnings("all")
64public final class MoreThenFiveSuperTypes extends BaseGeneratedEMFQuerySpecification<MoreThenFiveSuperTypes.Matcher> {
65 /**
66 * Pattern-specific match representation of the ecore.moreThenFiveSuperTypes pattern,
67 * to be used in conjunction with {@link Matcher}.
68 *
69 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
70 * Each instance is a (possibly partial) substitution of pattern parameters,
71 * usable to represent a match of the pattern in the result of a query,
72 * or to specify the bound (fixed) input parameters when issuing a query.
73 *
74 * @see Matcher
75 *
76 */
77 public static abstract class Match extends BasePatternMatch {
78 private EClass fC;
79
80 private static List<String> parameterNames = makeImmutableList("c");
81
82 private Match(final EClass pC) {
83 this.fC = pC;
84 }
85
86 @Override
87 public Object get(final String parameterName) {
88 if ("c".equals(parameterName)) return this.fC;
89 return null;
90 }
91
92 public EClass getC() {
93 return this.fC;
94 }
95
96 @Override
97 public boolean set(final String parameterName, final Object newValue) {
98 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
99 if ("c".equals(parameterName) ) {
100 this.fC = (EClass) newValue;
101 return true;
102 }
103 return false;
104 }
105
106 public void setC(final EClass pC) {
107 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
108 this.fC = pC;
109 }
110
111 @Override
112 public String patternName() {
113 return "ecore.moreThenFiveSuperTypes";
114 }
115
116 @Override
117 public List<String> parameterNames() {
118 return MoreThenFiveSuperTypes.Match.parameterNames;
119 }
120
121 @Override
122 public Object[] toArray() {
123 return new Object[]{fC};
124 }
125
126 @Override
127 public MoreThenFiveSuperTypes.Match toImmutable() {
128 return isMutable() ? newMatch(fC) : this;
129 }
130
131 @Override
132 public String prettyPrint() {
133 StringBuilder result = new StringBuilder();
134 result.append("\"c\"=" + prettyPrintValue(fC));
135 return result.toString();
136 }
137
138 @Override
139 public int hashCode() {
140 return Objects.hash(fC);
141 }
142
143 @Override
144 public boolean equals(final Object obj) {
145 if (this == obj)
146 return true;
147 if (obj == null) {
148 return false;
149 }
150 if ((obj instanceof MoreThenFiveSuperTypes.Match)) {
151 MoreThenFiveSuperTypes.Match other = (MoreThenFiveSuperTypes.Match) obj;
152 return Objects.equals(fC, other.fC);
153 } else {
154 // this should be infrequent
155 if (!(obj instanceof IPatternMatch)) {
156 return false;
157 }
158 IPatternMatch otherSig = (IPatternMatch) obj;
159 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
160 }
161 }
162
163 @Override
164 public MoreThenFiveSuperTypes specification() {
165 return MoreThenFiveSuperTypes.instance();
166 }
167
168 /**
169 * Returns an empty, mutable match.
170 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
171 *
172 * @return the empty match.
173 *
174 */
175 public static MoreThenFiveSuperTypes.Match newEmptyMatch() {
176 return new Mutable(null);
177 }
178
179 /**
180 * Returns a mutable (partial) match.
181 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
182 *
183 * @param pC the fixed value of pattern parameter c, or null if not bound.
184 * @return the new, mutable (partial) match object.
185 *
186 */
187 public static MoreThenFiveSuperTypes.Match newMutableMatch(final EClass pC) {
188 return new Mutable(pC);
189 }
190
191 /**
192 * Returns a new (partial) match.
193 * This can be used e.g. to call the matcher with a partial match.
194 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
195 * @param pC the fixed value of pattern parameter c, or null if not bound.
196 * @return the (partial) match object.
197 *
198 */
199 public static MoreThenFiveSuperTypes.Match newMatch(final EClass pC) {
200 return new Immutable(pC);
201 }
202
203 private static final class Mutable extends MoreThenFiveSuperTypes.Match {
204 Mutable(final EClass pC) {
205 super(pC);
206 }
207
208 @Override
209 public boolean isMutable() {
210 return true;
211 }
212 }
213
214 private static final class Immutable extends MoreThenFiveSuperTypes.Match {
215 Immutable(final EClass pC) {
216 super(pC);
217 }
218
219 @Override
220 public boolean isMutable() {
221 return false;
222 }
223 }
224 }
225
226 /**
227 * Generated pattern matcher API of the ecore.moreThenFiveSuperTypes pattern,
228 * providing pattern-specific query methods.
229 *
230 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
231 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
232 *
233 * <p>Matches of the pattern will be represented as {@link Match}.
234 *
235 * <p>Original source:
236 * <code><pre>
237 * {@literal @}Constraint(severity="error", message="error", key = {c})
238 * pattern moreThenFiveSuperTypes(c: EClass){
239 * m == count EClass.eSuperTypes(c,_);
240 * check(m {@literal >}= 5);
241 * }
242 * </pre></code>
243 *
244 * @see Match
245 * @see MoreThenFiveSuperTypes
246 *
247 */
248 public static class Matcher extends BaseMatcher<MoreThenFiveSuperTypes.Match> {
249 /**
250 * Initializes the pattern matcher within an existing VIATRA Query engine.
251 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
252 *
253 * @param engine the existing VIATRA Query engine in which this matcher will be created.
254 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
255 *
256 */
257 public static MoreThenFiveSuperTypes.Matcher on(final ViatraQueryEngine engine) {
258 // check if matcher already exists
259 Matcher matcher = engine.getExistingMatcher(querySpecification());
260 if (matcher == null) {
261 matcher = (Matcher)engine.getMatcher(querySpecification());
262 }
263 return matcher;
264 }
265
266 /**
267 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
268 * @return an initialized matcher
269 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
270 *
271 */
272 public static MoreThenFiveSuperTypes.Matcher create() {
273 return new Matcher();
274 }
275
276 private static final int POSITION_C = 0;
277
278 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(MoreThenFiveSuperTypes.Matcher.class);
279
280 /**
281 * Initializes the pattern matcher within an existing VIATRA Query engine.
282 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
283 *
284 * @param engine the existing VIATRA Query engine in which this matcher will be created.
285 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
286 *
287 */
288 private Matcher() {
289 super(querySpecification());
290 }
291
292 /**
293 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
294 * @param pC the fixed value of pattern parameter c, or null if not bound.
295 * @return matches represented as a Match object.
296 *
297 */
298 public Collection<MoreThenFiveSuperTypes.Match> getAllMatches(final EClass pC) {
299 return rawStreamAllMatches(new Object[]{pC}).collect(Collectors.toSet());
300 }
301
302 /**
303 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
304 * </p>
305 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
306 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
307 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
308 * @param pC the fixed value of pattern parameter c, or null if not bound.
309 * @return a stream of matches represented as a Match object.
310 *
311 */
312 public Stream<MoreThenFiveSuperTypes.Match> streamAllMatches(final EClass pC) {
313 return rawStreamAllMatches(new Object[]{pC});
314 }
315
316 /**
317 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
318 * Neither determinism nor randomness of selection is guaranteed.
319 * @param pC the fixed value of pattern parameter c, or null if not bound.
320 * @return a match represented as a Match object, or null if no match is found.
321 *
322 */
323 public Optional<MoreThenFiveSuperTypes.Match> getOneArbitraryMatch(final EClass pC) {
324 return rawGetOneArbitraryMatch(new Object[]{pC});
325 }
326
327 /**
328 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
329 * under any possible substitution of the unspecified parameters (if any).
330 * @param pC the fixed value of pattern parameter c, or null if not bound.
331 * @return true if the input is a valid (partial) match of the pattern.
332 *
333 */
334 public boolean hasMatch(final EClass pC) {
335 return rawHasMatch(new Object[]{pC});
336 }
337
338 /**
339 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
340 * @param pC the fixed value of pattern parameter c, or null if not bound.
341 * @return the number of pattern matches found.
342 *
343 */
344 public int countMatches(final EClass pC) {
345 return rawCountMatches(new Object[]{pC});
346 }
347
348 /**
349 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
350 * Neither determinism nor randomness of selection is guaranteed.
351 * @param pC the fixed value of pattern parameter c, or null if not bound.
352 * @param processor the action that will process the selected match.
353 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
354 *
355 */
356 public boolean forOneArbitraryMatch(final EClass pC, final Consumer<? super MoreThenFiveSuperTypes.Match> processor) {
357 return rawForOneArbitraryMatch(new Object[]{pC}, processor);
358 }
359
360 /**
361 * Returns a new (partial) match.
362 * This can be used e.g. to call the matcher with a partial match.
363 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
364 * @param pC the fixed value of pattern parameter c, or null if not bound.
365 * @return the (partial) match object.
366 *
367 */
368 public MoreThenFiveSuperTypes.Match newMatch(final EClass pC) {
369 return MoreThenFiveSuperTypes.Match.newMatch(pC);
370 }
371
372 /**
373 * Retrieve the set of values that occur in matches for c.
374 * @return the Set of all values or empty set if there are no matches
375 *
376 */
377 protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) {
378 return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast);
379 }
380
381 /**
382 * Retrieve the set of values that occur in matches for c.
383 * @return the Set of all values or empty set if there are no matches
384 *
385 */
386 public Set<EClass> getAllValuesOfc() {
387 return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet());
388 }
389
390 /**
391 * Retrieve the set of values that occur in matches for c.
392 * @return the Set of all values or empty set if there are no matches
393 *
394 */
395 public Stream<EClass> streamAllValuesOfc() {
396 return rawStreamAllValuesOfc(emptyArray());
397 }
398
399 @Override
400 protected MoreThenFiveSuperTypes.Match tupleToMatch(final Tuple t) {
401 try {
402 return MoreThenFiveSuperTypes.Match.newMatch((EClass) t.get(POSITION_C));
403 } catch(ClassCastException e) {
404 LOGGER.error("Element(s) in tuple not properly typed!",e);
405 return null;
406 }
407 }
408
409 @Override
410 protected MoreThenFiveSuperTypes.Match arrayToMatch(final Object[] match) {
411 try {
412 return MoreThenFiveSuperTypes.Match.newMatch((EClass) match[POSITION_C]);
413 } catch(ClassCastException e) {
414 LOGGER.error("Element(s) in array not properly typed!",e);
415 return null;
416 }
417 }
418
419 @Override
420 protected MoreThenFiveSuperTypes.Match arrayToMatchMutable(final Object[] match) {
421 try {
422 return MoreThenFiveSuperTypes.Match.newMutableMatch((EClass) match[POSITION_C]);
423 } catch(ClassCastException e) {
424 LOGGER.error("Element(s) in array not properly typed!",e);
425 return null;
426 }
427 }
428
429 /**
430 * @return the singleton instance of the query specification of this pattern
431 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
432 *
433 */
434 public static IQuerySpecification<MoreThenFiveSuperTypes.Matcher> querySpecification() {
435 return MoreThenFiveSuperTypes.instance();
436 }
437 }
438
439 private MoreThenFiveSuperTypes() {
440 super(GeneratedPQuery.INSTANCE);
441 }
442
443 /**
444 * @return the singleton instance of the query specification
445 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
446 *
447 */
448 public static MoreThenFiveSuperTypes instance() {
449 try{
450 return LazyHolder.INSTANCE;
451 } catch (ExceptionInInitializerError err) {
452 throw processInitializerError(err);
453 }
454 }
455
456 @Override
457 protected MoreThenFiveSuperTypes.Matcher instantiate(final ViatraQueryEngine engine) {
458 return MoreThenFiveSuperTypes.Matcher.on(engine);
459 }
460
461 @Override
462 public MoreThenFiveSuperTypes.Matcher instantiate() {
463 return MoreThenFiveSuperTypes.Matcher.create();
464 }
465
466 @Override
467 public MoreThenFiveSuperTypes.Match newEmptyMatch() {
468 return MoreThenFiveSuperTypes.Match.newEmptyMatch();
469 }
470
471 @Override
472 public MoreThenFiveSuperTypes.Match newMatch(final Object... parameters) {
473 return MoreThenFiveSuperTypes.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0]);
474 }
475
476 /**
477 * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: ecore.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
478 * <b>not</b> at the class load time of the outer class,
479 * but rather at the first call to {@link JvmGenericType: ecore.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: ecore.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
480 *
481 * <p> This workaround is required e.g. to support recursion.
482 *
483 */
484 private static class LazyHolder {
485 private static final MoreThenFiveSuperTypes INSTANCE = new MoreThenFiveSuperTypes();
486
487 /**
488 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
489 * This initialization order is required to support indirect recursion.
490 *
491 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
492 *
493 */
494 private static final Object STATIC_INITIALIZER = ensureInitialized();
495
496 public static Object ensureInitialized() {
497 INSTANCE.ensureInitializedInternal();
498 return null;
499 }
500 }
501
502 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
503 private static final MoreThenFiveSuperTypes.GeneratedPQuery INSTANCE = new GeneratedPQuery();
504
505 private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
506
507 private final List<PParameter> parameters = Arrays.asList(parameter_c);
508
509 private class Embedded_1_EClass_eSuperTypes extends BaseGeneratedEMFPQuery {
510 private final PParameter parameter_p0 = new PParameter("p0", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
511
512 private final PParameter parameter_p1 = new PParameter("p1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT);
513
514 private final List<PParameter> embeddedParameters = Arrays.asList(parameter_p0, parameter_p1);
515
516 public Embedded_1_EClass_eSuperTypes() {
517 super(PVisibility.EMBEDDED);
518 }
519
520 @Override
521 public String getFullyQualifiedName() {
522 return GeneratedPQuery.this.getFullyQualifiedName() + "$Embedded_1_EClass_eSuperTypes";
523 }
524
525 @Override
526 public List<PParameter> getParameters() {
527 return embeddedParameters;
528 }
529
530 @Override
531 public Set<PBody> doGetContainedBodies() {
532 PBody body = new PBody(this);
533 PVariable var_p0 = body.getOrCreateVariableByName("p0");
534 PVariable var_p1 = body.getOrCreateVariableByName("p1");
535 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
536 new ExportedParameter(body, var_p0, parameter_p0),
537 new ExportedParameter(body, var_p1, parameter_p1)
538 ));
539 // EClass.eSuperTypes(c,_)
540 new TypeConstraint(body, Tuples.flatTupleOf(var_p0), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
541 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
542 new TypeConstraint(body, Tuples.flatTupleOf(var_p0, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes")));
543 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
544 new Equality(body, var__virtual_0_, var_p1);
545 return Collections.singleton(body);
546 }
547 }
548
549 private GeneratedPQuery() {
550 super(PVisibility.PUBLIC);
551 }
552
553 @Override
554 public String getFullyQualifiedName() {
555 return "ecore.moreThenFiveSuperTypes";
556 }
557
558 @Override
559 public List<String> getParameterNames() {
560 return Arrays.asList("c");
561 }
562
563 @Override
564 public List<PParameter> getParameters() {
565 return parameters;
566 }
567
568 @Override
569 public Set<PBody> doGetContainedBodies() {
570 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
571 Set<PBody> bodies = new LinkedHashSet<>();
572 {
573 PBody body = new PBody(this);
574 PVariable var_c = body.getOrCreateVariableByName("c");
575 PVariable var_m = body.getOrCreateVariableByName("m");
576 PVariable var___0_ = body.getOrCreateVariableByName("_<0>");
577 new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
578 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
579 new ExportedParameter(body, var_c, parameter_c)
580 ));
581 // m == count EClass.eSuperTypes(c,_)
582 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
583 new PatternMatchCounter(body, Tuples.flatTupleOf(var_c, var___0_), new MoreThenFiveSuperTypes.GeneratedPQuery.Embedded_1_EClass_eSuperTypes(), var__virtual_0_);
584 new Equality(body, var_m, var__virtual_0_);
585 // check(m >= 5)
586 new ExpressionEvaluation(body, new IExpressionEvaluator() {
587
588 @Override
589 public String getShortDescription() {
590 return "Expression evaluation from pattern moreThenFiveSuperTypes";
591 }
592
593 @Override
594 public Iterable<String> getInputParameterNames() {
595 return Arrays.asList("m");}
596
597 @Override
598 public Object evaluateExpression(IValueProvider provider) throws Exception {
599 Integer m = (Integer) provider.getValue("m");
600 return evaluateExpression_1_1(m);
601 }
602 }, null);
603 bodies.add(body);
604 }
605 {
606 PAnnotation annotation = new PAnnotation("Constraint");
607 annotation.addAttribute("severity", "error");
608 annotation.addAttribute("message", "error");
609 annotation.addAttribute("key", Arrays.asList(new Object[] {
610 new ParameterReference("c")
611 }));
612 addAnnotation(annotation);
613 }
614 return bodies;
615 }
616 }
617
618 private static boolean evaluateExpression_1_1(final Integer m) {
619 return ((m).intValue() >= 5);
620 }
621}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java
new file mode 100644
index 00000000..d230e3f4
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java
@@ -0,0 +1,707 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql
3 */
4package ecore;
5
6import ecore.Opposite;
7import java.util.Arrays;
8import java.util.Collection;
9import java.util.LinkedHashSet;
10import java.util.List;
11import java.util.Objects;
12import java.util.Optional;
13import java.util.Set;
14import java.util.function.Consumer;
15import java.util.stream.Collectors;
16import java.util.stream.Stream;
17import org.apache.log4j.Logger;
18import org.eclipse.emf.ecore.EClass;
19import org.eclipse.emf.ecore.EReference;
20import org.eclipse.viatra.query.runtime.api.IPatternMatch;
21import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
22import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
24import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
25import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
26import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
27import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
41import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
42import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
43
44/**
45 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
46 *
47 * <p>Original source:
48 * <code><pre>
49 * {@literal @}Constraint(key={a}, severity="error", message="error")
50 * pattern nonSymmetricOpposite(a:EReference, b:EReference) {
51 * find opposite(a,b);
52 * neg find opposite(b,a);
53 * }
54 * </pre></code>
55 *
56 * @see Matcher
57 * @see Match
58 *
59 */
60@SuppressWarnings("all")
61public final class NonSymmetricOpposite extends BaseGeneratedEMFQuerySpecification<NonSymmetricOpposite.Matcher> {
62 /**
63 * Pattern-specific match representation of the ecore.nonSymmetricOpposite pattern,
64 * to be used in conjunction with {@link Matcher}.
65 *
66 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
67 * Each instance is a (possibly partial) substitution of pattern parameters,
68 * usable to represent a match of the pattern in the result of a query,
69 * or to specify the bound (fixed) input parameters when issuing a query.
70 *
71 * @see Matcher
72 *
73 */
74 public static abstract class Match extends BasePatternMatch {
75 private EReference fA;
76
77 private EReference fB;
78
79 private static List<String> parameterNames = makeImmutableList("a", "b");
80
81 private Match(final EReference pA, final EReference pB) {
82 this.fA = pA;
83 this.fB = pB;
84 }
85
86 @Override
87 public Object get(final String parameterName) {
88 if ("a".equals(parameterName)) return this.fA;
89 if ("b".equals(parameterName)) return this.fB;
90 return null;
91 }
92
93 public EReference getA() {
94 return this.fA;
95 }
96
97 public EReference getB() {
98 return this.fB;
99 }
100
101 @Override
102 public boolean set(final String parameterName, final Object newValue) {
103 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
104 if ("a".equals(parameterName) ) {
105 this.fA = (EReference) newValue;
106 return true;
107 }
108 if ("b".equals(parameterName) ) {
109 this.fB = (EReference) newValue;
110 return true;
111 }
112 return false;
113 }
114
115 public void setA(final EReference pA) {
116 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
117 this.fA = pA;
118 }
119
120 public void setB(final EReference pB) {
121 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
122 this.fB = pB;
123 }
124
125 @Override
126 public String patternName() {
127 return "ecore.nonSymmetricOpposite";
128 }
129
130 @Override
131 public List<String> parameterNames() {
132 return NonSymmetricOpposite.Match.parameterNames;
133 }
134
135 @Override
136 public Object[] toArray() {
137 return new Object[]{fA, fB};
138 }
139
140 @Override
141 public NonSymmetricOpposite.Match toImmutable() {
142 return isMutable() ? newMatch(fA, fB) : this;
143 }
144
145 @Override
146 public String prettyPrint() {
147 StringBuilder result = new StringBuilder();
148 result.append("\"a\"=" + prettyPrintValue(fA) + ", ");
149 result.append("\"b\"=" + prettyPrintValue(fB));
150 return result.toString();
151 }
152
153 @Override
154 public int hashCode() {
155 return Objects.hash(fA, fB);
156 }
157
158 @Override
159 public boolean equals(final Object obj) {
160 if (this == obj)
161 return true;
162 if (obj == null) {
163 return false;
164 }
165 if ((obj instanceof NonSymmetricOpposite.Match)) {
166 NonSymmetricOpposite.Match other = (NonSymmetricOpposite.Match) obj;
167 return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB);
168 } else {
169 // this should be infrequent
170 if (!(obj instanceof IPatternMatch)) {
171 return false;
172 }
173 IPatternMatch otherSig = (IPatternMatch) obj;
174 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
175 }
176 }
177
178 @Override
179 public NonSymmetricOpposite specification() {
180 return NonSymmetricOpposite.instance();
181 }
182
183 /**
184 * Returns an empty, mutable match.
185 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
186 *
187 * @return the empty match.
188 *
189 */
190 public static NonSymmetricOpposite.Match newEmptyMatch() {
191 return new Mutable(null, null);
192 }
193
194 /**
195 * Returns a mutable (partial) match.
196 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
197 *
198 * @param pA the fixed value of pattern parameter a, or null if not bound.
199 * @param pB the fixed value of pattern parameter b, or null if not bound.
200 * @return the new, mutable (partial) match object.
201 *
202 */
203 public static NonSymmetricOpposite.Match newMutableMatch(final EReference pA, final EReference pB) {
204 return new Mutable(pA, pB);
205 }
206
207 /**
208 * Returns a new (partial) match.
209 * This can be used e.g. to call the matcher with a partial match.
210 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
211 * @param pA the fixed value of pattern parameter a, or null if not bound.
212 * @param pB the fixed value of pattern parameter b, or null if not bound.
213 * @return the (partial) match object.
214 *
215 */
216 public static NonSymmetricOpposite.Match newMatch(final EReference pA, final EReference pB) {
217 return new Immutable(pA, pB);
218 }
219
220 private static final class Mutable extends NonSymmetricOpposite.Match {
221 Mutable(final EReference pA, final EReference pB) {
222 super(pA, pB);
223 }
224
225 @Override
226 public boolean isMutable() {
227 return true;
228 }
229 }
230
231 private static final class Immutable extends NonSymmetricOpposite.Match {
232 Immutable(final EReference pA, final EReference pB) {
233 super(pA, pB);
234 }
235
236 @Override
237 public boolean isMutable() {
238 return false;
239 }
240 }
241 }
242
243 /**
244 * Generated pattern matcher API of the ecore.nonSymmetricOpposite pattern,
245 * providing pattern-specific query methods.
246 *
247 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
248 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
249 *
250 * <p>Matches of the pattern will be represented as {@link Match}.
251 *
252 * <p>Original source:
253 * <code><pre>
254 * {@literal @}Constraint(key={a}, severity="error", message="error")
255 * pattern nonSymmetricOpposite(a:EReference, b:EReference) {
256 * find opposite(a,b);
257 * neg find opposite(b,a);
258 * }
259 * </pre></code>
260 *
261 * @see Match
262 * @see NonSymmetricOpposite
263 *
264 */
265 public static class Matcher extends BaseMatcher<NonSymmetricOpposite.Match> {
266 /**
267 * Initializes the pattern matcher within an existing VIATRA Query engine.
268 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
269 *
270 * @param engine the existing VIATRA Query engine in which this matcher will be created.
271 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
272 *
273 */
274 public static NonSymmetricOpposite.Matcher on(final ViatraQueryEngine engine) {
275 // check if matcher already exists
276 Matcher matcher = engine.getExistingMatcher(querySpecification());
277 if (matcher == null) {
278 matcher = (Matcher)engine.getMatcher(querySpecification());
279 }
280 return matcher;
281 }
282
283 /**
284 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
285 * @return an initialized matcher
286 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
287 *
288 */
289 public static NonSymmetricOpposite.Matcher create() {
290 return new Matcher();
291 }
292
293 private static final int POSITION_A = 0;
294
295 private static final int POSITION_B = 1;
296
297 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(NonSymmetricOpposite.Matcher.class);
298
299 /**
300 * Initializes the pattern matcher within an existing VIATRA Query engine.
301 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
302 *
303 * @param engine the existing VIATRA Query engine in which this matcher will be created.
304 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
305 *
306 */
307 private Matcher() {
308 super(querySpecification());
309 }
310
311 /**
312 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
313 * @param pA the fixed value of pattern parameter a, or null if not bound.
314 * @param pB the fixed value of pattern parameter b, or null if not bound.
315 * @return matches represented as a Match object.
316 *
317 */
318 public Collection<NonSymmetricOpposite.Match> getAllMatches(final EReference pA, final EReference pB) {
319 return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet());
320 }
321
322 /**
323 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
324 * </p>
325 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
326 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
327 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
328 * @param pA the fixed value of pattern parameter a, or null if not bound.
329 * @param pB the fixed value of pattern parameter b, or null if not bound.
330 * @return a stream of matches represented as a Match object.
331 *
332 */
333 public Stream<NonSymmetricOpposite.Match> streamAllMatches(final EReference pA, final EReference pB) {
334 return rawStreamAllMatches(new Object[]{pA, pB});
335 }
336
337 /**
338 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
339 * Neither determinism nor randomness of selection is guaranteed.
340 * @param pA the fixed value of pattern parameter a, or null if not bound.
341 * @param pB the fixed value of pattern parameter b, or null if not bound.
342 * @return a match represented as a Match object, or null if no match is found.
343 *
344 */
345 public Optional<NonSymmetricOpposite.Match> getOneArbitraryMatch(final EReference pA, final EReference pB) {
346 return rawGetOneArbitraryMatch(new Object[]{pA, pB});
347 }
348
349 /**
350 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
351 * under any possible substitution of the unspecified parameters (if any).
352 * @param pA the fixed value of pattern parameter a, or null if not bound.
353 * @param pB the fixed value of pattern parameter b, or null if not bound.
354 * @return true if the input is a valid (partial) match of the pattern.
355 *
356 */
357 public boolean hasMatch(final EReference pA, final EReference pB) {
358 return rawHasMatch(new Object[]{pA, pB});
359 }
360
361 /**
362 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
363 * @param pA the fixed value of pattern parameter a, or null if not bound.
364 * @param pB the fixed value of pattern parameter b, or null if not bound.
365 * @return the number of pattern matches found.
366 *
367 */
368 public int countMatches(final EReference pA, final EReference pB) {
369 return rawCountMatches(new Object[]{pA, pB});
370 }
371
372 /**
373 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
374 * Neither determinism nor randomness of selection is guaranteed.
375 * @param pA the fixed value of pattern parameter a, or null if not bound.
376 * @param pB the fixed value of pattern parameter b, or null if not bound.
377 * @param processor the action that will process the selected match.
378 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
379 *
380 */
381 public boolean forOneArbitraryMatch(final EReference pA, final EReference pB, final Consumer<? super NonSymmetricOpposite.Match> processor) {
382 return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor);
383 }
384
385 /**
386 * Returns a new (partial) match.
387 * This can be used e.g. to call the matcher with a partial match.
388 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
389 * @param pA the fixed value of pattern parameter a, or null if not bound.
390 * @param pB the fixed value of pattern parameter b, or null if not bound.
391 * @return the (partial) match object.
392 *
393 */
394 public NonSymmetricOpposite.Match newMatch(final EReference pA, final EReference pB) {
395 return NonSymmetricOpposite.Match.newMatch(pA, pB);
396 }
397
398 /**
399 * Retrieve the set of values that occur in matches for a.
400 * @return the Set of all values or empty set if there are no matches
401 *
402 */
403 protected Stream<EReference> rawStreamAllValuesOfa(final Object[] parameters) {
404 return rawStreamAllValues(POSITION_A, parameters).map(EReference.class::cast);
405 }
406
407 /**
408 * Retrieve the set of values that occur in matches for a.
409 * @return the Set of all values or empty set if there are no matches
410 *
411 */
412 public Set<EReference> getAllValuesOfa() {
413 return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet());
414 }
415
416 /**
417 * Retrieve the set of values that occur in matches for a.
418 * @return the Set of all values or empty set if there are no matches
419 *
420 */
421 public Stream<EReference> streamAllValuesOfa() {
422 return rawStreamAllValuesOfa(emptyArray());
423 }
424
425 /**
426 * Retrieve the set of values that occur in matches for a.
427 * </p>
428 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
429 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
430 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
431 *
432 * @return the Stream of all values or empty set if there are no matches
433 *
434 */
435 public Stream<EReference> streamAllValuesOfa(final NonSymmetricOpposite.Match partialMatch) {
436 return rawStreamAllValuesOfa(partialMatch.toArray());
437 }
438
439 /**
440 * Retrieve the set of values that occur in matches for a.
441 * </p>
442 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
443 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
444 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
445 *
446 * @return the Stream of all values or empty set if there are no matches
447 *
448 */
449 public Stream<EReference> streamAllValuesOfa(final EReference pB) {
450 return rawStreamAllValuesOfa(new Object[]{null, pB});
451 }
452
453 /**
454 * Retrieve the set of values that occur in matches for a.
455 * @return the Set of all values or empty set if there are no matches
456 *
457 */
458 public Set<EReference> getAllValuesOfa(final NonSymmetricOpposite.Match partialMatch) {
459 return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet());
460 }
461
462 /**
463 * Retrieve the set of values that occur in matches for a.
464 * @return the Set of all values or empty set if there are no matches
465 *
466 */
467 public Set<EReference> getAllValuesOfa(final EReference pB) {
468 return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet());
469 }
470
471 /**
472 * Retrieve the set of values that occur in matches for b.
473 * @return the Set of all values or empty set if there are no matches
474 *
475 */
476 protected Stream<EReference> rawStreamAllValuesOfb(final Object[] parameters) {
477 return rawStreamAllValues(POSITION_B, parameters).map(EReference.class::cast);
478 }
479
480 /**
481 * Retrieve the set of values that occur in matches for b.
482 * @return the Set of all values or empty set if there are no matches
483 *
484 */
485 public Set<EReference> getAllValuesOfb() {
486 return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet());
487 }
488
489 /**
490 * Retrieve the set of values that occur in matches for b.
491 * @return the Set of all values or empty set if there are no matches
492 *
493 */
494 public Stream<EReference> streamAllValuesOfb() {
495 return rawStreamAllValuesOfb(emptyArray());
496 }
497
498 /**
499 * Retrieve the set of values that occur in matches for b.
500 * </p>
501 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
502 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
503 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
504 *
505 * @return the Stream of all values or empty set if there are no matches
506 *
507 */
508 public Stream<EReference> streamAllValuesOfb(final NonSymmetricOpposite.Match partialMatch) {
509 return rawStreamAllValuesOfb(partialMatch.toArray());
510 }
511
512 /**
513 * Retrieve the set of values that occur in matches for b.
514 * </p>
515 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
516 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
517 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
518 *
519 * @return the Stream of all values or empty set if there are no matches
520 *
521 */
522 public Stream<EReference> streamAllValuesOfb(final EReference pA) {
523 return rawStreamAllValuesOfb(new Object[]{pA, null});
524 }
525
526 /**
527 * Retrieve the set of values that occur in matches for b.
528 * @return the Set of all values or empty set if there are no matches
529 *
530 */
531 public Set<EReference> getAllValuesOfb(final NonSymmetricOpposite.Match partialMatch) {
532 return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet());
533 }
534
535 /**
536 * Retrieve the set of values that occur in matches for b.
537 * @return the Set of all values or empty set if there are no matches
538 *
539 */
540 public Set<EReference> getAllValuesOfb(final EReference pA) {
541 return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet());
542 }
543
544 @Override
545 protected NonSymmetricOpposite.Match tupleToMatch(final Tuple t) {
546 try {
547 return NonSymmetricOpposite.Match.newMatch((EReference) t.get(POSITION_A), (EReference) t.get(POSITION_B));
548 } catch(ClassCastException e) {
549 LOGGER.error("Element(s) in tuple not properly typed!",e);
550 return null;
551 }
552 }
553
554 @Override
555 protected NonSymmetricOpposite.Match arrayToMatch(final Object[] match) {
556 try {
557 return NonSymmetricOpposite.Match.newMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]);
558 } catch(ClassCastException e) {
559 LOGGER.error("Element(s) in array not properly typed!",e);
560 return null;
561 }
562 }
563
564 @Override
565 protected NonSymmetricOpposite.Match arrayToMatchMutable(final Object[] match) {
566 try {
567 return NonSymmetricOpposite.Match.newMutableMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]);
568 } catch(ClassCastException e) {
569 LOGGER.error("Element(s) in array not properly typed!",e);
570 return null;
571 }
572 }
573
574 /**
575 * @return the singleton instance of the query specification of this pattern
576 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
577 *
578 */
579 public static IQuerySpecification<NonSymmetricOpposite.Matcher> querySpecification() {
580 return NonSymmetricOpposite.instance();
581 }
582 }
583
584 private NonSymmetricOpposite() {
585 super(GeneratedPQuery.INSTANCE);
586 }
587
588 /**
589 * @return the singleton instance of the query specification
590 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
591 *
592 */
593 public static NonSymmetricOpposite instance() {
594 try{
595 return LazyHolder.INSTANCE;
596 } catch (ExceptionInInitializerError err) {
597 throw processInitializerError(err);
598 }
599 }
600
601 @Override
602 protected NonSymmetricOpposite.Matcher instantiate(final ViatraQueryEngine engine) {
603 return NonSymmetricOpposite.Matcher.on(engine);
604 }
605
606 @Override
607 public NonSymmetricOpposite.Matcher instantiate() {
608 return NonSymmetricOpposite.Matcher.create();
609 }
610
611 @Override
612 public NonSymmetricOpposite.Match newEmptyMatch() {
613 return NonSymmetricOpposite.Match.newEmptyMatch();
614 }
615
616 @Override
617 public NonSymmetricOpposite.Match newMatch(final Object... parameters) {
618 return NonSymmetricOpposite.Match.newMatch((org.eclipse.emf.ecore.EReference) parameters[0], (org.eclipse.emf.ecore.EReference) parameters[1]);
619 }
620
621 /**
622 * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.NonSymmetricOpposite (visibility: PUBLIC, simpleName: NonSymmetricOpposite, identifier: ecore.NonSymmetricOpposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
623 * <b>not</b> at the class load time of the outer class,
624 * but rather at the first call to {@link JvmGenericType: ecore.NonSymmetricOpposite (visibility: PUBLIC, simpleName: NonSymmetricOpposite, identifier: ecore.NonSymmetricOpposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
625 *
626 * <p> This workaround is required e.g. to support recursion.
627 *
628 */
629 private static class LazyHolder {
630 private static final NonSymmetricOpposite INSTANCE = new NonSymmetricOpposite();
631
632 /**
633 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
634 * This initialization order is required to support indirect recursion.
635 *
636 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
637 *
638 */
639 private static final Object STATIC_INITIALIZER = ensureInitialized();
640
641 public static Object ensureInitialized() {
642 INSTANCE.ensureInitializedInternal();
643 return null;
644 }
645 }
646
647 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
648 private static final NonSymmetricOpposite.GeneratedPQuery INSTANCE = new GeneratedPQuery();
649
650 private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT);
651
652 private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT);
653
654 private final List<PParameter> parameters = Arrays.asList(parameter_a, parameter_b);
655
656 private GeneratedPQuery() {
657 super(PVisibility.PUBLIC);
658 }
659
660 @Override
661 public String getFullyQualifiedName() {
662 return "ecore.nonSymmetricOpposite";
663 }
664
665 @Override
666 public List<String> getParameterNames() {
667 return Arrays.asList("a","b");
668 }
669
670 @Override
671 public List<PParameter> getParameters() {
672 return parameters;
673 }
674
675 @Override
676 public Set<PBody> doGetContainedBodies() {
677 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
678 Set<PBody> bodies = new LinkedHashSet<>();
679 {
680 PBody body = new PBody(this);
681 PVariable var_a = body.getOrCreateVariableByName("a");
682 PVariable var_b = body.getOrCreateVariableByName("b");
683 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
684 new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
685 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
686 new ExportedParameter(body, var_a, parameter_a),
687 new ExportedParameter(body, var_b, parameter_b)
688 ));
689 // find opposite(a,b)
690 new PositivePatternCall(body, Tuples.flatTupleOf(var_a, var_b), Opposite.instance().getInternalQueryRepresentation());
691 // neg find opposite(b,a)
692 new NegativePatternCall(body, Tuples.flatTupleOf(var_b, var_a), Opposite.instance().getInternalQueryRepresentation());
693 bodies.add(body);
694 }
695 {
696 PAnnotation annotation = new PAnnotation("Constraint");
697 annotation.addAttribute("key", Arrays.asList(new Object[] {
698 new ParameterReference("a")
699 }));
700 annotation.addAttribute("severity", "error");
701 annotation.addAttribute("message", "error");
702 addAnnotation(annotation);
703 }
704 return bodies;
705 }
706 }
707}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java
new file mode 100644
index 00000000..d826f072
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java
@@ -0,0 +1,693 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql
3 */
4package ecore;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.EClass;
18import org.eclipse.emf.ecore.EReference;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
32import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
34import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
37import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
38import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
39import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
40
41/**
42 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
43 *
44 * <p>Original source:
45 * <code><pre>
46 * pattern opposite(a:EReference, b: EReference) {
47 * EReference.eOpposite(a,b);
48 * }
49 * </pre></code>
50 *
51 * @see Matcher
52 * @see Match
53 *
54 */
55@SuppressWarnings("all")
56public final class Opposite extends BaseGeneratedEMFQuerySpecification<Opposite.Matcher> {
57 /**
58 * Pattern-specific match representation of the ecore.opposite pattern,
59 * to be used in conjunction with {@link Matcher}.
60 *
61 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
62 * Each instance is a (possibly partial) substitution of pattern parameters,
63 * usable to represent a match of the pattern in the result of a query,
64 * or to specify the bound (fixed) input parameters when issuing a query.
65 *
66 * @see Matcher
67 *
68 */
69 public static abstract class Match extends BasePatternMatch {
70 private EReference fA;
71
72 private EReference fB;
73
74 private static List<String> parameterNames = makeImmutableList("a", "b");
75
76 private Match(final EReference pA, final EReference pB) {
77 this.fA = pA;
78 this.fB = pB;
79 }
80
81 @Override
82 public Object get(final String parameterName) {
83 if ("a".equals(parameterName)) return this.fA;
84 if ("b".equals(parameterName)) return this.fB;
85 return null;
86 }
87
88 public EReference getA() {
89 return this.fA;
90 }
91
92 public EReference getB() {
93 return this.fB;
94 }
95
96 @Override
97 public boolean set(final String parameterName, final Object newValue) {
98 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
99 if ("a".equals(parameterName) ) {
100 this.fA = (EReference) newValue;
101 return true;
102 }
103 if ("b".equals(parameterName) ) {
104 this.fB = (EReference) newValue;
105 return true;
106 }
107 return false;
108 }
109
110 public void setA(final EReference pA) {
111 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
112 this.fA = pA;
113 }
114
115 public void setB(final EReference pB) {
116 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
117 this.fB = pB;
118 }
119
120 @Override
121 public String patternName() {
122 return "ecore.opposite";
123 }
124
125 @Override
126 public List<String> parameterNames() {
127 return Opposite.Match.parameterNames;
128 }
129
130 @Override
131 public Object[] toArray() {
132 return new Object[]{fA, fB};
133 }
134
135 @Override
136 public Opposite.Match toImmutable() {
137 return isMutable() ? newMatch(fA, fB) : this;
138 }
139
140 @Override
141 public String prettyPrint() {
142 StringBuilder result = new StringBuilder();
143 result.append("\"a\"=" + prettyPrintValue(fA) + ", ");
144 result.append("\"b\"=" + prettyPrintValue(fB));
145 return result.toString();
146 }
147
148 @Override
149 public int hashCode() {
150 return Objects.hash(fA, fB);
151 }
152
153 @Override
154 public boolean equals(final Object obj) {
155 if (this == obj)
156 return true;
157 if (obj == null) {
158 return false;
159 }
160 if ((obj instanceof Opposite.Match)) {
161 Opposite.Match other = (Opposite.Match) obj;
162 return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB);
163 } else {
164 // this should be infrequent
165 if (!(obj instanceof IPatternMatch)) {
166 return false;
167 }
168 IPatternMatch otherSig = (IPatternMatch) obj;
169 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
170 }
171 }
172
173 @Override
174 public Opposite specification() {
175 return Opposite.instance();
176 }
177
178 /**
179 * Returns an empty, mutable match.
180 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
181 *
182 * @return the empty match.
183 *
184 */
185 public static Opposite.Match newEmptyMatch() {
186 return new Mutable(null, null);
187 }
188
189 /**
190 * Returns a mutable (partial) match.
191 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
192 *
193 * @param pA the fixed value of pattern parameter a, or null if not bound.
194 * @param pB the fixed value of pattern parameter b, or null if not bound.
195 * @return the new, mutable (partial) match object.
196 *
197 */
198 public static Opposite.Match newMutableMatch(final EReference pA, final EReference pB) {
199 return new Mutable(pA, pB);
200 }
201
202 /**
203 * Returns a new (partial) match.
204 * This can be used e.g. to call the matcher with a partial match.
205 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
206 * @param pA the fixed value of pattern parameter a, or null if not bound.
207 * @param pB the fixed value of pattern parameter b, or null if not bound.
208 * @return the (partial) match object.
209 *
210 */
211 public static Opposite.Match newMatch(final EReference pA, final EReference pB) {
212 return new Immutable(pA, pB);
213 }
214
215 private static final class Mutable extends Opposite.Match {
216 Mutable(final EReference pA, final EReference pB) {
217 super(pA, pB);
218 }
219
220 @Override
221 public boolean isMutable() {
222 return true;
223 }
224 }
225
226 private static final class Immutable extends Opposite.Match {
227 Immutable(final EReference pA, final EReference pB) {
228 super(pA, pB);
229 }
230
231 @Override
232 public boolean isMutable() {
233 return false;
234 }
235 }
236 }
237
238 /**
239 * Generated pattern matcher API of the ecore.opposite pattern,
240 * providing pattern-specific query methods.
241 *
242 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
243 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
244 *
245 * <p>Matches of the pattern will be represented as {@link Match}.
246 *
247 * <p>Original source:
248 * <code><pre>
249 * pattern opposite(a:EReference, b: EReference) {
250 * EReference.eOpposite(a,b);
251 * }
252 * </pre></code>
253 *
254 * @see Match
255 * @see Opposite
256 *
257 */
258 public static class Matcher extends BaseMatcher<Opposite.Match> {
259 /**
260 * Initializes the pattern matcher within an existing VIATRA Query engine.
261 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
262 *
263 * @param engine the existing VIATRA Query engine in which this matcher will be created.
264 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
265 *
266 */
267 public static Opposite.Matcher on(final ViatraQueryEngine engine) {
268 // check if matcher already exists
269 Matcher matcher = engine.getExistingMatcher(querySpecification());
270 if (matcher == null) {
271 matcher = (Matcher)engine.getMatcher(querySpecification());
272 }
273 return matcher;
274 }
275
276 /**
277 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
278 * @return an initialized matcher
279 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
280 *
281 */
282 public static Opposite.Matcher create() {
283 return new Matcher();
284 }
285
286 private static final int POSITION_A = 0;
287
288 private static final int POSITION_B = 1;
289
290 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Opposite.Matcher.class);
291
292 /**
293 * Initializes the pattern matcher within an existing VIATRA Query engine.
294 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
295 *
296 * @param engine the existing VIATRA Query engine in which this matcher will be created.
297 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
298 *
299 */
300 private Matcher() {
301 super(querySpecification());
302 }
303
304 /**
305 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
306 * @param pA the fixed value of pattern parameter a, or null if not bound.
307 * @param pB the fixed value of pattern parameter b, or null if not bound.
308 * @return matches represented as a Match object.
309 *
310 */
311 public Collection<Opposite.Match> getAllMatches(final EReference pA, final EReference pB) {
312 return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet());
313 }
314
315 /**
316 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
317 * </p>
318 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
319 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
320 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
321 * @param pA the fixed value of pattern parameter a, or null if not bound.
322 * @param pB the fixed value of pattern parameter b, or null if not bound.
323 * @return a stream of matches represented as a Match object.
324 *
325 */
326 public Stream<Opposite.Match> streamAllMatches(final EReference pA, final EReference pB) {
327 return rawStreamAllMatches(new Object[]{pA, pB});
328 }
329
330 /**
331 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
332 * Neither determinism nor randomness of selection is guaranteed.
333 * @param pA the fixed value of pattern parameter a, or null if not bound.
334 * @param pB the fixed value of pattern parameter b, or null if not bound.
335 * @return a match represented as a Match object, or null if no match is found.
336 *
337 */
338 public Optional<Opposite.Match> getOneArbitraryMatch(final EReference pA, final EReference pB) {
339 return rawGetOneArbitraryMatch(new Object[]{pA, pB});
340 }
341
342 /**
343 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
344 * under any possible substitution of the unspecified parameters (if any).
345 * @param pA the fixed value of pattern parameter a, or null if not bound.
346 * @param pB the fixed value of pattern parameter b, or null if not bound.
347 * @return true if the input is a valid (partial) match of the pattern.
348 *
349 */
350 public boolean hasMatch(final EReference pA, final EReference pB) {
351 return rawHasMatch(new Object[]{pA, pB});
352 }
353
354 /**
355 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
356 * @param pA the fixed value of pattern parameter a, or null if not bound.
357 * @param pB the fixed value of pattern parameter b, or null if not bound.
358 * @return the number of pattern matches found.
359 *
360 */
361 public int countMatches(final EReference pA, final EReference pB) {
362 return rawCountMatches(new Object[]{pA, pB});
363 }
364
365 /**
366 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
367 * Neither determinism nor randomness of selection is guaranteed.
368 * @param pA the fixed value of pattern parameter a, or null if not bound.
369 * @param pB the fixed value of pattern parameter b, or null if not bound.
370 * @param processor the action that will process the selected match.
371 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
372 *
373 */
374 public boolean forOneArbitraryMatch(final EReference pA, final EReference pB, final Consumer<? super Opposite.Match> processor) {
375 return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor);
376 }
377
378 /**
379 * Returns a new (partial) match.
380 * This can be used e.g. to call the matcher with a partial match.
381 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
382 * @param pA the fixed value of pattern parameter a, or null if not bound.
383 * @param pB the fixed value of pattern parameter b, or null if not bound.
384 * @return the (partial) match object.
385 *
386 */
387 public Opposite.Match newMatch(final EReference pA, final EReference pB) {
388 return Opposite.Match.newMatch(pA, pB);
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for a.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 protected Stream<EReference> rawStreamAllValuesOfa(final Object[] parameters) {
397 return rawStreamAllValues(POSITION_A, parameters).map(EReference.class::cast);
398 }
399
400 /**
401 * Retrieve the set of values that occur in matches for a.
402 * @return the Set of all values or empty set if there are no matches
403 *
404 */
405 public Set<EReference> getAllValuesOfa() {
406 return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet());
407 }
408
409 /**
410 * Retrieve the set of values that occur in matches for a.
411 * @return the Set of all values or empty set if there are no matches
412 *
413 */
414 public Stream<EReference> streamAllValuesOfa() {
415 return rawStreamAllValuesOfa(emptyArray());
416 }
417
418 /**
419 * Retrieve the set of values that occur in matches for a.
420 * </p>
421 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
422 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
423 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
424 *
425 * @return the Stream of all values or empty set if there are no matches
426 *
427 */
428 public Stream<EReference> streamAllValuesOfa(final Opposite.Match partialMatch) {
429 return rawStreamAllValuesOfa(partialMatch.toArray());
430 }
431
432 /**
433 * Retrieve the set of values that occur in matches for a.
434 * </p>
435 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
436 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
437 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
438 *
439 * @return the Stream of all values or empty set if there are no matches
440 *
441 */
442 public Stream<EReference> streamAllValuesOfa(final EReference pB) {
443 return rawStreamAllValuesOfa(new Object[]{null, pB});
444 }
445
446 /**
447 * Retrieve the set of values that occur in matches for a.
448 * @return the Set of all values or empty set if there are no matches
449 *
450 */
451 public Set<EReference> getAllValuesOfa(final Opposite.Match partialMatch) {
452 return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet());
453 }
454
455 /**
456 * Retrieve the set of values that occur in matches for a.
457 * @return the Set of all values or empty set if there are no matches
458 *
459 */
460 public Set<EReference> getAllValuesOfa(final EReference pB) {
461 return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet());
462 }
463
464 /**
465 * Retrieve the set of values that occur in matches for b.
466 * @return the Set of all values or empty set if there are no matches
467 *
468 */
469 protected Stream<EReference> rawStreamAllValuesOfb(final Object[] parameters) {
470 return rawStreamAllValues(POSITION_B, parameters).map(EReference.class::cast);
471 }
472
473 /**
474 * Retrieve the set of values that occur in matches for b.
475 * @return the Set of all values or empty set if there are no matches
476 *
477 */
478 public Set<EReference> getAllValuesOfb() {
479 return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet());
480 }
481
482 /**
483 * Retrieve the set of values that occur in matches for b.
484 * @return the Set of all values or empty set if there are no matches
485 *
486 */
487 public Stream<EReference> streamAllValuesOfb() {
488 return rawStreamAllValuesOfb(emptyArray());
489 }
490
491 /**
492 * Retrieve the set of values that occur in matches for b.
493 * </p>
494 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
495 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
496 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
497 *
498 * @return the Stream of all values or empty set if there are no matches
499 *
500 */
501 public Stream<EReference> streamAllValuesOfb(final Opposite.Match partialMatch) {
502 return rawStreamAllValuesOfb(partialMatch.toArray());
503 }
504
505 /**
506 * Retrieve the set of values that occur in matches for b.
507 * </p>
508 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
509 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
510 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
511 *
512 * @return the Stream of all values or empty set if there are no matches
513 *
514 */
515 public Stream<EReference> streamAllValuesOfb(final EReference pA) {
516 return rawStreamAllValuesOfb(new Object[]{pA, null});
517 }
518
519 /**
520 * Retrieve the set of values that occur in matches for b.
521 * @return the Set of all values or empty set if there are no matches
522 *
523 */
524 public Set<EReference> getAllValuesOfb(final Opposite.Match partialMatch) {
525 return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet());
526 }
527
528 /**
529 * Retrieve the set of values that occur in matches for b.
530 * @return the Set of all values or empty set if there are no matches
531 *
532 */
533 public Set<EReference> getAllValuesOfb(final EReference pA) {
534 return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet());
535 }
536
537 @Override
538 protected Opposite.Match tupleToMatch(final Tuple t) {
539 try {
540 return Opposite.Match.newMatch((EReference) t.get(POSITION_A), (EReference) t.get(POSITION_B));
541 } catch(ClassCastException e) {
542 LOGGER.error("Element(s) in tuple not properly typed!",e);
543 return null;
544 }
545 }
546
547 @Override
548 protected Opposite.Match arrayToMatch(final Object[] match) {
549 try {
550 return Opposite.Match.newMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]);
551 } catch(ClassCastException e) {
552 LOGGER.error("Element(s) in array not properly typed!",e);
553 return null;
554 }
555 }
556
557 @Override
558 protected Opposite.Match arrayToMatchMutable(final Object[] match) {
559 try {
560 return Opposite.Match.newMutableMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]);
561 } catch(ClassCastException e) {
562 LOGGER.error("Element(s) in array not properly typed!",e);
563 return null;
564 }
565 }
566
567 /**
568 * @return the singleton instance of the query specification of this pattern
569 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
570 *
571 */
572 public static IQuerySpecification<Opposite.Matcher> querySpecification() {
573 return Opposite.instance();
574 }
575 }
576
577 private Opposite() {
578 super(GeneratedPQuery.INSTANCE);
579 }
580
581 /**
582 * @return the singleton instance of the query specification
583 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
584 *
585 */
586 public static Opposite instance() {
587 try{
588 return LazyHolder.INSTANCE;
589 } catch (ExceptionInInitializerError err) {
590 throw processInitializerError(err);
591 }
592 }
593
594 @Override
595 protected Opposite.Matcher instantiate(final ViatraQueryEngine engine) {
596 return Opposite.Matcher.on(engine);
597 }
598
599 @Override
600 public Opposite.Matcher instantiate() {
601 return Opposite.Matcher.create();
602 }
603
604 @Override
605 public Opposite.Match newEmptyMatch() {
606 return Opposite.Match.newEmptyMatch();
607 }
608
609 @Override
610 public Opposite.Match newMatch(final Object... parameters) {
611 return Opposite.Match.newMatch((org.eclipse.emf.ecore.EReference) parameters[0], (org.eclipse.emf.ecore.EReference) parameters[1]);
612 }
613
614 /**
615 * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.Opposite (visibility: PUBLIC, simpleName: Opposite, identifier: ecore.Opposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
616 * <b>not</b> at the class load time of the outer class,
617 * but rather at the first call to {@link JvmGenericType: ecore.Opposite (visibility: PUBLIC, simpleName: Opposite, identifier: ecore.Opposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
618 *
619 * <p> This workaround is required e.g. to support recursion.
620 *
621 */
622 private static class LazyHolder {
623 private static final Opposite INSTANCE = new Opposite();
624
625 /**
626 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
627 * This initialization order is required to support indirect recursion.
628 *
629 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
630 *
631 */
632 private static final Object STATIC_INITIALIZER = ensureInitialized();
633
634 public static Object ensureInitialized() {
635 INSTANCE.ensureInitializedInternal();
636 return null;
637 }
638 }
639
640 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
641 private static final Opposite.GeneratedPQuery INSTANCE = new GeneratedPQuery();
642
643 private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT);
644
645 private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT);
646
647 private final List<PParameter> parameters = Arrays.asList(parameter_a, parameter_b);
648
649 private GeneratedPQuery() {
650 super(PVisibility.PUBLIC);
651 }
652
653 @Override
654 public String getFullyQualifiedName() {
655 return "ecore.opposite";
656 }
657
658 @Override
659 public List<String> getParameterNames() {
660 return Arrays.asList("a","b");
661 }
662
663 @Override
664 public List<PParameter> getParameters() {
665 return parameters;
666 }
667
668 @Override
669 public Set<PBody> doGetContainedBodies() {
670 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
671 Set<PBody> bodies = new LinkedHashSet<>();
672 {
673 PBody body = new PBody(this);
674 PVariable var_a = body.getOrCreateVariableByName("a");
675 PVariable var_b = body.getOrCreateVariableByName("b");
676 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
677 new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
678 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
679 new ExportedParameter(body, var_a, parameter_a),
680 new ExportedParameter(body, var_b, parameter_b)
681 ));
682 // EReference.eOpposite(a,b)
683 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
684 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
685 new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference", "eOpposite")));
686 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
687 new Equality(body, var__virtual_0_, var_b);
688 bodies.add(body);
689 }
690 return bodies;
691 }
692 }
693}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java
new file mode 100644
index 00000000..3a0df648
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java
@@ -0,0 +1,577 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql
3 */
4package ecore;
5
6import java.util.Arrays;
7import java.util.Collection;
8import java.util.LinkedHashSet;
9import java.util.List;
10import java.util.Objects;
11import java.util.Optional;
12import java.util.Set;
13import java.util.function.Consumer;
14import java.util.stream.Collectors;
15import java.util.stream.Stream;
16import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.EClass;
18import org.eclipse.emf.ecore.EReference;
19import org.eclipse.viatra.query.runtime.api.IPatternMatch;
20import org.eclipse.viatra.query.runtime.api.IQuerySpecification;
21import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
22import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery;
23import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification;
24import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher;
25import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch;
26import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey;
27import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey;
28import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint;
29import org.eclipse.viatra.query.runtime.matchers.psystem.PBody;
30import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable;
31import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation;
32import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference;
33import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality;
36import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
39import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
41import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
42import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
43
44/**
45 * A pattern-specific query specification that can instantiate Matcher in a type-safe way.
46 *
47 * <p>Original source:
48 * <code><pre>
49 * {@literal @}Constraint(key={a}, severity="error", message="error")
50 * pattern oppositeDifferentClass(a:EReference) {
51 * EReference.eOpposite(a,b);
52 * EReference.eContainingClass(a,aContaining);
53 * EReference.eType(b,bTarget);
54 * aContaining != bTarget;
55 * }
56 * </pre></code>
57 *
58 * @see Matcher
59 * @see Match
60 *
61 */
62@SuppressWarnings("all")
63public final class OppositeDifferentClass extends BaseGeneratedEMFQuerySpecification<OppositeDifferentClass.Matcher> {
64 /**
65 * Pattern-specific match representation of the ecore.oppositeDifferentClass pattern,
66 * to be used in conjunction with {@link Matcher}.
67 *
68 * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned.
69 * Each instance is a (possibly partial) substitution of pattern parameters,
70 * usable to represent a match of the pattern in the result of a query,
71 * or to specify the bound (fixed) input parameters when issuing a query.
72 *
73 * @see Matcher
74 *
75 */
76 public static abstract class Match extends BasePatternMatch {
77 private EReference fA;
78
79 private static List<String> parameterNames = makeImmutableList("a");
80
81 private Match(final EReference pA) {
82 this.fA = pA;
83 }
84
85 @Override
86 public Object get(final String parameterName) {
87 if ("a".equals(parameterName)) return this.fA;
88 return null;
89 }
90
91 public EReference getA() {
92 return this.fA;
93 }
94
95 @Override
96 public boolean set(final String parameterName, final Object newValue) {
97 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
98 if ("a".equals(parameterName) ) {
99 this.fA = (EReference) newValue;
100 return true;
101 }
102 return false;
103 }
104
105 public void setA(final EReference pA) {
106 if (!isMutable()) throw new java.lang.UnsupportedOperationException();
107 this.fA = pA;
108 }
109
110 @Override
111 public String patternName() {
112 return "ecore.oppositeDifferentClass";
113 }
114
115 @Override
116 public List<String> parameterNames() {
117 return OppositeDifferentClass.Match.parameterNames;
118 }
119
120 @Override
121 public Object[] toArray() {
122 return new Object[]{fA};
123 }
124
125 @Override
126 public OppositeDifferentClass.Match toImmutable() {
127 return isMutable() ? newMatch(fA) : this;
128 }
129
130 @Override
131 public String prettyPrint() {
132 StringBuilder result = new StringBuilder();
133 result.append("\"a\"=" + prettyPrintValue(fA));
134 return result.toString();
135 }
136
137 @Override
138 public int hashCode() {
139 return Objects.hash(fA);
140 }
141
142 @Override
143 public boolean equals(final Object obj) {
144 if (this == obj)
145 return true;
146 if (obj == null) {
147 return false;
148 }
149 if ((obj instanceof OppositeDifferentClass.Match)) {
150 OppositeDifferentClass.Match other = (OppositeDifferentClass.Match) obj;
151 return Objects.equals(fA, other.fA);
152 } else {
153 // this should be infrequent
154 if (!(obj instanceof IPatternMatch)) {
155 return false;
156 }
157 IPatternMatch otherSig = (IPatternMatch) obj;
158 return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray());
159 }
160 }
161
162 @Override
163 public OppositeDifferentClass specification() {
164 return OppositeDifferentClass.instance();
165 }
166
167 /**
168 * Returns an empty, mutable match.
169 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
170 *
171 * @return the empty match.
172 *
173 */
174 public static OppositeDifferentClass.Match newEmptyMatch() {
175 return new Mutable(null);
176 }
177
178 /**
179 * Returns a mutable (partial) match.
180 * Fields of the mutable match can be filled to create a partial match, usable as matcher input.
181 *
182 * @param pA the fixed value of pattern parameter a, or null if not bound.
183 * @return the new, mutable (partial) match object.
184 *
185 */
186 public static OppositeDifferentClass.Match newMutableMatch(final EReference pA) {
187 return new Mutable(pA);
188 }
189
190 /**
191 * Returns a new (partial) match.
192 * This can be used e.g. to call the matcher with a partial match.
193 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
194 * @param pA the fixed value of pattern parameter a, or null if not bound.
195 * @return the (partial) match object.
196 *
197 */
198 public static OppositeDifferentClass.Match newMatch(final EReference pA) {
199 return new Immutable(pA);
200 }
201
202 private static final class Mutable extends OppositeDifferentClass.Match {
203 Mutable(final EReference pA) {
204 super(pA);
205 }
206
207 @Override
208 public boolean isMutable() {
209 return true;
210 }
211 }
212
213 private static final class Immutable extends OppositeDifferentClass.Match {
214 Immutable(final EReference pA) {
215 super(pA);
216 }
217
218 @Override
219 public boolean isMutable() {
220 return false;
221 }
222 }
223 }
224
225 /**
226 * Generated pattern matcher API of the ecore.oppositeDifferentClass pattern,
227 * providing pattern-specific query methods.
228 *
229 * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)},
230 * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}.
231 *
232 * <p>Matches of the pattern will be represented as {@link Match}.
233 *
234 * <p>Original source:
235 * <code><pre>
236 * {@literal @}Constraint(key={a}, severity="error", message="error")
237 * pattern oppositeDifferentClass(a:EReference) {
238 * EReference.eOpposite(a,b);
239 * EReference.eContainingClass(a,aContaining);
240 * EReference.eType(b,bTarget);
241 * aContaining != bTarget;
242 * }
243 * </pre></code>
244 *
245 * @see Match
246 * @see OppositeDifferentClass
247 *
248 */
249 public static class Matcher extends BaseMatcher<OppositeDifferentClass.Match> {
250 /**
251 * Initializes the pattern matcher within an existing VIATRA Query engine.
252 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
253 *
254 * @param engine the existing VIATRA Query engine in which this matcher will be created.
255 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
256 *
257 */
258 public static OppositeDifferentClass.Matcher on(final ViatraQueryEngine engine) {
259 // check if matcher already exists
260 Matcher matcher = engine.getExistingMatcher(querySpecification());
261 if (matcher == null) {
262 matcher = (Matcher)engine.getMatcher(querySpecification());
263 }
264 return matcher;
265 }
266
267 /**
268 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
269 * @return an initialized matcher
270 * @noreference This method is for internal matcher initialization by the framework, do not call it manually.
271 *
272 */
273 public static OppositeDifferentClass.Matcher create() {
274 return new Matcher();
275 }
276
277 private static final int POSITION_A = 0;
278
279 private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(OppositeDifferentClass.Matcher.class);
280
281 /**
282 * Initializes the pattern matcher within an existing VIATRA Query engine.
283 * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned.
284 *
285 * @param engine the existing VIATRA Query engine in which this matcher will be created.
286 * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation
287 *
288 */
289 private Matcher() {
290 super(querySpecification());
291 }
292
293 /**
294 * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters.
295 * @param pA the fixed value of pattern parameter a, or null if not bound.
296 * @return matches represented as a Match object.
297 *
298 */
299 public Collection<OppositeDifferentClass.Match> getAllMatches(final EReference pA) {
300 return rawStreamAllMatches(new Object[]{pA}).collect(Collectors.toSet());
301 }
302
303 /**
304 * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters.
305 * </p>
306 * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed.
307 * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>.
308 * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code.
309 * @param pA the fixed value of pattern parameter a, or null if not bound.
310 * @return a stream of matches represented as a Match object.
311 *
312 */
313 public Stream<OppositeDifferentClass.Match> streamAllMatches(final EReference pA) {
314 return rawStreamAllMatches(new Object[]{pA});
315 }
316
317 /**
318 * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
319 * Neither determinism nor randomness of selection is guaranteed.
320 * @param pA the fixed value of pattern parameter a, or null if not bound.
321 * @return a match represented as a Match object, or null if no match is found.
322 *
323 */
324 public Optional<OppositeDifferentClass.Match> getOneArbitraryMatch(final EReference pA) {
325 return rawGetOneArbitraryMatch(new Object[]{pA});
326 }
327
328 /**
329 * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match,
330 * under any possible substitution of the unspecified parameters (if any).
331 * @param pA the fixed value of pattern parameter a, or null if not bound.
332 * @return true if the input is a valid (partial) match of the pattern.
333 *
334 */
335 public boolean hasMatch(final EReference pA) {
336 return rawHasMatch(new Object[]{pA});
337 }
338
339 /**
340 * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters.
341 * @param pA the fixed value of pattern parameter a, or null if not bound.
342 * @return the number of pattern matches found.
343 *
344 */
345 public int countMatches(final EReference pA) {
346 return rawCountMatches(new Object[]{pA});
347 }
348
349 /**
350 * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters.
351 * Neither determinism nor randomness of selection is guaranteed.
352 * @param pA the fixed value of pattern parameter a, or null if not bound.
353 * @param processor the action that will process the selected match.
354 * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked
355 *
356 */
357 public boolean forOneArbitraryMatch(final EReference pA, final Consumer<? super OppositeDifferentClass.Match> processor) {
358 return rawForOneArbitraryMatch(new Object[]{pA}, processor);
359 }
360
361 /**
362 * Returns a new (partial) match.
363 * This can be used e.g. to call the matcher with a partial match.
364 * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object.
365 * @param pA the fixed value of pattern parameter a, or null if not bound.
366 * @return the (partial) match object.
367 *
368 */
369 public OppositeDifferentClass.Match newMatch(final EReference pA) {
370 return OppositeDifferentClass.Match.newMatch(pA);
371 }
372
373 /**
374 * Retrieve the set of values that occur in matches for a.
375 * @return the Set of all values or empty set if there are no matches
376 *
377 */
378 protected Stream<EReference> rawStreamAllValuesOfa(final Object[] parameters) {
379 return rawStreamAllValues(POSITION_A, parameters).map(EReference.class::cast);
380 }
381
382 /**
383 * Retrieve the set of values that occur in matches for a.
384 * @return the Set of all values or empty set if there are no matches
385 *
386 */
387 public Set<EReference> getAllValuesOfa() {
388 return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet());
389 }
390
391 /**
392 * Retrieve the set of values that occur in matches for a.
393 * @return the Set of all values or empty set if there are no matches
394 *
395 */
396 public Stream<EReference> streamAllValuesOfa() {
397 return rawStreamAllValuesOfa(emptyArray());
398 }
399
400 @Override
401 protected OppositeDifferentClass.Match tupleToMatch(final Tuple t) {
402 try {
403 return OppositeDifferentClass.Match.newMatch((EReference) t.get(POSITION_A));
404 } catch(ClassCastException e) {
405 LOGGER.error("Element(s) in tuple not properly typed!",e);
406 return null;
407 }
408 }
409
410 @Override
411 protected OppositeDifferentClass.Match arrayToMatch(final Object[] match) {
412 try {
413 return OppositeDifferentClass.Match.newMatch((EReference) match[POSITION_A]);
414 } catch(ClassCastException e) {
415 LOGGER.error("Element(s) in array not properly typed!",e);
416 return null;
417 }
418 }
419
420 @Override
421 protected OppositeDifferentClass.Match arrayToMatchMutable(final Object[] match) {
422 try {
423 return OppositeDifferentClass.Match.newMutableMatch((EReference) match[POSITION_A]);
424 } catch(ClassCastException e) {
425 LOGGER.error("Element(s) in array not properly typed!",e);
426 return null;
427 }
428 }
429
430 /**
431 * @return the singleton instance of the query specification of this pattern
432 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
433 *
434 */
435 public static IQuerySpecification<OppositeDifferentClass.Matcher> querySpecification() {
436 return OppositeDifferentClass.instance();
437 }
438 }
439
440 private OppositeDifferentClass() {
441 super(GeneratedPQuery.INSTANCE);
442 }
443
444 /**
445 * @return the singleton instance of the query specification
446 * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded
447 *
448 */
449 public static OppositeDifferentClass instance() {
450 try{
451 return LazyHolder.INSTANCE;
452 } catch (ExceptionInInitializerError err) {
453 throw processInitializerError(err);
454 }
455 }
456
457 @Override
458 protected OppositeDifferentClass.Matcher instantiate(final ViatraQueryEngine engine) {
459 return OppositeDifferentClass.Matcher.on(engine);
460 }
461
462 @Override
463 public OppositeDifferentClass.Matcher instantiate() {
464 return OppositeDifferentClass.Matcher.create();
465 }
466
467 @Override
468 public OppositeDifferentClass.Match newEmptyMatch() {
469 return OppositeDifferentClass.Match.newEmptyMatch();
470 }
471
472 @Override
473 public OppositeDifferentClass.Match newMatch(final Object... parameters) {
474 return OppositeDifferentClass.Match.newMatch((org.eclipse.emf.ecore.EReference) parameters[0]);
475 }
476
477 /**
478 * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.OppositeDifferentClass (visibility: PUBLIC, simpleName: OppositeDifferentClass, identifier: ecore.OppositeDifferentClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created
479 * <b>not</b> at the class load time of the outer class,
480 * but rather at the first call to {@link JvmGenericType: ecore.OppositeDifferentClass (visibility: PUBLIC, simpleName: OppositeDifferentClass, identifier: ecore.OppositeDifferentClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}.
481 *
482 * <p> This workaround is required e.g. to support recursion.
483 *
484 */
485 private static class LazyHolder {
486 private static final OppositeDifferentClass INSTANCE = new OppositeDifferentClass();
487
488 /**
489 * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned.
490 * This initialization order is required to support indirect recursion.
491 *
492 * <p> The static initializer is defined using a helper field to work around limitations of the code generator.
493 *
494 */
495 private static final Object STATIC_INITIALIZER = ensureInitialized();
496
497 public static Object ensureInitialized() {
498 INSTANCE.ensureInitializedInternal();
499 return null;
500 }
501 }
502
503 private static class GeneratedPQuery extends BaseGeneratedEMFPQuery {
504 private static final OppositeDifferentClass.GeneratedPQuery INSTANCE = new GeneratedPQuery();
505
506 private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT);
507
508 private final List<PParameter> parameters = Arrays.asList(parameter_a);
509
510 private GeneratedPQuery() {
511 super(PVisibility.PUBLIC);
512 }
513
514 @Override
515 public String getFullyQualifiedName() {
516 return "ecore.oppositeDifferentClass";
517 }
518
519 @Override
520 public List<String> getParameterNames() {
521 return Arrays.asList("a");
522 }
523
524 @Override
525 public List<PParameter> getParameters() {
526 return parameters;
527 }
528
529 @Override
530 public Set<PBody> doGetContainedBodies() {
531 setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED));
532 Set<PBody> bodies = new LinkedHashSet<>();
533 {
534 PBody body = new PBody(this);
535 PVariable var_a = body.getOrCreateVariableByName("a");
536 PVariable var_b = body.getOrCreateVariableByName("b");
537 PVariable var_aContaining = body.getOrCreateVariableByName("aContaining");
538 PVariable var_bTarget = body.getOrCreateVariableByName("bTarget");
539 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
540 body.setSymbolicParameters(Arrays.<ExportedParameter>asList(
541 new ExportedParameter(body, var_a, parameter_a)
542 ));
543 // EReference.eOpposite(a,b)
544 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
545 PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}");
546 new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference", "eOpposite")));
547 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
548 new Equality(body, var__virtual_0_, var_b);
549 // EReference.eContainingClass(a,aContaining)
550 new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
551 PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}");
552 new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EStructuralFeature", "eContainingClass")));
553 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass")));
554 new Equality(body, var__virtual_1_, var_aContaining);
555 // EReference.eType(b,bTarget)
556 new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference")));
557 PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}");
558 new TypeConstraint(body, Tuples.flatTupleOf(var_b, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "ETypedElement", "eType")));
559 new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClassifier")));
560 new Equality(body, var__virtual_2_, var_bTarget);
561 // aContaining != bTarget
562 new Inequality(body, var_aContaining, var_bTarget);
563 bodies.add(body);
564 }
565 {
566 PAnnotation annotation = new PAnnotation("Constraint");
567 annotation.addAttribute("key", Arrays.asList(new Object[] {
568 new ParameterReference("a")
569 }));
570 annotation.addAttribute("severity", "error");
571 annotation.addAttribute("message", "error");
572 addAnnotation(annotation);
573 }
574 return bodies;
575 }
576 }
577}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend
index ab187b3a..2add9f0e 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend
@@ -16,11 +16,11 @@ import org.eclipse.emf.ecore.EReference
16//import yakindumm2.impl.Yakindumm2PackageImpl 16//import yakindumm2.impl.Yakindumm2PackageImpl
17 17
18class Main { 18class Main {
19 var static Domain d = Domain.Ecore; 19 var static Domain d = Domain.Yakindumm;
20 val static String suffix = '.ecore' 20 val static String suffix = '.xmi'
21 val static String OUTPUT_FOLDER = "Inputs/human/"; 21 val static String OUTPUT_FOLDER = "Inputs/yakindumm/human/humanInput100/";
22 val static String INPUT_FOLDER = "outputs/human/"; 22 val static String INPUT_FOLDER = "outputs/Human/";
23 val static int NUM_RUNS = 1; 23 val static int NUM_RUNS = 100;
24 24
25 static class RWInformation{ 25 static class RWInformation{
26 public var String inputFolder; 26 public var String inputFolder;
@@ -88,7 +88,9 @@ class Main {
88 } 88 }
89 89
90 var outputs = model.evaluateAllMetrics(); 90 var outputs = model.evaluateAllMetrics();
91 var violationsOutput = newArrayList('violations', ViolationCheck.calculateViolationCounts(model.root, d)+''); 91 var violations = ViolationCheck.calculateViolationCounts(model.root, d);
92 println(violations);
93 var violationsOutput = newArrayList('violations', violations+'');
92 outputs.add(violationsOutput); 94 outputs.add(violationsOutput);
93 CsvFileWriter.write(outputs, fileName); 95 CsvFileWriter.write(outputs, fileName);
94 } 96 }
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
index b2288f52..4c9246d1 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend
@@ -54,7 +54,6 @@ class PartialInterpretationMetricDistance {
54 metrics.add(new NodeActivityMetric()); 54 metrics.add(new NodeActivityMetric());
55 metrics.add(new MultiplexParticipationCoefficientMetric()); 55 metrics.add(new MultiplexParticipationCoefficientMetric());
56 metrics.add(new NodeTypeMetric()); 56 metrics.add(new NodeTypeMetric());
57 metrics.add(new EdgeTypeMetric());
58 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); 57 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null);
59 var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); 58 var metricSamples = metricCalculator.evaluateAllMetricsToSamples();
60 59
@@ -65,7 +64,6 @@ class PartialInterpretationMetricDistance {
65 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); 64 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples);
66 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); 65 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType);
67 distance.nodeTypeInfo = metricSamples.nodeTypeSamples; 66 distance.nodeTypeInfo = metricSamples.nodeTypeSamples;
68 distance.edgeTypeDistance = ks.edgeTypeDistance(metricSamples.edgeTypeSamples);
69 return distance; 67 return distance;
70 } 68 }
71 69
@@ -180,7 +178,6 @@ class MetricDistanceGroup{
180 var double outDegreeDistance; 178 var double outDegreeDistance;
181 var double nodeTypeDistance; 179 var double nodeTypeDistance;
182 protected var HashMap<String, Double> nodeTypeInfo; 180 protected var HashMap<String, Double> nodeTypeInfo;
183 public var double edgeTypeDistance;
184 181
185 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ 182 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){
186 this.mpcDistance = mpcDistance; 183 this.mpcDistance = mpcDistance;
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
index 72239e22..3c98bb1c 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
@@ -2,6 +2,7 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation
2 2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import com.google.common.reflect.ClassPath 4import com.google.common.reflect.ClassPath
5import ecore.Ecore_pattern
5import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns 6import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns
6import java.util.ArrayList 7import java.util.ArrayList
7import org.eclipse.emf.ecore.EObject 8import org.eclipse.emf.ecore.EObject
@@ -16,15 +17,13 @@ class ViolationCheck {
16 if(d == Domain.Yakindumm){ 17 if(d == Domain.Yakindumm){
17 packageName = 'constraints.yakindumm'; 18 packageName = 'constraints.yakindumm';
18 }else if (d == Domain.Ecore){ 19 }else if (d == Domain.Ecore){
19 //TODO: put constraints package names for ecore and github models 20 packageName = 'constraints.ecore';
20 return -1;
21 }else if (d == Domain.Github){ 21 }else if (d == Domain.Github){
22 return -1; 22 return -1;
23 } 23 }
24 24
25
26 var constriants = loadConstraints(packageName); 25 var constriants = loadConstraints(packageName);
27 var collections = new ConstraintCollection(constriants, Patterns.instance); 26 var collections = new ConstraintCollection(constriants, Ecore_pattern.instance);
28 collections.addModel(root); 27 collections.addModel(root);
29 var results = collections.calculateViolations(); 28 var results = collections.calculateViolations();
30 if(results.size > 0){ 29 if(results.size > 0){
@@ -54,7 +53,6 @@ class ViolationCheck {
54 53
55 val classPath = ClassPath.from(ClassLoader.systemClassLoader); 54 val classPath = ClassPath.from(ClassLoader.systemClassLoader);
56 val classInfos = classPath.getTopLevelClasses(packageName); 55 val classInfos = classPath.getTopLevelClasses(packageName);
57
58 for(info : classInfos){ 56 for(info : classInfos){
59 if(info.load.interfaces.contains(IConstraintSpecification)){ 57 if(info.load.interfaces.contains(IConstraintSpecification)){
60 //IConstraintSpecification only has one constructor with empty argument list 58 //IConstraintSpecification only has one constructor with empty argument list
@@ -63,7 +61,6 @@ class ViolationCheck {
63 constraints.add(instance as IConstraintSpecification); 61 constraints.add(instance as IConstraintSpecification);
64 } 62 }
65 } 63 }
66
67 return constraints 64 return constraints
68 } 65 }
69} 66}
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..560cebd4
--- /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..e3ff605c
--- /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..b57ea9b4
--- /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..c3fa40e1
--- /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..d4f25912
--- /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/yakindumm/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png
index 3ba463f4..b4f2b9a2 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png
+++ 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
index ed6c1c43..44da865d 100644
--- 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
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
index bfb0f1fd..fb9b86d1 100644
--- 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
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
index f7349c93..49e4222a 100644
--- 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
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
index a8790329..7d131230 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png
+++ 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
index bfae000e..5104cab5 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb
@@ -2,7 +2,7 @@
2 "cells": [ 2 "cells": [
3 { 3 {
4 "cell_type": "code", 4 "cell_type": "code",
5 "execution_count": 1, 5 "execution_count": 18,
6 "metadata": {}, 6 "metadata": {},
7 "outputs": [], 7 "outputs": [],
8 "source": [ 8 "source": [
@@ -20,7 +20,7 @@
20 }, 20 },
21 { 21 {
22 "cell_type": "code", 22 "cell_type": "code",
23 "execution_count": 2, 23 "execution_count": 19,
24 "metadata": {}, 24 "metadata": {},
25 "outputs": [], 25 "outputs": [],
26 "source": [ 26 "source": [
@@ -39,7 +39,7 @@
39 }, 39 },
40 { 40 {
41 "cell_type": "code", 41 "cell_type": "code",
42 "execution_count": 33, 42 "execution_count": 115,
43 "metadata": {}, 43 "metadata": {},
44 "outputs": [], 44 "outputs": [],
45 "source": [ 45 "source": [
@@ -47,26 +47,27 @@
47 "mpc_guide = getModels('../input/{}/MPC/'.format(domain), 100)\n", 47 "mpc_guide = getModels('../input/{}/MPC/'.format(domain), 100)\n",
48 "na_guide = getModels('../input/{}/NodeActivity/'.format(domain), 100)\n", 48 "na_guide = getModels('../input/{}/NodeActivity/'.format(domain), 100)\n",
49 "od_guide = getModels('../input/{}/OutDegree/'.format(domain), 100)\n", 49 "od_guide = getModels('../input/{}/OutDegree/'.format(domain), 100)\n",
50 "nt_guide = getModels('../input/{}/NodeType/'.format(domain), 100)\n", 50 "# nt_guide = getModels('../input/{}/NodeType/'.format(domain), 100)\n",
51 "composite_guide = getModels('../input/{}/Composite/'.format(domain), 100)\n", 51 "composite_guide = getModels('../input/{}/RealViatra/'.format(domain), 100)\n",
52 "composite_no_violations_guide = getModels('../input/{}/Composite_Without_Violations/'.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", 53 "# violations_guide = getModels('../input/{}/Violations/'.format(domain), 100)\n",
54 "human = getModels('../input/{}/Human/'.format(domain), 304)\n", 54 "human = getModels('../input/{}/Human/'.format(domain), 304)\n",
55 "model_types = [human, composite_guide, mpc_guide, na_guide, od_guide, nt_guide, composite_no_violations_guide, violations_guide]" 55 "model_types = [human, composite_guide, mpc_guide, od_guide, composite_no_violations_guide, na_guide]"
56 ] 56 ]
57 }, 57 },
58 { 58 {
59 "cell_type": "code", 59 "cell_type": "code",
60 "execution_count": 34, 60 "execution_count": 116,
61 "metadata": {}, 61 "metadata": {},
62 "outputs": [], 62 "outputs": [],
63 "source": [ 63 "source": [
64 "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}" 64 " 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",
65 "# 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}"
65 ] 66 ]
66 }, 67 },
67 { 68 {
68 "cell_type": "code", 69 "cell_type": "code",
69 "execution_count": 35, 70 "execution_count": 117,
70 "metadata": {}, 71 "metadata": {},
71 "outputs": [], 72 "outputs": [],
72 "source": [ 73 "source": [
@@ -89,7 +90,7 @@
89 }, 90 },
90 { 91 {
91 "cell_type": "code", 92 "cell_type": "code",
92 "execution_count": 36, 93 "execution_count": 118,
93 "metadata": {}, 94 "metadata": {},
94 "outputs": [], 95 "outputs": [],
95 "source": [ 96 "source": [
@@ -100,7 +101,7 @@
100 }, 101 },
101 { 102 {
102 "cell_type": "code", 103 "cell_type": "code",
103 "execution_count": 37, 104 "execution_count": 119,
104 "metadata": {}, 105 "metadata": {},
105 "outputs": [], 106 "outputs": [],
106 "source": [ 107 "source": [
@@ -118,11 +119,11 @@
118 }, 119 },
119 { 120 {
120 "cell_type": "code", 121 "cell_type": "code",
121 "execution_count": 46, 122 "execution_count": 120,
122 "metadata": {}, 123 "metadata": {},
123 "outputs": [], 124 "outputs": [],
124 "source": [ 125 "source": [
125 "labels = ['human', 'combined', 'mpc', 'node activity', 'out degree', 'node type', 'combined_nv', 'violations']\n", 126 "labels = ['human', 'combined', 'mpc', 'out degree', 'combined_nv', 'node activity', 'node type', 'violations']\n",
126 "output_path = '../output/{}/'.format(domain)\n", 127 "output_path = '../output/{}/'.format(domain)\n",
127 "mkdir(output_path)" 128 "mkdir(output_path)"
128 ] 129 ]
@@ -136,7 +137,7 @@
136 }, 137 },
137 { 138 {
138 "cell_type": "code", 139 "cell_type": "code",
139 "execution_count": 47, 140 "execution_count": 121,
140 "metadata": {}, 141 "metadata": {},
141 "outputs": [], 142 "outputs": [],
142 "source": [ 143 "source": [
@@ -148,18 +149,26 @@
148 " fig.set_size_inches(5, 4)\n", 149 " fig.set_size_inches(5, 4)\n",
149 " ax1.set_xticklabels(labels, rotation=45, fontsize=15)\n", 150 " ax1.set_xticklabels(labels, rotation=45, fontsize=15)\n",
150 " #plt.title(title, fontsize=20)\n", 151 " #plt.title(title, fontsize=20)\n",
151 " plt.boxplot(distances)\n", 152 " result = plt.boxplot(distances)\n",
153 " print(result['medians'][4].get_ydata())\n",
152 " plt.savefig('{}/{}.png'.format(output_path, title), dpi=500, bbox_inches=\"tight\")" 154 " plt.savefig('{}/{}.png'.format(output_path, title), dpi=500, bbox_inches=\"tight\")"
153 ] 155 ]
154 }, 156 },
155 { 157 {
156 "cell_type": "code", 158 "cell_type": "code",
157 "execution_count": 48, 159 "execution_count": 122,
158 "metadata": {}, 160 "metadata": {},
159 "outputs": [ 161 "outputs": [
160 { 162 {
163 "name": "stdout",
164 "output_type": "stream",
165 "text": [
166 "[0.03006364 0.03006364]\n"
167 ]
168 },
169 {
161 "data": { 170 "data": {
162 "image/png": "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\n", 171 "image/png": "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\n",
163 "text/plain": [ 172 "text/plain": [
164 "<Figure size 360x288 with 1 Axes>" 173 "<Figure size 360x288 with 1 Axes>"
165 ] 174 ]
@@ -180,12 +189,19 @@
180 }, 189 },
181 { 190 {
182 "cell_type": "code", 191 "cell_type": "code",
183 "execution_count": 49, 192 "execution_count": 123,
184 "metadata": {}, 193 "metadata": {},
185 "outputs": [ 194 "outputs": [
186 { 195 {
196 "name": "stdout",
197 "output_type": "stream",
198 "text": [
199 "[0.02142857 0.02142857]\n"
200 ]
201 },
202 {
187 "data": { 203 "data": {
188 "image/png": "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\n", 204 "image/png": "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\n",
189 "text/plain": [ 205 "text/plain": [
190 "<Figure size 360x288 with 1 Axes>" 206 "<Figure size 360x288 with 1 Axes>"
191 ] 207 ]
@@ -206,12 +222,19 @@
206 }, 222 },
207 { 223 {
208 "cell_type": "code", 224 "cell_type": "code",
209 "execution_count": 50, 225 "execution_count": 124,
210 "metadata": {}, 226 "metadata": {},
211 "outputs": [ 227 "outputs": [
212 { 228 {
229 "name": "stdout",
230 "output_type": "stream",
231 "text": [
232 "[0.02126645 0.02126645]\n"
233 ]
234 },
235 {
213 "data": { 236 "data": {
214 "image/png": "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\n", 237 "image/png": "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\n",
215 "text/plain": [ 238 "text/plain": [
216 "<Figure size 360x288 with 1 Axes>" 239 "<Figure size 360x288 with 1 Axes>"
217 ] 240 ]
@@ -232,7 +255,7 @@
232 }, 255 },
233 { 256 {
234 "cell_type": "code", 257 "cell_type": "code",
235 "execution_count": 51, 258 "execution_count": 125,
236 "metadata": {}, 259 "metadata": {},
237 "outputs": [], 260 "outputs": [],
238 "source": [ 261 "source": [
@@ -249,12 +272,20 @@
249 }, 272 },
250 { 273 {
251 "cell_type": "code", 274 "cell_type": "code",
252 "execution_count": 52, 275 "execution_count": 128,
253 "metadata": {}, 276 "metadata": {},
254 "outputs": [ 277 "outputs": [
255 { 278 {
279 "name": "stdout",
280 "output_type": "stream",
281 "text": [
282 "['Choice', 'Entry', 'Exit', 'FinalState', 'Region', 'State', 'Statechart', 'Transition']\n",
283 "[0.01196101 0.01196101]\n"
284 ]
285 },
286 {
256 "data": { 287 "data": {
257 "image/png": "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\n", 288 "image/png": "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\n",
258 "text/plain": [ 289 "text/plain": [
259 "<Figure size 360x288 with 1 Axes>" 290 "<Figure size 360x288 with 1 Axes>"
260 ] 291 ]
@@ -267,8 +298,9 @@
267 ], 298 ],
268 "source": [ 299 "source": [
269 "# draw node type\n", 300 "# draw node type\n",
270 "types = rep.nodeTypeStat.keys()\n", 301 "types = sorted(rep.nodeTypeStat.keys())\n",
271 "rep_type_dist = [float(rep.nodeTypeStat[key]) for key in types]\n", 302 "rep_type_dist = [float(rep.nodeTypeStat[key]) for key in types]\n",
303 "print(types)\n",
272 "node_type_types = []\n", 304 "node_type_types = []\n",
273 "for models in model_types:\n", 305 "for models in model_types:\n",
274 " type_dists = []\n", 306 " type_dists = []\n",
@@ -282,12 +314,19 @@
282 }, 314 },
283 { 315 {
284 "cell_type": "code", 316 "cell_type": "code",
285 "execution_count": 53, 317 "execution_count": 112,
286 "metadata": {}, 318 "metadata": {},
287 "outputs": [ 319 "outputs": [
288 { 320 {
321 "name": "stdout",
322 "output_type": "stream",
323 "text": [
324 "[0. 0.]\n"
325 ]
326 },
327 {
289 "data": { 328 "data": {
290 "image/png": "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\n", 329 "image/png": "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\n",
291 "text/plain": [ 330 "text/plain": [
292 "<Figure size 360x288 with 1 Axes>" 331 "<Figure size 360x288 with 1 Axes>"
293 ] 332 ]
@@ -312,6 +351,13 @@
312 "metadata": {}, 351 "metadata": {},
313 "outputs": [], 352 "outputs": [],
314 "source": [] 353 "source": []
354 },
355 {
356 "cell_type": "code",
357 "execution_count": null,
358 "metadata": {},
359 "outputs": [],
360 "source": []
315 } 361 }
316 ], 362 ],
317 "metadata": { 363 "metadata": {
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png
deleted file mode 100644
index b76e1162..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png
deleted file mode 100644
index 7c1e381e..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png
deleted file mode 100644
index b6c865a8..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png
deleted file mode 100644
index e734a9c2..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png
deleted file mode 100644
index a4f9033f..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png
deleted file mode 100644
index 343550b4..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png
deleted file mode 100644
index 8795605d..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png
deleted file mode 100644
index 5abfa423..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png
deleted file mode 100644
index e21d38f8..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.png
new file mode 100644
index 00000000..81085eab
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-rep-/Node Types_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.png
new file mode 100644
index 00000000..25b35ee7
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/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/Human-Alloy-rep-/Out_Degree_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.png
new file mode 100644
index 00000000..52b5e5f6
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.png
new file mode 100644
index 00000000..9e8289a8
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.png
new file mode 100644
index 00000000..e8a3093f
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.png
new file mode 100644
index 00000000..24a6fee6
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.png
new file mode 100644
index 00000000..7c5c9251
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.png
new file mode 100644
index 00000000..87845cef
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png
deleted file mode 100644
index da20de14..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png
deleted file mode 100644
index 0c60d130..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png
deleted file mode 100644
index e2cadbc5..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png
deleted file mode 100644
index ccd02aca..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png
deleted file mode 100644
index 1edf0945..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png
deleted file mode 100644
index 1e70734b..00000000
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png
+++ /dev/null
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py
index eb9d4ae2..02f28546 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py
@@ -12,36 +12,45 @@ import DistributionMetrics as metrics
12 12
13def main(): 13def main():
14 # read models 14 # read models
15 human = GraphCollection('../input/human_30_500_no_xml/', 500, 'human_no_xml') 15 alloy = GraphCollection('../input/measurement2/yakindu/Alloy/', 100, 'Alloy')
16 human2 = GraphCollection('../input/human_30_500_xml/', 500, 'human_xml') 16 human = GraphCollection('../input/measurement2/yakindu/Human/', 304, 'Human')
17 # human_na = GraphCollection('../input/human_models_50_500/na_rep/', 1, 'Human rep') 17 base = GraphCollection('../input/measurement2/yakindu/BaseViatra/', 100, 'BaseViatra')
18 # human_mpc = GraphCollection('../input/human_models_50_500/mpc_rep/', 1, 'Human rep') 18 real = GraphCollection('../input/measurement2/yakindu/RealViatra/', 100, 'RealViatra')
19 # human_od = GraphCollection('../input/human_models_50_500/od_rep/', 1, 'Human rep') 19 random = GraphCollection('../input/measurement2/yakindu/Random/', 100, 'Random')
20 20 na_rep = GraphCollection('../input/measurement2/yakindu/Human/na_rep/', 1, 'rep')
21 # viatra75 = GraphCollection('../input/viatra_75/', 500, 'Viatra (75 nodes)') 21 mpc_rep = GraphCollection('../input/measurement2/yakindu/Human/mpc_rep/', 1, 'rep')
22 # viatra30 = GraphCollection('../input/viatraOutput30/', 500,'Viatra (30 nodes)') 22 od_rep = GraphCollection('../input/measurement2/yakindu/Human/od_rep/', 1, 'rep')
23 # viatra60 = GraphCollection('../input/viatraOutput60/', 500, 'Viatra (60 nodes)') 23
24 # viatra100 = GraphCollection('../input/viatraOutput100/', 500, 'Viatra (100 nodes)') 24 # a hack to make the node type as the same as an exiting model
25 # viatra100R = GraphCollection('../input/realisticViatraOutput_newMetric/', 500, 'Realistic Viatra (100 nodes)') 25 type_rep = GraphCollection('../input/measurement2/yakindu/Human/od_rep/', 1, 'rep')
26 # viatra100C = GraphCollection('../input/yakindumm/viatraOutput100C/', 500, 'Viatra consistent (100 nodes)') 26 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}]
27 # viatra100EE = GraphCollection('../input/realisticViatra_excludeExit/', 500, 'Realistic Viatra no Exit (100 nodes)') 27 types = sorted(type_rep.nts[0].keys())
28 # viatra100EEF = GraphCollection('../input/realisticViatra_excludeExitFinal/', 500, 'Realistic Viatra no Exit Final (100 nodes)')
29 # viatra100NT = GraphCollection('../input/yakindumm/realisticVIatraOutput_nodeTypeKS/', 500, 'Realistic Viatra with Node Type KS (100 nodes)')
30 28
31 # random = GraphCollection('../input/randomOutput/', 500, 'Random') 29 # random = GraphCollection('../input/randomOutput/', 500, 'Random')
32 # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)') 30 # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)')
33 # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)') 31 # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)')
34 models_to_compare_na = [human, human2] 32 models_to_compare_na = [human, alloy,base, real, random, na_rep]
35 models_to_compare_mpc = [human, human2] 33 models_to_compare_mpc = [human, alloy,base, real, random, mpc_rep]
36 models_to_compare_od = [human, human2] 34 models_to_compare_od = [human, alloy,base, real, random, od_rep]
37 35 models_to_compare_nt = [human, alloy,base, real, random, type_rep]
36 for modelCollection in models_to_compare_nt:
37 type_dists = []
38 for nt in modelCollection.nts:
39 type_dist = []
40 for key in types:
41 type_dist.append(nt.get(key, 0.0))
42 type_dists.append(type_dist)
43 modelCollection.nts = type_dists
44
45
38 # define output folder 46 # define output folder
39 outputFolder = '../output/' 47 outputFolder = '../output/'
40 48
41 #calculate metrics 49 #calculate metrics
42 metricStat(models_to_compare_na, 'Node Activity', nodeActivity, 0, outputFolder) 50 # metricStat(models_to_compare_na, 'Node_Activity', nodeActivity, 0, outputFolder)
43 metricStat(models_to_compare_od, 'Out Degree', outDegree, 1, outputFolder) 51 metricStat(models_to_compare_od, 'Out_Degree', outDegree, 1, outputFolder)
44 metricStat(models_to_compare_mpc, 'MPC', mpc, 2, outputFolder) 52 # metricStat(models_to_compare_mpc, 'MPC', mpc, 2, outputFolder)
53 # metricStat(models_to_compare_nt, 'Node Types', nodeType, 3, outputFolder)
45 54
46def calculateKSMatrix(dists): 55def calculateKSMatrix(dists):
47 dist = [] 56 dist = []
@@ -65,18 +74,19 @@ def calculateMDS(dissimilarities):
65 return trans 74 return trans
66 75
67def plot(graphTypes, coords, title='',index = 0, savePath = ''): 76def plot(graphTypes, coords, title='',index = 0, savePath = ''):
68 color = ['blue', 'red', 'yellow', 'green', 'k'] 77 color = ['blue', 'm', 'gold', 'green', 'k', 'red']
69 plt.figure(index, figsize=(7, 4)) 78 markers = ['o', 'v', '+', 'x', '^', '*']
70 plt.title(title) 79 plt.figure(index, figsize=(5, 4))
80 # plt.title(title)
71 index = 0 81 index = 0
72 for i in range(len(graphTypes)): 82 for i in range(len(graphTypes)):
73 x = (coords[index:index+graphTypes[i].size, 0].tolist()) 83 x = (coords[index:index+graphTypes[i].size, 0].tolist())
74 y = (coords[index:index+graphTypes[i].size, 1].tolist()) 84 y = (coords[index:index+graphTypes[i].size, 1].tolist())
75 index += graphTypes[i].size 85 index += graphTypes[i].size
76 plt.plot(x, y, color=color[i], marker='o', label = graphTypes[i].name, linestyle='', alpha=0.7) 86 plt.plot(x, y, color=color[i], marker=markers[i], label = graphTypes[i].name, linestyle='', alpha=0.7)
87 plt.savefig(fname = savePath+'.png', dpi=500)
77 plt.legend(loc='upper right') 88 plt.legend(loc='upper right')
78 plt.savefig(fname = savePath, dpi=150) 89 plt.savefig(fname = savePath+'_lengend.png', dpi=500)
79 #graph.show()
80 90
81def mkdir_p(mypath): 91def mkdir_p(mypath):
82 '''Creates a directory. equivalent to using mkdir -p on the command line''' 92 '''Creates a directory. equivalent to using mkdir -p on the command line'''
@@ -99,7 +109,7 @@ def metricStat(graphTypes, metricName, metric, graphIndex, outputFolder):
99 print('calculate' + metricName +' for ' + outputFolder) 109 print('calculate' + metricName +' for ' + outputFolder)
100 mkdir_p(outputFolder) 110 mkdir_p(outputFolder)
101 out_d_coords = calculateMDS(calculateKSMatrix(metrics)) 111 out_d_coords = calculateMDS(calculateKSMatrix(metrics))
102 plot(graphTypes, out_d_coords, metricName, graphIndex,outputFolder + '/'+ metricName+'.png') 112 plot(graphTypes, out_d_coords, metricName, graphIndex,outputFolder + '/'+ metricName)
103 113
104def nodeActivity(graphType): 114def nodeActivity(graphType):
105 return graphType.nas 115 return graphType.nas
@@ -110,5 +120,8 @@ def outDegree(graphType):
110def mpc(graphType): 120def mpc(graphType):
111 return graphType.mpcs 121 return graphType.mpcs
112 122
123def nodeType(graphType):
124 return graphType.nts
125
113if __name__ == '__main__': 126if __name__ == '__main__':
114 main() \ No newline at end of file 127 main() \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb
index 8d7b1bc3..32edb00c 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb
+++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb
@@ -16,7 +16,7 @@
16 }, 16 },
17 { 17 {
18 "cell_type": "code", 18 "cell_type": "code",
19 "execution_count": 1, 19 "execution_count": 2,
20 "metadata": {}, 20 "metadata": {},
21 "outputs": [], 21 "outputs": [],
22 "source": [ 22 "source": [
@@ -43,7 +43,7 @@
43 }, 43 },
44 { 44 {
45 "cell_type": "code", 45 "cell_type": "code",
46 "execution_count": 2, 46 "execution_count": 3,
47 "metadata": {}, 47 "metadata": {},
48 "outputs": [], 48 "outputs": [],
49 "source": [ 49 "source": [
@@ -64,16 +64,16 @@
64 }, 64 },
65 { 65 {
66 "cell_type": "code", 66 "cell_type": "code",
67 "execution_count": 27, 67 "execution_count": 4,
68 "metadata": {}, 68 "metadata": {},
69 "outputs": [ 69 "outputs": [
70 { 70 {
71 "data": { 71 "data": {
72 "text/plain": [ 72 "text/plain": [
73 "198" 73 "304"
74 ] 74 ]
75 }, 75 },
76 "execution_count": 27, 76 "execution_count": 4,
77 "metadata": {}, 77 "metadata": {},
78 "output_type": "execute_result" 78 "output_type": "execute_result"
79 } 79 }
@@ -90,7 +90,7 @@
90 " orientation='horizontal'\n", 90 " orientation='horizontal'\n",
91 ")\n", 91 ")\n",
92 "\n", 92 "\n",
93 "humanFiles = reader.readmultiplefiles('../input/human_30_500_no_xml/', 1300, False)\n", 93 "humanFiles = reader.readmultiplefiles('../input/Human/', 1300, False)\n",
94 "modelToFileName = {}\n", 94 "modelToFileName = {}\n",
95 "for name in humanFiles:\n", 95 "for name in humanFiles:\n",
96 " modelToFileName[GraphStat(name)] = name\n", 96 " modelToFileName[GraphStat(name)] = name\n",
@@ -115,7 +115,7 @@
115 }, 115 },
116 { 116 {
117 "cell_type": "code", 117 "cell_type": "code",
118 "execution_count": 28, 118 "execution_count": 5,
119 "metadata": {}, 119 "metadata": {},
120 "outputs": [], 120 "outputs": [],
121 "source": [ 121 "source": [
@@ -164,15 +164,15 @@
164 }, 164 },
165 { 165 {
166 "cell_type": "code", 166 "cell_type": "code",
167 "execution_count": 29, 167 "execution_count": 6,
168 "metadata": {}, 168 "metadata": {},
169 "outputs": [ 169 "outputs": [
170 { 170 {
171 "name": "stdout", 171 "name": "stdout",
172 "output_type": "stream", 172 "output_type": "stream",
173 "text": [ 173 "text": [
174 "../input/human_30_500_no_xml\\rdm_run_1.csv\n", 174 "../input/Human\\33_run_1.csv\n",
175 "../input/human_30_500_no_xml\\rdm_run_1.csv\n" 175 "../input/Human\\33_run_1.csv\n"
176 ] 176 ]
177 } 177 }
178 ], 178 ],
@@ -185,17 +185,17 @@
185 }, 185 },
186 { 186 {
187 "cell_type": "code", 187 "cell_type": "code",
188 "execution_count": 30, 188 "execution_count": 7,
189 "metadata": {}, 189 "metadata": {},
190 "outputs": [ 190 "outputs": [
191 { 191 {
192 "name": "stdout", 192 "name": "stdout",
193 "output_type": "stream", 193 "output_type": "stream",
194 "text": [ 194 "text": [
195 "average distance: 0.1120958646931491\n", 195 "average distance: 0.04615092955852465\n",
196 "median: 0.07794784580498866\n", 196 "median: 0.04402137483980782\n",
197 "std: 0.10338893965532157\n", 197 "std: 0.017305709419913242\n",
198 "max: 0.8512271307452031\n", 198 "max: 0.1411706837186424\n",
199 "min: 0.0\n" 199 "min: 0.0\n"
200 ] 200 ]
201 } 201 }
@@ -242,15 +242,15 @@
242 }, 242 },
243 { 243 {
244 "cell_type": "code", 244 "cell_type": "code",
245 "execution_count": 31, 245 "execution_count": 8,
246 "metadata": {}, 246 "metadata": {},
247 "outputs": [ 247 "outputs": [
248 { 248 {
249 "name": "stdout", 249 "name": "stdout",
250 "output_type": "stream", 250 "output_type": "stream",
251 "text": [ 251 "text": [
252 "../input/human_30_500_no_xml\\XSHMLMT_run_1.csv\n", 252 "../input/Human\\288_run_1.csv\n",
253 "../input/human_30_500_no_xml\\XSHMLMT_run_1.csv\n" 253 "../input/Human\\288_run_1.csv\n"
254 ] 254 ]
255 } 255 }
256 ], 256 ],
@@ -263,17 +263,17 @@
263 }, 263 },
264 { 264 {
265 "cell_type": "code", 265 "cell_type": "code",
266 "execution_count": 32, 266 "execution_count": 9,
267 "metadata": {}, 267 "metadata": {},
268 "outputs": [ 268 "outputs": [
269 { 269 {
270 "name": "stdout", 270 "name": "stdout",
271 "output_type": "stream", 271 "output_type": "stream",
272 "text": [ 272 "text": [
273 "average distance: 0.11606713468404145\n", 273 "average distance: 0.046794293118067494\n",
274 "median: 0.08615545879696823\n", 274 "median: 0.03898868458274401\n",
275 "std: 0.09424733847431985\n", 275 "std: 0.02880119213919405\n",
276 "max: 0.8536367692994199\n", 276 "max: 0.18702970297029703\n",
277 "min: 0.0\n" 277 "min: 0.0\n"
278 ] 278 ]
279 } 279 }
@@ -320,15 +320,15 @@
320 }, 320 },
321 { 321 {
322 "cell_type": "code", 322 "cell_type": "code",
323 "execution_count": 33, 323 "execution_count": 10,
324 "metadata": {}, 324 "metadata": {},
325 "outputs": [ 325 "outputs": [
326 { 326 {
327 "name": "stdout", 327 "name": "stdout",
328 "output_type": "stream", 328 "output_type": "stream",
329 "text": [ 329 "text": [
330 "../input/human_30_500_no_xml\\Sql_run_1.csv\n", 330 "../input/Human\\151_run_1.csv\n",
331 "../input/human_30_500_no_xml\\Sql_run_1.csv\n" 331 "../input/Human\\151_run_1.csv\n"
332 ] 332 ]
333 } 333 }
334 ], 334 ],
@@ -341,17 +341,17 @@
341 }, 341 },
342 { 342 {
343 "cell_type": "code", 343 "cell_type": "code",
344 "execution_count": 34, 344 "execution_count": 11,
345 "metadata": {}, 345 "metadata": {},
346 "outputs": [ 346 "outputs": [
347 { 347 {
348 "name": "stdout", 348 "name": "stdout",
349 "output_type": "stream", 349 "output_type": "stream",
350 "text": [ 350 "text": [
351 "average distance: 0.1365610722702415\n", 351 "average distance: 0.07028909225833632\n",
352 "median: 0.10589419186354082\n", 352 "median: 0.06254480286738351\n",
353 "std: 0.09795223151686845\n", 353 "std: 0.037281890512224164\n",
354 "max: 0.8574673315618971\n", 354 "max: 0.21961550993809065\n",
355 "min: 0.0\n" 355 "min: 0.0\n"
356 ] 356 ]
357 } 357 }
@@ -366,20 +366,6 @@
366 "print('max:', max(distances))\n", 366 "print('max:', max(distances))\n",
367 "print('min:', min(distances))" 367 "print('min:', min(distances))"
368 ] 368 ]
369 },
370 {
371 "cell_type": "code",
372 "execution_count": null,
373 "metadata": {},
374 "outputs": [],
375 "source": []
376 },
377 {
378 "cell_type": "code",
379 "execution_count": null,
380 "metadata": {},
381 "outputs": [],
382 "source": []
383 } 369 }
384 ], 370 ],
385 "metadata": { 371 "metadata": {
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
index 8f01040d..80365bb8 100644
--- 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
@@ -2,7 +2,7 @@
2 "cells": [ 2 "cells": [
3 { 3 {
4 "cell_type": "code", 4 "cell_type": "code",
5 "execution_count": 5, 5 "execution_count": 1,
6 "metadata": {}, 6 "metadata": {},
7 "outputs": [], 7 "outputs": [],
8 "source": [ 8 "source": [
@@ -18,7 +18,7 @@
18 }, 18 },
19 { 19 {
20 "cell_type": "code", 20 "cell_type": "code",
21 "execution_count": 6, 21 "execution_count": 2,
22 "metadata": {}, 22 "metadata": {},
23 "outputs": [], 23 "outputs": [],
24 "source": [ 24 "source": [
@@ -30,7 +30,7 @@
30 }, 30 },
31 { 31 {
32 "cell_type": "code", 32 "cell_type": "code",
33 "execution_count": 7, 33 "execution_count": 3,
34 "metadata": {}, 34 "metadata": {},
35 "outputs": [], 35 "outputs": [],
36 "source": [ 36 "source": [
@@ -52,7 +52,7 @@
52 }, 52 },
53 { 53 {
54 "cell_type": "code", 54 "cell_type": "code",
55 "execution_count": 5, 55 "execution_count": 4,
56 "metadata": { 56 "metadata": {
57 "scrolled": true 57 "scrolled": true
58 }, 58 },
@@ -61,12 +61,12 @@
61 "name": "stdout", 61 "name": "stdout",
62 "output_type": "stream", 62 "output_type": "stream",
63 "text": [ 63 "text": [
64 "['EParameter', 'EStringToStringMapEntry', 'EOperation', 'EAttribute', 'ETypeParameter', 'EClass', 'EReference', 'EDataType', 'EGenericType', 'EEnum', 'EAnnotation', 'EEnumLiteral', 'EPackage']\n" 64 "['EPackage', 'EAttribute', 'EEnumLiteral', 'EGenericType', 'EAnnotation', 'EOperation', 'EEnum', 'ETypeParameter', 'EParameter', 'EReference', 'EClass', 'EStringToStringMapEntry', 'EDataType']\n"
65 ] 65 ]
66 }, 66 },
67 { 67 {
68 "data": { 68 "data": {
69 "image/png": "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\n", 69 "image/png": "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\n",
70 "text/plain": [ 70 "text/plain": [
71 "<Figure size 432x288 with 1 Axes>" 71 "<Figure size 432x288 with 1 Axes>"
72 ] 72 ]
@@ -78,7 +78,7 @@
78 }, 78 },
79 { 79 {
80 "data": { 80 "data": {
81 "image/png": "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\n", 81 "image/png": "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\n",
82 "text/plain": [ 82 "text/plain": [
83 "<Figure size 432x288 with 1 Axes>" 83 "<Figure size 432x288 with 1 Axes>"
84 ] 84 ]
@@ -90,7 +90,7 @@
90 }, 90 },
91 { 91 {
92 "data": { 92 "data": {
93 "image/png": "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\n", 93 "image/png": "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\n",
94 "text/plain": [ 94 "text/plain": [
95 "<Figure size 432x288 with 1 Axes>" 95 "<Figure size 432x288 with 1 Axes>"
96 ] 96 ]
@@ -102,7 +102,7 @@
102 }, 102 },
103 { 103 {
104 "data": { 104 "data": {
105 "image/png": "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\n", 105 "image/png": "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\n",
106 "text/plain": [ 106 "text/plain": [
107 "<Figure size 432x288 with 1 Axes>" 107 "<Figure size 432x288 with 1 Axes>"
108 ] 108 ]
@@ -114,7 +114,7 @@
114 }, 114 },
115 { 115 {
116 "data": { 116 "data": {
117 "image/png": "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\n", 117 "image/png": "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\n",
118 "text/plain": [ 118 "text/plain": [
119 "<Figure size 432x288 with 1 Axes>" 119 "<Figure size 432x288 with 1 Axes>"
120 ] 120 ]
@@ -126,7 +126,7 @@
126 }, 126 },
127 { 127 {
128 "data": { 128 "data": {
129 "image/png": "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\n", 129 "image/png": "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\n",
130 "text/plain": [ 130 "text/plain": [
131 "<Figure size 432x288 with 1 Axes>" 131 "<Figure size 432x288 with 1 Axes>"
132 ] 132 ]
@@ -138,7 +138,7 @@
138 }, 138 },
139 { 139 {
140 "data": { 140 "data": {
141 "image/png": "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\n", 141 "image/png": "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\n",
142 "text/plain": [ 142 "text/plain": [
143 "<Figure size 432x288 with 1 Axes>" 143 "<Figure size 432x288 with 1 Axes>"
144 ] 144 ]
@@ -150,7 +150,7 @@
150 }, 150 },
151 { 151 {
152 "data": { 152 "data": {
153 "image/png": "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\n", 153 "image/png": "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\n",
154 "text/plain": [ 154 "text/plain": [
155 "<Figure size 432x288 with 1 Axes>" 155 "<Figure size 432x288 with 1 Axes>"
156 ] 156 ]
@@ -162,7 +162,7 @@
162 }, 162 },
163 { 163 {
164 "data": { 164 "data": {
165 "image/png": "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\n", 165 "image/png": "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\n",
166 "text/plain": [ 166 "text/plain": [
167 "<Figure size 432x288 with 1 Axes>" 167 "<Figure size 432x288 with 1 Axes>"
168 ] 168 ]
@@ -174,7 +174,7 @@
174 }, 174 },
175 { 175 {
176 "data": { 176 "data": {
177 "image/png": "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\n", 177 "image/png": "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\n",
178 "text/plain": [ 178 "text/plain": [
179 "<Figure size 432x288 with 1 Axes>" 179 "<Figure size 432x288 with 1 Axes>"
180 ] 180 ]
@@ -186,7 +186,7 @@
186 }, 186 },
187 { 187 {
188 "data": { 188 "data": {
189 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAVdklEQVR4nO3df5BlZX3n8fcn/EzUdRAaC2cmDpoxkbjlSHUIKfcHghUBI4MVsKCMTCjKCVlImTK1BmJlo5uwi6lVUlaIZlxYBqMCaiIjIZsQfpSLJZBGB2RAlhFHGGdkmvAjskQM8N0/7jPx0nRP357bt2f6zPtVdeue85znnvt9+senTz/33HtSVUiSuuUn9nQBkqT5Z7hLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IHGe7SAknyySS/v6fr0L7BcNdeJ8mWJP+c5Km+25/2bT8uSSX5wALWdEWSP5pD/19Pcmt/W1WdW1V/OP/VSS9muGtv9Y6qemnf7fy+bWuAx9q9pGkY7lpUkvwUcBpwHrAyyXjfthXtiH5NkoeSPJrkg33bP5TkmiRXJvlBkk1THv/6JLckeaJtO6W1rwXeDXyg/Rfx5dZ+QZJvt33dm+SdO/cDfBL4pdb/idb+gqP/JO9NsjnJY0k2JHlV37ZKcm6SB5I8nuTSJBnJF1WdZLhrsflV4Cng88DfAmdN0+ffAT8LnAD8lxa2O50CXAUsATYAfwqQ5ADgy8DfAYcDvwV8JsnPVtU64DPAH7f/It7R9vVt4N8DLwc+DPxFkiOq6j7gXOBrrf+SqQUmOR7478C7gCOA77a6+v0K8AvAG1u/tw30FZIw3LX3+lI7gt55e29rXwNcXVXPAZ8FzmzB3O/DVfXPVXUXcBe9cNzp1qq6vj3+033bjgVeClxcVT+qqpuA64AzZyqwqj5fVduq6vmquhp4ADhmwPG9G7i8qr5eVc8AF9I70l/R1+fiqnqiqh4CbgZWDbhvyXDXXuvUqlrSd/tUkuXAW+gdRQNcCxwMvH3KY7/ft/w0vdCeadvBSfYHXgU8XFXP923/LrB0pgKTnJVk484/QMAbgMMGHN+r2v4BqKqngH+c8ny7Goe0S4a7FpP30PuZ/XKS7wMP0gv36aZm5mobsDxJ/+/ETwPfa8sv+PjUJK8GPgWcDxzapl7uATJd/xme79V9+3sJcGjf80lDMdy1mJxFb257Vd/tV4G3Jzl0yH3fDvw/ei+aHpDkOOAd/Hge/BHgNX39X0IvwCcBkpxN78idvv7Lkhw4w/N9Fjg7yaokBwH/Dbi9qrYMOQ4JMNy19/rylPPcbwZWAJdW1ff7bhuAzexibnwQVfUjei+2ngQ8CvwZcFZVfat1uQw4qk3BfKmq7gU+CnyNXpD/W+Crfbu8CdgEfD/Jo9M8343A7wNfBLYDrwXOGGYMUr94sQ5J6h6P3CWpgwx3Seogw12SOshwl6QO2n9PFwBw2GGH1YoVK/Z0GZK0qNx5552PVtXYdNv2inBfsWIFExMTe7oMSVpUknx3pm1Oy0hSBxnuktRBhrskdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IH7RXvUB3Gigv+esZtWy6eemlNSdo3eOQuSR1kuEtSBxnuktRBhrskdZDhLkkdNHC4J9kvyTeSXNfWj0xye5IHklyd5MDWflBb39y2rxhN6ZKkmczlyP19wH196x8BLqmqlcDjwDmt/Rzg8ar6GeCS1k+StIAGCvcky4C3A/+zrQc4HvhC67IeOLUtr27rtO0ntP6SpAUy6JH7nwAfAJ5v64cCT1TVs219K7C0LS8FHgZo259s/SVJC2TWcE/yK8COqrqzv3marjXAtv79rk0ykWRicnJyoGIlSYMZ5Mj9zcApSbYAV9GbjvkTYEmSnR9fsAzY1pa3AssB2vaXA49N3WlVrauq8aoaHxub9uLdkqTdNGu4V9WFVbWsqlYAZwA3VdW7gZuB01q3NcC1bXlDW6dtv6mqXnTkLkkanWHOc/9d4P1JNtObU7+stV8GHNra3w9cMFyJkqS5mtOnQlbVLcAtbflB4Jhp+vwQOH0eapMk7SbfoSpJHWS4S1IHGe6S1EGGuyR1kOEuSR1kuEtSBxnuktRBhrskdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IHGe6S1EGGuyR10CAXyD44yR1J7kqyKcmHW/sVSb6TZGO7rWrtSfLxJJuT3J3k6FEPQpL0QoNciekZ4PiqeirJAcCtSf6mbfvPVfWFKf1PAla22y8Cn2j3kqQFMsgFsquqnmqrB7Tbri54vRq4sj3uNmBJkiOGL1WSNKiB5tyT7JdkI7ADuKGqbm+bLmpTL5ckOai1LQUe7nv41tY2dZ9rk0wkmZicnBxiCJKkqQYK96p6rqpWAcuAY5K8AbgQ+DngF4BXAL/bume6XUyzz3VVNV5V42NjY7tVvCRpenM6W6aqngBuAU6squ1t6uUZ4H8Bx7RuW4HlfQ9bBmybh1olSQMa5GyZsSRL2vJPAm8FvrVzHj1JgFOBe9pDNgBntbNmjgWerKrtI6lekjStQc6WOQJYn2Q/en8Mrqmq65LclGSM3jTMRuDc1v964GRgM/A0cPb8ly1J2pVZw72q7gbeNE378TP0L+C84UuTJO0u36EqSR1kuEtSBxnuktRBhrskdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IHGe6S1EGGuyR1kOEuSR1kuEtSBxnuktRBhrskddAgl9k7OMkdSe5KsinJh1v7kUluT/JAkquTHNjaD2rrm9v2FaMdgiRpqkGO3J8Bjq+qNwKrgBPbtVE/AlxSVSuBx4FzWv9zgMer6meAS1o/SdICmjXcq+eptnpAuxVwPPCF1r6e3kWyAVa3ddr2E9pFtCVJC2SgOfck+yXZCOwAbgC+DTxRVc+2LluBpW15KfAwQNv+JHDoNPtcm2QiycTk5ORwo5AkvcBA4V5Vz1XVKmAZcAzw+um6tfvpjtLrRQ1V66pqvKrGx8bGBq1XkjSAOZ0tU1VPALcAxwJLkuzfNi0DtrXlrcBygLb95cBj81GsJGkwg5wtM5ZkSVv+SeCtwH3AzcBprdsa4Nq2vKGt07bfVFUvOnKXJI3O/rN34QhgfZL96P0xuKaqrktyL3BVkj8CvgFc1vpfBnw6yWZ6R+xnjKBuSdIuzBruVXU38KZp2h+kN/8+tf2HwOnzUp0kabf4DlVJ6iDDXZI6yHCXpA4y3CWpgwx3Seogw12SOshwl6QOMtwlqYMMd0nqIMNdkjrIcJekDjLcJamDDHdJ6iDDXZI6yHCXpA4a5EpMy5PcnOS+JJuSvK+1fyjJ95JsbLeT+x5zYZLNSe5P8rZRDkCS9GKDXInpWeB3qurrSV4G3Jnkhrbtkqr6H/2dkxxF7+pLPw+8Cvj7JK+rqufms3BJ0sxmPXKvqu1V9fW2/AN6109duouHrAauqqpnquo7wGamuWKTJGl05jTnnmQFvUvu3d6azk9yd5LLkxzS2pYCD/c9bCu7/mMgSZpnA4d7kpcCXwR+u6r+CfgE8FpgFbAd+OjOrtM8vKbZ39okE0kmJicn51y4JGlmA4V7kgPoBftnquovAarqkap6rqqeBz7Fj6detgLL+x6+DNg2dZ9Vta6qxqtqfGxsbJgxSJKmGORsmQCXAfdV1cf62o/o6/ZO4J62vAE4I8lBSY4EVgJ3zF/JkqTZDHK2zJuB9wDfTLKxtf0ecGaSVfSmXLYAvwFQVZuSXAPcS+9Mm/M8U0aSFtas4V5VtzL9PPr1u3jMRcBFQ9QlSRqC71CVpA4y3CWpgwx3Seogw12SOshwl6QOMtwlqYMMd0nqIMNdkjrIcJekDjLcJamDDHdJ6iDDXZI6yHCXpA4y3CWpgwx3Seogw12SOmiQy+wtT3JzkvuSbEryvtb+iiQ3JHmg3R/S2pPk40k2J7k7ydGjHoQk6YUGOXJ/Fvidqno9cCxwXpKjgAuAG6tqJXBjWwc4id51U1cCa4FPzHvVkqRdmjXcq2p7VX29Lf8AuA9YCqwG1rdu64FT2/Jq4MrquQ1YMuVi2pKkEZvTnHuSFcCbgNuBV1bVduj9AQAOb92WAg/3PWxra5u6r7VJJpJMTE5Ozr1ySdKMBg73JC8Fvgj8dlX90666TtNWL2qoWldV41U1PjY2NmgZkqQBDBTuSQ6gF+yfqaq/bM2P7Jxuafc7WvtWYHnfw5cB2+anXEnSIAY5WybAZcB9VfWxvk0bgDVteQ1wbV/7We2smWOBJ3dO30iSFsb+A/R5M/Ae4JtJNra23wMuBq5Jcg7wEHB623Y9cDKwGXgaOHteK5YkzWrWcK+qW5l+Hh3ghGn6F3DekHVJkobgO1QlqYMMd0nqIMNdkjrIcJekDjLcJamDDHdJ6iDDXZI6yHCXpA4y3CWpgwx3Seogw12SOshwl6QOMtwlqYMMd0nqIMNdkjrIcJekDhrkMnuXJ9mR5J6+tg8l+V6Sje12ct+2C5NsTnJ/kreNqnBJ0swGOXK/AjhxmvZLqmpVu10PkOQo4Azg59tj/izJfvNVrCRpMLOGe1V9BXhswP2tBq6qqmeq6jv0rqN6zBD1SZJ2wzBz7ucnubtN2xzS2pYCD/f12draXiTJ2iQTSSYmJyeHKEOSNNXuhvsngNcCq4DtwEdb+3QX0q7pdlBV66pqvKrGx8bGdrMMSdJ0divcq+qRqnquqp4HPsWPp162Asv7ui4Dtg1XoiRprnYr3JMc0bf6TmDnmTQbgDOSHJTkSGAlcMdwJUqS5mr/2Tok+RxwHHBYkq3AHwDHJVlFb8plC/AbAFW1Kck1wL3As8B5VfXcaEqXJM1k1nCvqjOnab5sF/0vAi4apihJ0nB8h6okdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHWS4S1IHGe6S1EGGuyR1kOEuSR1kuEtSBxnuktRBhrskdZDhLkkdZLhLUgfNGu7tAtg7ktzT1/aKJDckeaDdH9Lak+TjSTa3i2cfPcriJUnTG+TI/QrgxCltFwA3VtVK4Ma2DnASvUvrrQTW0ruQtiRpgc0a7lX1FeCxKc2rgfVteT1wal/7ldVzG7BkyvVWJUkLYHfn3F9ZVdsB2v3hrX0p8HBfv62t7UWSrE0ykWRicnJyN8uQJE1nvl9QzTRtNV3HqlpXVeNVNT42NjbPZUjSvm13w/2RndMt7X5Ha98KLO/rtwzYtvvlSZJ2x+6G+wZgTVteA1zb135WO2vmWODJndM3kqSFs/9sHZJ8DjgOOCzJVuAPgIuBa5KcAzwEnN66Xw+cDGwGngbOHkHNkqRZzBruVXXmDJtOmKZvAecNW5QkaTi+Q1WSOshwl6QOMtwlqYMMd0nqIMNdkjrIcJekDjLcJamDDHdJ6iDDXZI6yHCXpA4y3CWpgwx3Seogw12SOshwl6QOMtwlqYMMd0nqoFkv1rErSbYAPwCeA56tqvEkrwCuBlYAW4B3VdXjw5UpSZqL+Thyf0tVraqq8bZ+AXBjVa0EbmzrkqQFNIppmdXA+ra8Hjh1BM8hSdqFYcO9gL9LcmeSta3tlVW1HaDdHz7dA5OsTTKRZGJycnLIMiRJ/YaacwfeXFXbkhwO3JDkW4M+sKrWAesAxsfHa8g6JEl9hjpyr6pt7X4H8FfAMcAjSY4AaPc7hi1SkjQ3ux3uSV6S5GU7l4FfBu4BNgBrWrc1wLXDFilJmpthpmVeCfxVkp37+WxV/e8k/wBck+Qc4CHg9OHLlCTNxW6He1U9CLxxmvZ/BE4YpihJ0nB8h6okdZDhLkkdZLhLUgcZ7pLUQYa7JHWQ4S5JHTTsxw9oEVhxwV/PuG3LxW9fwEokLRTDfR83U/Ab+tLiZrh3yK6O0CXtWwz3ERj10bAhLmk2hvsQuhyyTtdIi1unw92Amn9+TaXFodPhPpO5HnEbXJIWm30y3OdqvqZf5nrU2+VpH0mjZbjvBQxxSfPNcNe8cKpL2ruM7OMHkpyY5P4km5NcMKrnkSS92EjCPcl+wKXAScBRwJlJjhrFc0mSXmxU0zLHAJvbpfhIchWwGrh3RM+nRWa+TqncF6eD9sUxa+5GFe5LgYf71rcCv9jfIclaYG1bfSrJ/bv5XIcBj+7mYxerzo45H5lx07yMeRf73xs55n3DMGN+9UwbRhXumaatXrBStQ5YN/QTJRNVNT7sfhYTx7xvcMz7hlGNeVQvqG4FlvetLwO2jei5JElTjCrc/wFYmeTIJAcCZwAbRvRckqQpRjItU1XPJjkf+FtgP+Dyqto0iudiHqZ2FiHHvG9wzPuGkYw5VTV7L0nSouI1VCWpgwx3SeqgRRPus32cQZKDklzdtt+eZMXCVzm/Bhjz+5Pcm+TuJDcmmfGc18Vi0I+tSHJakkqy6E+bG2TMSd7Vvtebknx2oWucbwP8bP90kpuTfKP9fJ+8J+qcL0kuT7IjyT0zbE+Sj7evx91Jjh76Satqr7/Re1H228BrgAOBu4CjpvT5T8An2/IZwNV7uu4FGPNbgJ9qy7+5L4y59XsZ8BXgNmB8T9e9AN/nlcA3gEPa+uF7uu4FGPM64Dfb8lHAlj1d95Bj/g/A0cA9M2w/Gfgbeu8ROha4fdjnXCxH7v/6cQZV9SNg58cZ9FsNrG/LXwBOSDLdm6kWi1nHXFU3V9XTbfU2eu8nWMwG+T4D/CHwx8APF7K4ERlkzO8FLq2qxwGqascC1zjfBhlzAf+mLb+cRf4+mar6CvDYLrqsBq6sntuAJUmOGOY5F0u4T/dxBktn6lNVzwJPAocuSHWjMciY+51D7y//YjbrmJO8CVheVdctZGEjNMj3+XXA65J8NcltSU5csOpGY5Axfwj4tSRbgeuB31qY0vaYuf6+z2qxfJ77rB9nMGCfxWTg8ST5NWAc+I8jrWj0djnmJD8BXAL8+kIVtAAG+T7vT29q5jh6/539nyRvqKonRlzbqAwy5jOBK6rqo0l+Cfh0G/Pzoy9vj5j3/FosR+6DfJzBv/ZJsj+9f+V29W/Q3m6gj3BI8lbgg8ApVfXMAtU2KrON+WXAG4BbkmyhNze5YZG/qDroz/a1VfUvVfUd4H56Yb9YDTLmc4BrAKrqa8DB9D5gq6vm/SNbFku4D/JxBhuANW35NOCmaq9ULFKzjrlNUfw5vWBf7POwMMuYq+rJqjqsqlZU1Qp6rzOcUlUTe6bceTHIz/aX6L14TpLD6E3TPLigVc6vQcb8EHACQJLX0wv3yQWtcmFtAM5qZ80cCzxZVduH2uOefhV5Dq82nwz8X3qvsn+wtf1Xer/c0Pvmfx7YDNwBvGZP17wAY/574BFgY7tt2NM1j3rMU/rewiI/W2bA73OAj9G7HsI3gTP2dM0LMOajgK/SO5NmI/DLe7rmIcf7OWA78C/0jtLPAc4Fzu37Hl/avh7fnI+faz9+QJI6aLFMy0iS5sBwl6QOMtwlqYMMd0nqIMNdkjrIcJekDjLcJamD/j/QV6EvPWPkcQAAAABJRU5ErkJggg==\n", 189 "image/png": "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\n",
190 "text/plain": [ 190 "text/plain": [
191 "<Figure size 432x288 with 1 Axes>" 191 "<Figure size 432x288 with 1 Axes>"
192 ] 192 ]
@@ -198,7 +198,7 @@
198 }, 198 },
199 { 199 {
200 "data": { 200 "data": {
201 "image/png": "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\n", 201 "image/png": "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\n",
202 "text/plain": [ 202 "text/plain": [
203 "<Figure size 432x288 with 1 Axes>" 203 "<Figure size 432x288 with 1 Axes>"
204 ] 204 ]
@@ -210,7 +210,7 @@
210 }, 210 },
211 { 211 {
212 "data": { 212 "data": {
213 "image/png": "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\n", 213 "image/png": "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\n",
214 "text/plain": [ 214 "text/plain": [
215 "<Figure size 432x288 with 1 Axes>" 215 "<Figure size 432x288 with 1 Axes>"
216 ] 216 ]
@@ -227,7 +227,7 @@
227 }, 227 },
228 { 228 {
229 "cell_type": "code", 229 "cell_type": "code",
230 "execution_count": 13, 230 "execution_count": 5,
231 "metadata": { 231 "metadata": {
232 "scrolled": true 232 "scrolled": true
233 }, 233 },
@@ -236,176 +236,8 @@
236 "name": "stdout", 236 "name": "stdout",
237 "output_type": "stream", 237 "output_type": "stream",
238 "text": [ 238 "text": [
239 "['EAttribute', 'EGenericType', 'ETypeParameter', 'EPackage', 'EOperation', 'EStringToStringMapEntry', 'EEnum', 'EDataType', 'EClass', 'EReference', 'EObject', 'EEnumLiteral', 'EAnnotation', 'EParameter']\n" 239 "[]\n"
240 ] 240 ]
241 },
242 {
243 "data": {
244 "image/png": "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\n",
245 "text/plain": [
246 "<Figure size 432x288 with 1 Axes>"
247 ]
248 },
249 "metadata": {
250 "needs_background": "light"
251 },
252 "output_type": "display_data"
253 },
254 {
255 "data": {
256 "image/png": "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\n",
257 "text/plain": [
258 "<Figure size 432x288 with 1 Axes>"
259 ]
260 },
261 "metadata": {
262 "needs_background": "light"
263 },
264 "output_type": "display_data"
265 },
266 {
267 "data": {
268 "image/png": "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\n",
269 "text/plain": [
270 "<Figure size 432x288 with 1 Axes>"
271 ]
272 },
273 "metadata": {
274 "needs_background": "light"
275 },
276 "output_type": "display_data"
277 },
278 {
279 "data": {
280 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEICAYAAABRSj9aAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAUaUlEQVR4nO3df7RlZX3f8fdHfjRFMIBzQYTBMQlhBVkF6S0/Fi3BEHAYEEyXTWCpAYudhGobW+sKTdrg0v5BmmXsSrAhExnBX4Skik4DiBNKFtqCekFQECiEjmGcWcxFEGRhk4x++8fZ03VyOWfumXvOvZf7zPu11ll37+d59t7PM/fO5+77nL3PTlUhSWrXy5a7A5KkxWXQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXRpTkzCRbl7sf0p4y6LWiJdmS5AdJnu97XZ3k0iQ/7NafS3JfkvOXu7/ScjDo1YI3VdWBfa93d+V3VdWBwMHAtcCfJDl0+bopLQ+DXs2rqh8BG4G/D/xEkkOS/FmS2STPdMtH7Wqf5NAkH0uyrav/3KD9JvnXSb6V5KgR9vnaJHcm+X6SP0/ykSSf7Ks/Ncn/SvK9JPcnOXPx/kW0tzHo1bwk+wLvBJ4HHqX3c/8x4DXA0cAPgKv7NvkEcADwOuAw4MMD9vkfgUuBn62qrSPs89PAV4FXAu8H3t63ryOBm4H/BBwK/DvgM0mmxhm3tEv8rButZEm2AKuAnX3F7wP+FvgovXDfCTwG/Ieq+vMB+zgRuKOqDklyBPAd4JVV9cycdmcCnwJuBE4GzquqZ4f0q3+fRwOPA6+oqhe6+k8CVNXbkvw6cHxV9Yf/bcCnq+r6PfwnkV5k3+XugDQBb54b4EkuBe6uqn88t3GSA+idpa8FDumKD0qyD7AaeHpuyPc5GFgP/FJ/yM+zz1d3+3yhbz9PdMeC3l8B/yzJm/rq9wPu2O2opRE5daO90XuBY4FTquoVwBldeegF8KFJDh6y7TPA+cDHkpw+4j63d/s8oK/96r7lJ4BPVNXBfa+XV9VVY4xR+v8Meu2NDqI3h/697iqcK3dVVNV24Fbgv3ZvsO6X5Iz+javqL4C3AjclOWWEfX4bmAHen2T/JKcB/WfvnwTelOSNSfZJ8mPdNftHIU2AQa8W/Pc519HfNE/7/0LvCpyngLuBL8ypfzu9Of6HgR3Ae+buoKo2A+8ANiX5hyPs863AacB36b3peiPw192+ngAuBH4DmKV3hv8+/P+pCfHNWGkZJLkReLiqrpy3sTQmzxikJZDkHyX5ySQvS7KW3hn8wOvzpUnzqhtpabwK+Cy96+i3ApdX1deXt0vaWzh1I0mNc+pGkhr3kpy6WbVqVa1Zs2a5uyFJK8Y999zzVFUN/NiMl2TQr1mzhpmZmeXuhiStGEm+PazOqRtJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWrcS/LO2MWw5oqbB5Zvueq8Je6JJC0tz+glqXEGvSQ1zqCXpMYZ9JLUOINekho3b9AnWZ3kjiQPJXkwya915Ycm2Zzk0e7rIUO2v6Rr82iSSyY9AEnS7o1yRr8TeG9V/QxwKvCuJMcBVwC3V9UxwO3d+t+R5FDgSuAU4GTgymG/ECRJi2PeoK+q7VV1b7f8feAh4EjgQuD6rtn1wJsHbP5GYHNVPV1VzwCbgbWT6LgkaTR7NEefZA3weuArwOFVtR16vwyAwwZsciTwRN/61q5MkrRERg76JAcCnwHeU1XPjbrZgLIasv/1SWaSzMzOzo7aLUnSPEYK+iT70Qv5T1XVZ7viJ5Mc0dUfAewYsOlWYHXf+lHAtkHHqKoNVTVdVdNTUwMfZC5JWoBRrroJcC3wUFX9bl/VJmDXVTSXAJ8fsPltwDlJDunehD2nK5MkLZFRzuhPB94O/FyS+7rXOuAq4OwkjwJnd+skmU7yUYCqehr4IPC17vWBrkyStETm/fTKqvoyg+faAc4a0H4GeGff+kZg40I7KEkaj3fGSlLjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaN++DR5JsBM4HdlTV8V3ZjcCxXZODge9V1YkDtt0CfB/4IbCzqqYn1G9J0ojmDXrgOuBq4OO7Cqrql3YtJ/kQ8Oxutn9DVT210A5KksYzyqME70yyZlBd9+DwXwR+brLdkiRNyrhz9P8EeLKqHh1SX8AXk9yTZP3udpRkfZKZJDOzs7NjdkuStMu4QX8xcMNu6k+vqpOAc4F3JTljWMOq2lBV01U1PTU1NWa3JEm7LDjok+wL/FPgxmFtqmpb93UHcBNw8kKPJ0lamHHO6H8eeLiqtg6qTPLyJAftWgbOAR4Y43iSpAWYN+iT3ADcBRybZGuSy7qqi5gzbZPk1Ulu6VYPB76c5H7gq8DNVfWFyXVdkjSKUa66uXhI+aUDyrYB67rlx4ETxuyfJGlM3hkrSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWrcKE+Y2phkR5IH+sren+Q7Se7rXuuGbLs2ySNJHktyxSQ7LkkazShn9NcBaweUf7iqTuxet8ytTLIP8BHgXOA44OIkx43TWUnSnps36KvqTuDpBez7ZOCxqnq8qv4G+GPgwgXsR5I0hnHm6N+d5Bvd1M4hA+qPBJ7oW9/alQ2UZH2SmSQzs7OzY3RLktRvoUH/B8BPAicC24EPDWiTAWU1bIdVtaGqpqtqempqaoHdkiTNtaCgr6onq+qHVfUj4I/oTdPMtRVY3bd+FLBtIceTJC3cgoI+yRF9q78APDCg2deAY5K8Nsn+wEXApoUcT5K0cPvO1yDJDcCZwKokW4ErgTOTnEhvKmYL8Ctd21cDH62qdVW1M8m7gduAfYCNVfXgooxCkjTUvEFfVRcPKL52SNttwLq+9VuAF116KUlaOt4ZK0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuPmDfru4d87kjzQV/Y7SR7uHg5+U5KDh2y7Jck3k9yXZGaSHZckjWaUM/rrgLVzyjYDx1fVPwD+N/Dvd7P9G6rqxKqaXlgXJUnjmDfoq+pO4Ok5ZV+sqp3d6t30HvwtSXoJmsQc/T8Hbh1SV8AXk9yTZP0EjiVJ2kPzPjN2d5L8JrAT+NSQJqdX1bYkhwGbkzzc/YUwaF/rgfUARx999DjdkiT1WfAZfZJLgPOBt1ZVDWrTPSycqtoB3AScPGx/VbWhqqaranpqamqh3ZIkzbGgoE+yFvh14IKqemFIm5cnOWjXMnAO8MCgtpKkxTPK5ZU3AHcBxybZmuQy4GrgIHrTMfcluaZr++okt3SbHg58Ocn9wFeBm6vqC4syCknSUPPO0VfVxQOKrx3Sdhuwrlt+HDhhrN5JksbmnbGS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMaNFPRJNibZkeSBvrJDk2xO8mj39ZAh217StXm0e86sJGkJjXpGfx2wdk7ZFcDtVXUMcHu3/nckORS4EjiF3oPBrxz2C0GStDhGCvqquhN4ek7xhcD13fL1wJsHbPpGYHNVPV1VzwCbefEvDEnSIhpnjv7wqtoO0H09bECbI4En+ta3dmUvkmR9kpkkM7Ozs2N0S5LUb7HfjM2AshrUsKo2VNV0VU1PTU0tcrckae8xTtA/meQIgO7rjgFttgKr+9aPAraNcUxJ0h4aJ+g3AbuuorkE+PyANrcB5yQ5pHsT9pyuTJK0REa9vPIG4C7g2CRbk1wGXAWcneRR4OxunSTTST4KUFVPAx8Evta9PtCVSZKWyL6jNKqqi4dUnTWg7Qzwzr71jcDGBfVOkjQ274yVpMYZ9JLUOINekhpn0EtS40Z6M3YlWXPFzcvdBUl6SfGMXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGtfcnbF7atidtFuuOm+JeyJJi8Mzeklq3IKDPsmxSe7rez2X5D1z2pyZ5Nm+Nr81fpclSXtiwVM3VfUIcCJAkn2A7wA3DWj6pao6f6HHkSSNZ1JTN2cBf1lV357Q/iRJEzKpoL8IuGFI3WlJ7k9ya5LXDdtBkvVJZpLMzM7OTqhbkqSxgz7J/sAFwJ8OqL4XeE1VnQD8PvC5Yfupqg1VNV1V01NTU+N2S5LUmcQZ/bnAvVX15NyKqnquqp7vlm8B9kuyagLHlCSNaBJBfzFDpm2SvCpJuuWTu+N9dwLHlCSNaKwbppIcAJwN/Epf2a8CVNU1wFuAy5PsBH4AXFRVNc4xJUl7Zqygr6oXgFfOKbumb/lq4OpxjiFJGo93xkpS4wx6SWqcQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktS4STwzdkuSbya5L8nMgPok+b0kjyX5RpKTxj2mJGl0Yz14pM8bquqpIXXnAsd0r1OAP+i+SpKWwFJM3VwIfLx67gYOTnLEEhxXksRkzugL+GKSAv6wqjbMqT8SeKJvfWtXtr2/UZL1wHqAo48+egLdGs+aK24eWL7lqvOWuCeSNJ5JnNGfXlUn0ZuieVeSM+bUZ8A2L3pAeFVtqKrpqpqempqaQLckSTCBoK+qbd3XHcBNwMlzmmwFVvetHwVsG/e4kqTRjBX0SV6e5KBdy8A5wANzmm0Cfrm7+uZU4Nmq2o4kaUmMO0d/OHBTkl37+nRVfSHJrwJU1TXALcA64DHgBeAdYx5TkrQHxgr6qnocOGFA+TV9ywW8a5zjSJIWzjtjJalxBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklqnEEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNW3DQJ1md5I4kDyV5MMmvDWhzZpJnk9zXvX5rvO5KkvbUOE+Y2gm8t6ru7Z4be0+SzVX1rTntvlRV549xHEnSGBZ8Rl9V26vq3m75+8BDwJGT6pgkaTImMkefZA3weuArA6pPS3J/kluTvG43+1ifZCbJzOzs7CS6JUliAkGf5EDgM8B7quq5OdX3Aq+pqhOA3wc+N2w/VbWhqqaranpqamrcbkmSOmMFfZL96IX8p6rqs3Prq+q5qnq+W74F2C/JqnGOKUnaM+NcdRPgWuChqvrdIW1e1bUjycnd8b670GNKkvbcOFfdnA68Hfhmkvu6st8AjgaoqmuAtwCXJ9kJ/AC4qKpqjGNKkvbQgoO+qr4MZJ42VwNXL/QYK8maK24eWL7lqvMm0l6SFso7YyWpcQa9JDXOoJekxhn0ktQ4g16SGmfQS1LjDHpJapxBL0mNM+glqXF5KX4iwfT0dM3MzCxo22F3nLbAu2YlDZPknqqaHlTnGb0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklq3LjPjF2b5JEkjyW5YkD930tyY1f/lSRrxjmeJGnPjfPM2H2AjwDnAscBFyc5bk6zy4BnquqngA8Dv73Q40mSFmacM/qTgceq6vGq+hvgj4EL57S5ELi+W/5vwFm7HhYuSVoa4zwc/Ejgib71rcApw9pU1c4kzwKvBJ6au7Mk64H13erzSR5ZYL9WDdp/CzL876Fmx7wbe9uY97bxgmPeU68ZVjFO0A86M5/7eQqjtOkVVm0ANozRn94Bk5lhtwG3yjG3b28bLzjmSRpn6mYrsLpv/Shg27A2SfYFfhx4eoxjSpL20DhB/zXgmCSvTbI/cBGwaU6bTcAl3fJbgP9RL8VPUZOkhi146qabc383cBuwD7Cxqh5M8gFgpqo2AdcCn0jyGL0z+Ysm0el5jD39swI55vbtbeMFxzwxL8mPKZYkTY53xkpS4wx6SWrcig36ve3jF0YY779N8q0k30hye5Kh19SuFPONua/dW5JUkhV/Kd4oY07yi933+sEkn17qPk7aCD/bRye5I8nXu5/vdcvRz0lJsjHJjiQPDKlPkt/r/j2+keSksQ9aVSvuRe/N378EfgLYH7gfOG5Om38JXNMtXwTcuNz9XuTxvgE4oFu+fCWPd9Qxd+0OAu4E7gaml7vfS/B9Pgb4OnBIt37Ycvd7Cca8Abi8Wz4O2LLc/R5zzGcAJwEPDKlfB9xK7z6kU4GvjHvMlXpGv7d9/MK8462qO6rqhW71bnr3Naxko3yPAT4I/Gfg/y5l5xbJKGP+F8BHquoZgKrascR9nLRRxlzAK7rlH+fF9+usKFV1J7u/n+hC4OPVczdwcJIjxjnmSg36QR+/cOSwNlW1E9j18Qsr0Sjj7XcZvTOClWzeMSd5PbC6qv5sKTu2iEb5Pv808NNJ/meSu5OsXbLeLY5Rxvx+4G1JtgK3AP9qabq2bPb0//u8xvkIhOU00Y9fWAFGHkuStwHTwM8uao8W327HnORl9D4R9dKl6tASGOX7vC+96Zsz6f3V9qUkx1fV9xa5b4tllDFfDFxXVR9Kchq9e3OOr6ofLX73lsXEs2ulntHvbR+/MMp4SfLzwG8CF1TVXy9R3xbLfGM+CDge+IskW+jNZW5a4W/Ijvpz/fmq+tuq+j/AI/SCf6UaZcyXAX8CUFV3AT9G78O/WjXS//c9sVKDfm/7+IV5x9tNY/whvZBf6fO2MM+Yq+rZqlpVVWuqag299yUuqKqZ5enuRIzyc/05em+8k2QVvamcx5e0l5M1ypj/CjgLIMnP0Av62SXt5dLaBPxyd/XNqcCzVbV9nB2uyKmbeul+/MKiGHG8vwMcCPxp957zX1XVBcvW6TGNOOamjDjm24BzknwL+CHwvqr67vL1ejwjjvm9wB8l+Tf0pjAuXcEnbSS5gd7U26rufYcrgf0Aquoaeu9DrAMeA14A3jH2MVfwv5ckaQQrdepGkjQig16SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ17v8BkCILZhvrP7IAAAAASUVORK5CYII=\n",
281 "text/plain": [
282 "<Figure size 432x288 with 1 Axes>"
283 ]
284 },
285 "metadata": {
286 "needs_background": "light"
287 },
288 "output_type": "display_data"
289 },
290 {
291 "data": {
292 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAQwElEQVR4nO3de5BkZX3G8e8jq2ICcsmOZOXiqoUWaJULNYWkTIyKWoCJYIIGKiqWxEUjxgtlBSVlMFdIAsSUlmYtKPECgheEiJcggUKNoIsusLClIC4XWdnhLvG68MsffRaHoWend6Z7Zl72+6nqmtPveU+f3zvd+/SZt8/pTVUhSWrP4xa6AEnS7BjgktQoA1ySGmWAS1KjDHBJapQBLkmNMsClIUjy5SRHL3Qd2rYY4FoUkqxP8vMkD0y6fbBbt0eSTyW5K8n/Jfl2kj9awFpPSvLJyW1VdUhVnbVQNWnbZIBrMfnjqtph0u24JLsC3wB+BTwHWAqcDpyd5IhhF5BkybAfUxoVA1yL3TuBB4BjquonVfXzqjoH+Efg1CQBSFJJ/irJTUnuTPKvSR5+fSd5Y5J1Se5J8tUkT5u0rpK8NckNwA1d2weS3Jrk/iRXJfmDrv1g4L3An3V/JVzdtV+W5C+65ccl+ZskNyfZmOTjSXbq1i3v9nd0klu6Wk+ch9+jHoMMcC12LwM+V1UPTWk/D9gLeNaktlcB48D+wGHAGwGSHE4vdP8EGAO+Dpwz5fEOB54P7Nvd/w6wAtgVOBv4TJLtq+orwD8B53Z/JTyvT81v6G4vBp4B7AB8cEqf3weeDRwEvC/JPlv6JUj9GOBaTL6Q5N5JtzfRmzLZ0Kfv5ralk9pOqaq7q+oW4N+Bo7r2Y4F/rqp1VbWJXgCvmHwU3q2/u6p+DlBVn6yqu6pqU1WdCjyRXuAO4s+B06rqpqp6AHgPcOSU6Zn3d39NXA1cDfR7I5C2yADXYnJ4Ve086fZR4E5gWZ++m9vunNR266Tlm4GndstPAz6w+Y0BuBsIsPs025Lk+G7K5b5um5145JvFljy12//kWpYAu01q+8mk5Z/RO0qXtooBrsXua8CfTp7P7ryGXuj+YFLbnpOW9wJu75ZvBY6d8ubwpKr630n9H/5azm6++6+7fexSVTsD99EL/Uf0ncbt9N40JteyCbhjhu2krWKAa7E7HXgycEaS302yfZKjgBOBd9cjvw/53Ul2SbIn8Hbg3K79I8B7kjwHIMlOSV69hX3uSC9wJ4AlSd7X1bDZHcDyPm8qm50DvDPJ05PswG/mzDdtzcClmRjgWkz+a8p54OdX1V30PvDbHrgeuAt4F/C6qjp3yvYXAFcBa4CLgDMAqup84BTg00nuB9YCh2yhjq8CX6Z3dH8z8AseOcXyme7nXUm+22f7M4FPAJcDP+q2f9sA45e2SvwPHfRYkKSAvavqxoWuRZovHoFLUqMMcElqlFMoktQoj8AlqVHz+sU9S5cureXLl8/nLiWpeVddddWdVTU2tX1eA3z58uWsXr16PncpSc1LcnO/dqdQJKlRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUfN6JeZcLD/hor7t609+xTxXIkmLg0fgktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEbNGOBJtk/y7SRXJ7kuyfu79qcnuTLJDUnOTfKE0ZcrSdpskCPwXwIvqarnASuAg5McCJwCnF5VewP3AMeMrkxJ0lQzBnj1PNDdfXx3K+AlwGe79rOAw0dSoSSpr4HmwJNsl2QNsBG4GPghcG9Vbeq63AbsPpoSJUn9DBTgVfVgVa0A9gAOAPbp163ftklWJlmdZPXExMTsK5UkPcJWnYVSVfcClwEHAjsn2fxthnsAt0+zzaqqGq+q8bGxsbnUKkmaZJCzUMaS7NwtPwl4KbAOuBQ4out2NHDBqIqUJD3aIN8Hvgw4K8l29AL/vKr6YpLrgU8n+Qfge8AZI6xTkjTFjAFeVdcA+/Vpv4nefLgkaQF4JaYkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRMwZ4kj2TXJpkXZLrkry9az8pyY+TrOluh46+XEnSZksG6LMJOL6qvptkR+CqJBd3606vqn8bXXmSpOnMGOBVtQHY0C3/NMk6YPdRFyZJ2rKtmgNPshzYD7iyazouyTVJzkyyyzTbrEyyOsnqiYmJORUrSfqNgQM8yQ7A54B3VNX9wIeBZwIr6B2hn9pvu6paVVXjVTU+NjY2hJIlSTBggCd5PL3w/lRVfR6gqu6oqger6iHgo8ABoytTkjTVIGehBDgDWFdVp01qXzap26uAtcMvT5I0nUHOQnkB8Drg2iRrurb3AkclWQEUsB44diQVSpL6GuQslG8A6bPqS8MvR5I0KK/ElKRGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRMwZ4kj2TXJpkXZLrkry9a981ycVJbuh+7jL6ciVJmw1yBL4JOL6q9gEOBN6aZF/gBOCSqtobuKS7L0maJzMGeFVtqKrvdss/BdYBuwOHAWd13c4CDh9VkZKkR9uqOfAky4H9gCuB3apqA/RCHnjKNNusTLI6yeqJiYm5VStJetjAAZ5kB+BzwDuq6v5Bt6uqVVU1XlXjY2Njs6lRktTHQAGe5PH0wvtTVfX5rvmOJMu69cuAjaMpUZLUzyBnoQQ4A1hXVadNWnUhcHS3fDRwwfDLkyRNZ8kAfV4AvA64Nsmaru29wMnAeUmOAW4BXj2aEiVJ/cwY4FX1DSDTrD5ouOVIkgbllZiS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGzRjgSc5MsjHJ2kltJyX5cZI13e3Q0ZYpSZpqkCPwjwEH92k/vapWdLcvDbcsSdJMZgzwqrocuHseapEkbYUlc9j2uCSvB1YDx1fVPf06JVkJrATYa6+95rC7/pafcFHf9vUnv2Lo+5KkxWS2H2J+GHgmsALYAJw6XceqWlVV41U1PjY2NsvdSZKmmlWAV9UdVfVgVT0EfBQ4YLhlSZJmMqsAT7Js0t1XAWun6ytJGo0Z58CTnAO8CFia5Dbgb4EXJVkBFLAeOHaENUqS+pgxwKvqqD7NZ4ygFknSVvBKTElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaNWOAJzkzycYkaye17Zrk4iQ3dD93GW2ZkqSpBjkC/xhw8JS2E4BLqmpv4JLuviRpHs0Y4FV1OXD3lObDgLO65bOAw4dclyRpBrOdA9+tqjYAdD+fMl3HJCuTrE6yemJiYpa7kyRNNfIPMatqVVWNV9X42NjYqHcnSduM2Qb4HUmWAXQ/Nw6vJEnSIGYb4BcCR3fLRwMXDKccSdKgBjmN8BzgW8Czk9yW5BjgZOBlSW4AXtbdlyTNoyUzdaiqo6ZZddCQa5EkbQWvxJSkRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUUvmsnGS9cBPgQeBTVU1PoyiJEkzm1OAd15cVXcO4XEkSVvBKRRJatRcA7yA/05yVZKV/TokWZlkdZLVExMTc9ydJGmzuQb4C6pqf+AQ4K1JXji1Q1WtqqrxqhofGxub4+4kSZvNKcCr6vbu50bgfOCAYRQlSZrZrAM8yW8n2XHzMvByYO2wCpMkbdlczkLZDTg/yebHObuqvjKUqiRJM5p1gFfVTcDzhliLJGkreBqhJDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWrUMP5X+kVp+QkX9W1ff/Ir5rkSSRoNj8AlqVEGuCQ1ygCXpEYZ4JLUKANckhr1mD0LZTrTnZ0CnqEiqS0egUtSowxwSWqUAS5JjZpTgCc5OMn3k9yY5IRhFSVJmtmsAzzJdsCHgEOAfYGjkuw7rMIkSVs2lyPwA4Abq+qmqvoV8GngsOGUJUmayVxOI9wduHXS/duA50/tlGQlsLK7+0CS789yf0uBO2e57UByyigffVZGPuZFyDFvGxzz1nlav8a5BHj6tNWjGqpWAavmsJ/ezpLVVTU+18dpiWPeNjjmbcMoxjyXKZTbgD0n3d8DuH1u5UiSBjWXAP8OsHeSpyd5AnAkcOFwypIkzWTWUyhVtSnJccBXge2AM6vquqFV9mhznoZpkGPeNjjmbcPQx5yqR01bS5Ia4JWYktQoA1ySGrXoAnymy/OTPDHJud36K5Msn/8qh2uAMb8ryfVJrklySZK+54S2ZNCvYUhyRJJK0vQpZ4OMN8lruuf5uiRnz3eNwzbA63qvJJcm+V732j50IeocpiRnJtmYZO0065PkP7rfyTVJ9p/TDqtq0dzofRj6Q+AZwBOAq4F9p/T5S+Aj3fKRwLkLXfc8jPnFwG91y2/ZFsbc9dsRuBy4Ahhf6LpH/BzvDXwP2KW7/5SFrnsexrwKeEu3vC+wfqHrHsK4XwjsD6ydZv2hwJfpXUdzIHDlXPa32I7AB7k8/zDgrG75s8BBSfpdVNSKGcdcVZdW1c+6u1fQO+e+ZYN+DcPfA/8C/GI+ixuBQcb7JuBDVXUPQFVtnOcah22QMRfw5G55Jx4D15FU1eXA3Vvochjw8eq5Atg5ybLZ7m+xBXi/y/N3n65PVW0C7gN+Z16qG41BxjzZMfTewVs245iT7AfsWVVfnM/CRmSQ5/hZwLOSfDPJFUkOnrfqRmOQMZ8EvDbJbcCXgLfNT2kLamv/vW/RYvsv1Qa5PH+gS/gbMvB4krwWGAf+cKQVjd4Wx5zkccDpwBvmq6ARG+Q5XkJvGuVF9P7C+nqS51bVvSOubVQGGfNRwMeq6tQkvwd8ohvzQ6Mvb8EMNb8W2xH4IJfnP9wnyRJ6f3pt6U+WxW6gryRI8lLgROCVVfXLeaptVGYa847Ac4HLkqynN1d4YcMfZA76ur6gqn5dVT8Cvk8v0Fs1yJiPAc4DqKpvAdvT+8Knx7KhfgXJYgvwQS7PvxA4uls+Avif6j4daNSMY+6mE/6TXni3PjcKM4y5qu6rqqVVtbyqltOb939lVa1emHLnbJDX9RfofVhNkqX0plRumtcqh2uQMd8CHASQZB96AT4xr1XOvwuB13dnoxwI3FdVG2b9aAv9qe00n9L+gN4n2Cd2bX9H7x8w9J7kzwA3At8GnrHQNc/DmL8G3AGs6W4XLnTNox7zlL6X0fBZKAM+xwFOA64HrgWOXOia52HM+wLfpHeGyhrg5Qtd8xDGfA6wAfg1vaPtY4A3A2+e9Dx/qPudXDvX17WX0ktSoxbbFIokaUAGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWrU/wNp9aQCXiO6WAAAAABJRU5ErkJggg==\n",
293 "text/plain": [
294 "<Figure size 432x288 with 1 Axes>"
295 ]
296 },
297 "metadata": {
298 "needs_background": "light"
299 },
300 "output_type": "display_data"
301 },
302 {
303 "data": {
304 "image/png": "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\n",
305 "text/plain": [
306 "<Figure size 432x288 with 1 Axes>"
307 ]
308 },
309 "metadata": {
310 "needs_background": "light"
311 },
312 "output_type": "display_data"
313 },
314 {
315 "data": {
316 "image/png": "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\n",
317 "text/plain": [
318 "<Figure size 432x288 with 1 Axes>"
319 ]
320 },
321 "metadata": {
322 "needs_background": "light"
323 },
324 "output_type": "display_data"
325 },
326 {
327 "data": {
328 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAARV0lEQVR4nO3deZBlZX3G8e8jEzQoKjqtUWRsscQKoJZWazSWK5IioqBVVgp0IhrilBqNWYyOsSpqFguNS2I06hhGcAmixgU1JK4ENYA2OMomrqOOoNMExX1Bf/njnknaa0/f2/ee7p7X+X6quubcc96+7++d7n767feec0+qCklSe2603gVIkiZjgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeDaJyTZmeSHSb636OOVSZ6Q5GeL9n05yeuTHLGC5z4jyd+O2fYvF/X1o6G+L598hFL/DHDtSx5ZVTdb9PG0bv8FVXUz4BbAw4AfAhcnObrvAqrqhXv6B568p+/u46i++5OmYYCrGVX1s6r6YlU9Ffgv4Pl7jiV5W5JvJLk+yflJjur2bwEeBzyrm0W/p9u/NckXk3w3yRVJHj1ODUlem+RFQ/vOTfK0bntXkmcnuTLJt5KcnuTGi9qekOTTSb6d5GOr8UtI+w8DXK16B/CARY/PBe4C3Aa4BHgzQFVt67Zf3M2iH9m1/2L3+bcAXgC8Kcntxuj3TOCxSW4EkOS2wIOAtyxq8zjg2K6eo4DndG3vDbwO+EPg1sB24N1JDlzRyKWOAa59ybu6memejyct0/Zq4FZ7HlTV9qr6blX9mMHM/B5JbrG3T66qt1XV1VX186o6G/g8cJ9RBVbVfzNYwnlQt+tk4INVde2iZq+oql3dvhd2bQC2AP9cVZ/s/prY3u2/96h+paUY4NqXPKqqbrno43XLtD0UuA4gyQFJTuuWRL4D7OzabNzbJyd5fJIde35ZAEcv137IG4DN3fZm4I1Dx7+2aPsrwO277TsCz178Swq4XTcWacU2rHcB0oQeDXy0234scCKDFzh3MlgW+RaQ7vgvvOVmkjsyWMo4hsGLlD9LsmNR+1HeCOxI8krgzsB7ho4ftmh7E4O/FmAQ7C+oqhch9cAZuJrRzbTvlOSfgAczWLsGOBj4MfA/wEEMli0W+yZw+KLHN2UQ6gvd8z6RwQx8LFX1FWAHg/Xwt1XVj4aaPC3JoUluzWD9++xu/zbgj5LcOwM3S/LIJDcdt29pMQNc+5L3DJ0H/s5u//2SfA/4DnAecHPg3lV1aXf8DQyWKr4OXAFcOPS8pwNHdssW76qqK4CXAhcwCPe7AR9fYa1ndp83vHwCcBbwQQYvlF5F9wulqi4CngK8msFfCJ/j/5dipBWLN3SQVi7JQxn8Yji8Fv0QJdkFbK6q89arNu0/nIFLK9Sd9vcM4HXlDEjryACXViDJ3Rgsf9wKeMU6l6P9nEsoktQoZ+CS1Kg1PQ9848aNNTs7u5ZdSlLzLr744muramZ4/5oG+OzsLPPz82vZpSQ1L8lXltrvEookNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDWq+VuqzW5935L7d552/BpXIklryxm4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEjAzzJ9iS7k1w2tP/pSa5KcnmSF69eiZKkpYwzAz8DOG7xjiQPAU4E7l5VRwEv6b80SdJyRgZ4VZ0PXDe0+ynAaVX1467N7lWoTZK0jEnfC+UI4AFJ/g74EfDMqvrkUg2TbAG2AGzatGnC7vb+nieStL+a9EXMDcAhwH2BvwDemiRLNayqbVU1V1VzMzMzE3YnSRo2aYDvAt5RA58Afg5s7K8sSdIokwb4u4CHAiQ5AjgQuLavoiRJo41cA09yFvBgYGOSXcDzgO3A9u7Uwp8Ap1RVrWahkqRfNDLAq+rkvRza3HMtkqQV8EpMSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGjUywJNsT7K7u3nD8LFnJqkk3k5NktbYODPwM4DjhncmOQw4FvhqzzVJksYwMsCr6nzguiUOvRx4FuCt1CRpHUy0Bp7kBODrVfXpMdpuSTKfZH5hYWGS7iRJS1hxgCc5CHgu8FfjtK+qbVU1V1VzMzMzK+1OkrQXk8zA7wzcCfh0kp3AHYBLkvxGn4VJkpY38q70w6rqUuA2ex53IT5XVdf2WJckaYRxTiM8C7gAuGuSXUlOXf2yJEmjjJyBV9XJI47P9laNJGlsXokpSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSo8a5ocP2JLuTXLZo398n+WySzyR5Z5Jbrm6ZkqRh48zAzwCOG9r3AeDoqro78DngOT3XJUkaYWSAV9X5wHVD+95fVTd0Dy9kcGNjSdIa6mMN/A+Ac3t4HknSCkwV4EmeC9wAvHmZNluSzCeZX1hYmKY7SdIiEwd4klOARwCPq6raW7uq2lZVc1U1NzMzM2l3kqQhI+9Kv5QkxwHPBh5UVT/otyRJ0jjGOY3wLOAC4K5JdiU5FXglcDDwgSQ7krxmleuUJA0ZOQOvqpOX2H36KtQiSVoBr8SUpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDVqnDvybE+yO8lli/bdKskHkny++/eQ1S1TkjRsnBn4GcBxQ/u2Ah+qqrsAH+oeS5LW0MgAr6rzgeuGdp8InNltnwk8que6JEkjTLoGftuqugag+/c2e2uYZEuS+STzCwsLE3YnSRq26i9iVtW2qpqrqrmZmZnV7k6S9huTBvg3k9wOoPt3d38lSZLGMWmAnwOc0m2fAry7n3IkSeMa5zTCs4ALgLsm2ZXkVOA04NgknweO7R5LktbQhlENqurkvRw6pudaJEkr4JWYktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEjTyNs1ezW9y25f+dpx69xJZK0OpyBS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckho1VYAn+dMklye5LMlZSW7SV2GSpOVNHOBJDgX+GJirqqOBA4CT+ipMkrS8aZdQNgC/nmQDcBBw9fQlSZLGMXGAV9XXgZcAXwWuAa6vqvcPt0uyJcl8kvmFhYXJK5Uk/YJpllAOAU4E7gTcHrhpks3D7apqW1XNVdXczMzM5JVKkn7BNEsoDwO+XFULVfVT4B3Ab/dTliRplGkC/KvAfZMclCQM7lJ/ZT9lSZJGmWYN/CLg7cAlwKXdc23rqS5J0ghT3dChqp4HPK+nWiRJK+CVmJLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRk0V4ElumeTtST6b5Mok9+urMEnS8qa6Iw/wj8B/VNVjkhwIHNRDTZKkMUwc4EluDjwQeAJAVf0E+Ek/ZUmSRplmBn44sAC8Psk9gIuBZ1TV9xc3SrIF2AKwadOmKbrrx+zW9+312M7Tjl/DSiRpOtOsgW8A7gW8uqruCXwf2DrcqKq2VdVcVc3NzMxM0Z0kabFpAnwXsKuqLuoev51BoEuS1sDEAV5V3wC+luSu3a5jgCt6qUqSNNK0Z6E8HXhzdwbKl4AnTl+SJGkcUwV4Ve0A5nqqRZK0Al6JKUmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqOmDvAkByT5VJL39lGQJGk8fczAnwFc2cPzSJJWYKoAT3IH4HjgX/opR5I0rmln4P8APAv4+d4aJNmSZD7J/MLCwpTdSZL2mDjAkzwC2F1VFy/Xrqq2VdVcVc3NzMxM2p0kacg0M/D7Ayck2Qm8BXhokjf1UpUkaaSJA7yqnlNVd6iqWeAk4MNVtbm3yiRJy/I8cElq1IY+nqSqzgPO6+O5JEnjcQYuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSo6a5J+ZhST6S5Moklyd5Rp+FSZKWN80NHW4A/ryqLklyMHBxkg9U1RU91SZJWsY098S8pqou6ba/C1wJHNpXYZKk5fWyBp5kFrgncNESx7YkmU8yv7Cw0Ed3kiR6CPAkNwP+DfiTqvrO8PGq2lZVc1U1NzMzM213kqTOVAGe5NcYhPebq+od/ZQkSRrHNGehBDgduLKqXtZfSZKkcUwzA78/8PvAQ5Ps6D4e3lNdkqQRJj6NsKo+BqTHWiRJK+CVmJLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNWqat5P9lTO79X0rar/ztONXqRJJGs0ZuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalR094T87gkVyX5QpKtfRUlSRptmntiHgC8Cvhd4Ejg5CRH9lWYJGl508zA7wN8oaq+VFU/Ad4CnNhPWZKkUaZ5L5RDga8terwL+K3hRkm2AFu6h99LctWE/W0Erp3wc1dFXrTqXexzY14Djnn/4JhX5o5L7ZwmwJe6oXH90o6qbcC2KfoZdJbMV9XctM/TEse8f3DM+4fVGPM0Syi7gMMWPb4DcPV05UiSxjVNgH8SuEuSOyU5EDgJOKefsiRJo0y8hFJVNyR5GvCfwAHA9qq6vLfKftnUyzANcsz7B8e8f+h9zKn6pWVrSVIDvBJTkhplgEtSo/a5AB91eX6SGyc5uzt+UZLZta+yX2OM+c+SXJHkM0k+lGTJc0JbMu7bMCR5TJJK0vQpZ+OMN8nvdV/ny5P861rX2Lcxvq83JflIkk9139sPX486+5Rke5LdSS7by/EkeUX3f/KZJPeaqsOq2mc+GLwY+kXgcOBA4NPAkUNtngq8pts+CTh7vetegzE/BDio237K/jDmrt3BwPnAhcDcete9yl/juwCfAg7pHt9mvetegzFvA57SbR8J7FzvunsY9wOBewGX7eX4w4FzGVxHc1/gomn629dm4ONcnn8icGa3/XbgmCRLXVTUipFjrqqPVNUPuocXMjjnvmXjvg3D3wAvBn60lsWtgnHG+yTgVVX1LYCq2r3GNfZtnDEXcPNu+xb8ClxHUlXnA9ct0+RE4A01cCFwyyS3m7S/fS3Al7o8/9C9tamqG4DrgVuvSXWrY5wxL3Yqg9/gLRs55iT3BA6rqveuZWGrZJyv8RHAEUk+nuTCJMetWXWrY5wxPx/YnGQX8O/A09emtHW10p/3ZU1zKf1qGOfy/LEu4W/I2ONJshmYAx60qhWtvmXHnORGwMuBJ6xVQatsnK/xBgbLKA9m8BfWR5McXVXfXuXaVss4Yz4ZOKOqXprkfsAbuzH/fPXLWze95te+NgMf5/L8/2uTZAODP72W+5NlXzfWWxIkeRjwXOCEqvrxGtW2WkaN+WDgaOC8JDsZrBWe0/ALmeN+X7+7qn5aVV8GrmIQ6K0aZ8ynAm8FqKoLgJsweMOnX2W9vgXJvhbg41yefw5wSrf9GODD1b060KiRY+6WE17LILxbXxuFEWOuquuramNVzVbVLIN1/xOqan59yp3aON/X72LwYjVJNjJYUvnSmlbZr3HG/FXgGIAkv8kgwBfWtMq1dw7w+O5slPsC11fVNRM/23q/aruXV2k/x+AV7Od2+/6awQ8wDL7IbwO+AHwCOHy9a16DMX8Q+Cawo/s4Z71rXu0xD7U9j4bPQhnzaxzgZcAVwKXASetd8xqM+Ujg4wzOUNkB/M5619zDmM8CrgF+ymC2fSrwZODJi77Or+r+Ty6d9vvaS+klqVH72hKKJGlMBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElq1P8C2zvVYCOUdf8AAAAASUVORK5CYII=\n",
329 "text/plain": [
330 "<Figure size 432x288 with 1 Axes>"
331 ]
332 },
333 "metadata": {
334 "needs_background": "light"
335 },
336 "output_type": "display_data"
337 },
338 {
339 "data": {
340 "image/png": "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\n",
341 "text/plain": [
342 "<Figure size 432x288 with 1 Axes>"
343 ]
344 },
345 "metadata": {
346 "needs_background": "light"
347 },
348 "output_type": "display_data"
349 },
350 {
351 "data": {
352 "image/png": "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\n",
353 "text/plain": [
354 "<Figure size 432x288 with 1 Axes>"
355 ]
356 },
357 "metadata": {
358 "needs_background": "light"
359 },
360 "output_type": "display_data"
361 },
362 {
363 "data": {
364 "image/png": "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\n",
365 "text/plain": [
366 "<Figure size 432x288 with 1 Axes>"
367 ]
368 },
369 "metadata": {
370 "needs_background": "light"
371 },
372 "output_type": "display_data"
373 },
374 {
375 "data": {
376 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAQP0lEQVR4nO3df4xlZX3H8fdHFrQWLNgddQusK4pGaupCpnSNP4qiFrAKJmqkEcEQV622mmoboial1qZoKhhTarsGwmr9ARWRVbAVKRShgN1VhMUtInSVle3uGgSh/igL3/5xz9rJMLP3zsy9d/Zh36/kZM557nPu+T5zZz5z5vy4N1WFJKk9j1nsAiRJ82OAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXBpDkhUluG+P2jkmyZVzbU5sMcI1Nks1JfpbkgSnT3yY5LclD09ofSPIbi1TjS6e3V9XXq+pZ/fpJ47RksQvQXueVVfW1qQ1JTgOur6oXLE5J45UkQKrq4cWuRW1zD1x7vG5v9z1Jbk5yX5ILkzyue+y0JNdO619JntHNX5Dk75J8pdurvy7JU5J8NMmPk/xnkiMHqOGXhzSSfApYDnype84/69pXJfn3JPcm+XaSY6asf3WSv0pyHfBT4LAkb0qyKcn9Se5M8pYhfcu0lzDA1YrXAccBTwN+Czhtjuu+H1gK/AK4Hvhmt/x54Oy5FFJVpwA/oPffxP5V9eEkBwOXAR8Engi8B7g4ycSUVU8BVgMHAN8HtgO/DzwBeBNwTpKj5lKL9m4GuMbti90e6q7pzV37qmntd0xb72NVdXdV3QN8CVg5h21eUlUbqurnwCXAz6vqk1X1EHAh0HcPfABvAC6vqsur6uGqugJYD5wwpc8FVXVrVe2sqger6rKquqN6/g34KvDCIdSivYQBrnE7qaoOnDJ9omu/YVr706et999T5n8K7D+HbW6bMv+zGZbn8lyzeSrw2ql/hIAXAMum9Llr6gpJjk9yQ5J7uv4n0PuvQBqIJzHVuv8BHr9rIclTxrTd6W/jeRfwqap680ydp6+T5LHAxcAbgUur6sEkXwQy9Er1qOUeuFr3beA3k6zsTmyeOYTn3DfJ46ZMM+3obAMOm7L8j8Ark/xekn269Y5Jcsgs29gPeCywA9iZ5Hjg5UOoXXsRA1zjtuvKjV3TJV3782a4Dvy3+z1ZVX0X+ADwNeB24NrdrzGQy+kdWtk1nTlDn78G3t8dLnlPVd0FnAi8l14o3wX8KbP8jlXV/cAfAxcBPwb+AFg3hNq1F4kf6CBJbXIPXJIaZYBLUqMMcElqlAEuSY0a63XgS5curRUrVoxzk5LUvA0bNvyoqiamt481wFesWMH69evHuUlJal6S78/U7iEUSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1Ki+Ad69LeY3us/4uzXJX3TtT0tyY5Lbu88o3G/05UqSdhlkD/wXwEuq6rn0PsbquCSrgA8B51TV4fTeDvP00ZUpSZqub4B3n9f3QLe4bzcV8BJ6HwgLsBY4aSQVSpJmNNCdmEn2ATYAzwDOBe4A7q2qnV2XLcDBs6y7mt4ncbN8+fJ5F7rijMtmbN981ivm/ZyS1LKBTmJW1UNVtRI4BDgaePZM3WZZd01VTVbV5MTEI27llyTN05yuQqmqe4GrgVXAgVM+K/AQ4O7hliZJ2p1BrkKZSHJgN/8rwEuBTcBVwGu6bqcCl46qSEnSIw1yDHwZsLY7Dv4Y4KKq+nKS7wCfS/JB4FvAeSOsU5I0Td8Ar6qbgSNnaL+T3vFwSdIi8E5MSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWpU3wBPcmiSq5JsSnJrknd27Wcm+WGSm7rphNGXK0naZckAfXYC766qbyY5ANiQ5IrusXOq6m9GV54kaTZ9A7yqtgJbu/n7k2wCDh51YZKk3ZvTMfAkK4AjgRu7pnckuTnJ+UkOmmWd1UnWJ1m/Y8eOBRUrSfp/Awd4kv2Bi4F3VdVPgI8DTwdW0ttD/8hM61XVmqqarKrJiYmJIZQsSYIBAzzJvvTC+9NV9QWAqtpWVQ9V1cPAJ4CjR1emJGm6Qa5CCXAesKmqzp7SvmxKt1cDG4dfniRpNoNchfJ84BTgliQ3dW3vBU5OshIoYDPwlpFUKEma0SBXoVwLZIaHLh9+OZKkQXknpiQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEb1DfAkhya5KsmmJLcmeWfX/sQkVyS5vft60OjLlSTtMsge+E7g3VX1bGAV8PYkRwBnAFdW1eHAld2yJGlM+gZ4VW2tqm928/cDm4CDgROBtV23tcBJoypSkvRIczoGnmQFcCRwI/DkqtoKvZAHnjTLOquTrE+yfseOHQurVpL0SwMHeJL9gYuBd1XVTwZdr6rWVNVkVU1OTEzMp0ZJ0gwGCvAk+9IL709X1Re65m1JlnWPLwO2j6ZESdJMBrkKJcB5wKaqOnvKQ+uAU7v5U4FLh1+eJGk2Swbo83zgFOCWJDd1be8FzgIuSnI68APgtaMpUZI0k74BXlXXApnl4WOHW44kaVDeiSlJjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5Jjeob4EnOT7I9ycYpbWcm+WGSm7rphNGWKUmabpA98AuA42ZoP6eqVnbT5cMtS5LUT98Ar6prgHvGUIskaQ4Wcgz8HUlu7g6xHDRbpySrk6xPsn7Hjh0L2Jwkaar5BvjHgacDK4GtwEdm61hVa6pqsqomJyYm5rk5SdJ08wrwqtpWVQ9V1cPAJ4Cjh1uWJKmfeQV4kmVTFl8NbJytryRpNJb065Dks8AxwNIkW4A/B45JshIoYDPwlhHWKEmaQd8Ar6qTZ2g+bwS1SJLmwDsxJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNapvgCc5P8n2JBuntD0xyRVJbu++HjTaMiVJ0w2yB34BcNy0tjOAK6vqcODKblmSNEZ9A7yqrgHumdZ8IrC2m18LnDTkuiRJfSyZ53pPrqqtAFW1NcmTZuuYZDWwGmD58uXz3NzsVpxx2Yztm896xdC3JUl7kpGfxKyqNVU1WVWTExMTo96cJO015hvg25IsA+i+bh9eSZKkQcw3wNcBp3bzpwKXDqccSdKgBrmM8LPA9cCzkmxJcjpwFvCyJLcDL+uWJUlj1PckZlWdPMtDxw65FknSHHgnpiQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalR8303wj2e71Io6dHOPXBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMW9IEOSTYD9wMPATuranIYRUmS+hvGJ/K8uKp+NITnkSTNgYdQJKlRCw3wAr6aZEOS1TN1SLI6yfok63fs2LHAzUmSdllogD+/qo4CjgfenuRF0ztU1ZqqmqyqyYmJiQVuTpK0y4ICvKru7r5uBy4Bjh5GUZKk/uYd4El+NckBu+aBlwMbh1WYJGn3FnIVypOBS5Lsep7PVNU/D6UqSVJf8w7wqroTeO4Qa5EkzYGXEUpSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYtWewCxm3FGZfN+tjms14xp3Vm6y9J4+AeuCQ1ygCXpEYZ4JLUqAUFeJLjktyW5HtJzhhWUZKk/uYd4En2Ac4FjgeOAE5OcsSwCpMk7d5C9sCPBr5XVXdW1f8CnwNOHE5ZkqR+FnIZ4cHAXVOWtwC/M71TktXA6m7xgSS3zXN7S4EfzXPdgeRDo+0/DyMf8x7IMe8dHPPcPHWmxoUEeGZoq0c0VK0B1ixgO72NJeuranKhz9MSx7x3cMx7h1GMeSGHULYAh05ZPgS4e2HlSJIGtZAA/w/g8CRPS7If8Hpg3XDKkiT1M+9DKFW1M8k7gH8B9gHOr6pbh1bZIy34MEyDHPPewTHvHYY+5lQ94rC1JKkB3okpSY0ywCWpUXtcgPe7PT/JY5Nc2D1+Y5IV469yuAYY858k+U6Sm5NcmWTGa0JbMujbMCR5TZJK0vQlZ4OMN8nrutf51iSfGXeNwzbAz/XyJFcl+Vb3s33CYtQ5TEnOT7I9ycZZHk+Sj3Xfk5uTHLWgDVbVHjPROxl6B3AYsB/wbeCIaX3+EPj7bv71wIWLXfcYxvxi4PHd/Nv2hjF3/Q4ArgFuACYXu+4Rv8aHA98CDuqWn7TYdY9hzGuAt3XzRwCbF7vuIYz7RcBRwMZZHj8B+Aq9+2hWATcuZHt72h74ILfnnwis7eY/DxybZKabilrRd8xVdVVV/bRbvIHeNfctG/RtGP4S+DDw83EWNwKDjPfNwLlV9WOAqto+5hqHbZAxF/CEbv7XeBTcR1JV1wD37KbLicAnq+cG4MAky+a7vT0twGe6Pf/g2fpU1U7gPuDXx1LdaAwy5qlOp/cXvGV9x5zkSODQqvryOAsbkUFe42cCz0xyXZIbkhw3tupGY5Axnwm8IckW4HLgj8ZT2qKa6+/7bu1pH6k2yO35A93C35CBx5PkDcAk8LsjrWj0djvmJI8BzgFOG1dBIzbIa7yE3mGUY+j9h/X1JM+pqntHXNuoDDLmk4ELquojSZ4HfKob88OjL2/RDDW/9rQ98EFuz/9lnyRL6P3rtbt/WfZ0A70lQZKXAu8DXlVVvxhTbaPSb8wHAM8Brk6ymd6xwnUNn8gc9Of60qp6sKr+C7iNXqC3apAxnw5cBFBV1wOPo/eGT49mQ30Lkj0twAe5PX8dcGo3/xrgX6s7O9CovmPuDif8A73wbv3YKPQZc1XdV1VLq2pFVa2gd9z/VVW1fnHKXbBBfq6/SO9kNUmW0jukcudYqxyuQcb8A+BYgCTPphfgO8Za5fitA97YXY2yCrivqrbO+9kW+6ztLGdpv0vvDPb7urYP0PsFht6L/E/A94BvAIctds1jGPPXgG3ATd20brFrHvWYp/W9moavQhnwNQ5wNvAd4Bbg9Ytd8xjGfARwHb0rVG4CXr7YNQ9hzJ8FtgIP0tvbPh14K/DWKa/zud335JaF/lx7K70kNWpPO4QiSRqQAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIa9X9ciX1te2w0PwAAAABJRU5ErkJggg==\n",
377 "text/plain": [
378 "<Figure size 432x288 with 1 Axes>"
379 ]
380 },
381 "metadata": {
382 "needs_background": "light"
383 },
384 "output_type": "display_data"
385 },
386 {
387 "data": {
388 "image/png": "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\n",
389 "text/plain": [
390 "<Figure size 432x288 with 1 Axes>"
391 ]
392 },
393 "metadata": {
394 "needs_background": "light"
395 },
396 "output_type": "display_data"
397 },
398 {
399 "data": {
400 "image/png": "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\n",
401 "text/plain": [
402 "<Figure size 432x288 with 1 Axes>"
403 ]
404 },
405 "metadata": {
406 "needs_background": "light"
407 },
408 "output_type": "display_data"
409 } 241 }
410 ], 242 ],
411 "source": [ 243 "source": [
@@ -421,7 +253,7 @@
421 }, 253 },
422 { 254 {
423 "cell_type": "code", 255 "cell_type": "code",
424 "execution_count": 4, 256 "execution_count": 6,
425 "metadata": {}, 257 "metadata": {},
426 "outputs": [], 258 "outputs": [],
427 "source": [ 259 "source": [
@@ -448,7 +280,7 @@
448 }, 280 },
449 { 281 {
450 "cell_type": "code", 282 "cell_type": "code",
451 "execution_count": 29, 283 "execution_count": 7,
452 "metadata": {}, 284 "metadata": {},
453 "outputs": [ 285 "outputs": [
454 { 286 {
@@ -482,7 +314,7 @@
482 }, 314 },
483 { 315 {
484 "cell_type": "code", 316 "cell_type": "code",
485 "execution_count": 30, 317 "execution_count": 8,
486 "metadata": {}, 318 "metadata": {},
487 "outputs": [], 319 "outputs": [],
488 "source": [ 320 "source": [
@@ -496,7 +328,7 @@
496 }, 328 },
497 { 329 {
498 "cell_type": "code", 330 "cell_type": "code",
499 "execution_count": 31, 331 "execution_count": 9,
500 "metadata": {}, 332 "metadata": {},
501 "outputs": [], 333 "outputs": [],
502 "source": [ 334 "source": [
@@ -541,70 +373,34 @@
541 }, 373 },
542 { 374 {
543 "cell_type": "code", 375 "cell_type": "code",
544 "execution_count": 20, 376 "execution_count": 21,
545 "metadata": {}, 377 "metadata": {},
546 "outputs": [ 378 "outputs": [],
547 {
548 "name": "stdout",
549 "output_type": "stream",
550 "text": [
551 "466\n",
552 "30\n",
553 "100\n",
554 "198\n"
555 ]
556 },
557 {
558 "data": {
559 "text/plain": [
560 "(array([107., 37., 18., 16., 8., 2., 3., 2., 3., 2.]),\n",
561 " array([ 30. , 73.6, 117.2, 160.8, 204.4, 248. , 291.6, 335.2, 378.8,\n",
562 " 422.4, 466. ]),\n",
563 " <a list of 10 Patch objects>)"
564 ]
565 },
566 "execution_count": 20,
567 "metadata": {},
568 "output_type": "execute_result"
569 },
570 {
571 "data": {
572 "image/png": "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\n",
573 "text/plain": [
574 "<Figure size 432x288 with 1 Axes>"
575 ]
576 },
577 "metadata": {
578 "needs_background": "light"
579 },
580 "output_type": "display_data"
581 }
582 ],
583 "source": [ 379 "source": [
584 "import matplotlib.pyplot as plt\n", 380 "import matplotlib.pyplot as plt\n",
585 "from shutil import copyfile\n", 381 "from shutil import copyfile\n",
586 "import statistics \n", 382 "import statistics \n",
587 "\n", 383 "\n",
588 "graphStats = getModels('../input/human_30_500_no_xml/', 1500)\n", 384 "graphStats = getModels('../input/human/', 1500)\n",
589 "sizes = []\n", 385 "sizes = []\n",
590 "filenames = reader.readmultiplefiles('../input/human/', 1500, False)\n", 386 "filenames = reader.readmultiplefiles('../input/human/', 1500, False)\n",
591 "count = 1\n", 387 "count = 1\n",
592 "# for filename in filenames:\n", 388 "for filename in filenames:\n",
593 "# graphStat = GraphStat(filename)\n", 389 " graphStat = GraphStat(filename)\n",
594 "# size = graphStat.numNodes[0]\n", 390 " size = graphStat.numNodes[0]\n",
595 "# if size >= 30 and size <= 500 and not ('EAnnotation' in graphStat.nodeTypeStat.keys() and 'EStringToStringMapEntry' in graphStat.nodeTypeStat.keys()):\n", 391 " if size >= 30 and size <= 500 and not ('EAnnotation' in graphStat.nodeTypeStat.keys() and 'EStringToStringMapEntry' in graphStat.nodeTypeStat.keys()):\n",
596 "# copyfile(filename, filename.replace('human', 'human_30_500_no_xml'))\n", 392 " copyfile(filename, filename.replace('human', 'human_30_500_no_xml'))\n",
597 " \n", 393 " \n",
598 " \n", 394 " \n",
599 "for g in graphStats:\n", 395 "# for g in graphStats:\n",
600 " size = g.numNodes[0]\n", 396 "# size = g.numNodes[0]\n",
601 " if size >= 30 and size <= 500 and not ('EAnnotation' in g.nodeTypeStat.keys() and 'EStringToStringMapEntry' in g.nodeTypeStat.keys()):\n", 397 "# if size >= 30 and size <= 500 and not ('EAnnotation' in g.nodeTypeStat.keys() and 'EStringToStringMapEntry' in g.nodeTypeStat.keys()):\n",
602 " sizes.append(g.numNodes[0])\n", 398 "# sizes.append(g.numNodes[0])\n",
603 "print(max(sizes))\n", 399 "# print(max(sizes))\n",
604 "print(min(sizes))\n", 400 "# print(min(sizes))\n",
605 "print(statistics.mean(sizes))\n", 401 "# print(statistics.mean(sizes))\n",
606 "print(len(sizes))\n", 402 "# print(len(sizes))\n",
607 "plt.hist(sizes, bins=10)\n" 403 "# plt.hist(sizes, bins=10)\n"
608 ] 404 ]
609 }, 405 },
610 { 406 {
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py b/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py
index 6e707108..cf532bc5 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py
+++ b/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py
@@ -5,6 +5,16 @@ def ks_distance(samples1, samples2):
5 value, p = stats.ks_2samp(samples1, samples2) 5 value, p = stats.ks_2samp(samples1, samples2)
6 return (value, p) 6 return (value, p)
7 7
8def 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
8def js_distance(samples1, samples2): 18def js_distance(samples1, samples2):
9 map1 = fromSamples(samples1) 19 map1 = fromSamples(samples1)
10 map2 = fromSamples(samples2) 20 map2 = fromSamples(samples2)
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py
index 0a9a95c5..41054294 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py
+++ b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py
@@ -10,6 +10,7 @@ class GraphCollection:
10 self.out_ds = [] 10 self.out_ds = []
11 self.nas = [] 11 self.nas = []
12 self.mpcs = [] 12 self.mpcs = []
13 self.nts = []
13 self.name = name 14 self.name = name
14 models = reader.readmultiplefiles(path, number, shouldShuffle) 15 models = reader.readmultiplefiles(path, number, shouldShuffle)
15 print(len(models)) 16 print(len(models))
@@ -19,6 +20,8 @@ class GraphCollection:
19 self.out_ds.append(out_d) 20 self.out_ds.append(out_d)
20 self.nas.append(na) 21 self.nas.append(na)
21 self.mpcs.append(mpc) 22 self.mpcs.append(mpc)
23 if(constants.Node_TYPE_KEY in contents):
24 self.nts.append(contents[constants.Node_TYPE_KEY])
22 25
23#Graph stat for one graph 26#Graph stat for one graph
24class GraphStat: 27class GraphStat:
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
index 4dff00cd..c817d20b 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
@@ -6,12 +6,14 @@ import java.util.Collection;
6import java.util.Collections; 6import java.util.Collections;
7import java.util.Comparator; 7import java.util.Comparator;
8import java.util.HashMap; 8import java.util.HashMap;
9import java.util.HashSet;
9import java.util.Iterator; 10import java.util.Iterator;
10import java.util.LinkedList; 11import java.util.LinkedList;
11import java.util.List; 12import java.util.List;
12import java.util.Map; 13import java.util.Map;
13import java.util.PriorityQueue; 14import java.util.PriorityQueue;
14import java.util.Random; 15import java.util.Random;
16import java.util.Set;
15 17
16import org.apache.log4j.Logger; 18import org.apache.log4j.Logger;
17import org.eclipse.emf.ecore.util.EcoreUtil; 19import org.eclipse.emf.ecore.util.EcoreUtil;
@@ -64,19 +66,21 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
64 // matchers for detecting the number of violations 66 // matchers for detecting the number of violations
65 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> mustMatchers; 67 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> mustMatchers;
66 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> mayMatchers; 68 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> mayMatchers;
69
67 // Encode the used activations of a particular state 70 // Encode the used activations of a particular state
68 private Map<Object, List<Object>> stateAndActivations; 71 private Map<Object, List<Object>> stateAndActivations;
69 private Map<TrajectoryWithFitness, Double> trajectoryFit;
70
71 private boolean allowMustViolation; 72 private boolean allowMustViolation;
72 private Domain domain; 73 private Domain domain;
73 74 int targetSize;
75
74 // Statistics 76 // Statistics
75 private int numberOfStatecoderFail = 0; 77 private int numberOfStatecoderFail = 0;
76 private int numberOfPrintedModel = 0; 78 private int numberOfPrintedModel = 0;
77 private int numberOfSolverCalls = 0; 79 private int numberOfSolverCalls = 0;
78 private PartialInterpretationMetricDistance metricDistance; 80 private PartialInterpretationMetricDistance metricDistance;
79 81 private double currentStateValue = Double.MAX_VALUE;
82 private double currentNodeTypeDistance = 1;
83 private int numNodesToGenerate = 0;
80 84
81 public HillClimbingOnRealisticMetricStrategyForModelGeneration( 85 public HillClimbingOnRealisticMetricStrategyForModelGeneration(
82 ReasonerWorkspace workspace, 86 ReasonerWorkspace workspace,
@@ -102,12 +106,14 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
102 public void initStrategy(ThreadContext context) { 106 public void initStrategy(ThreadContext context) {
103 this.context = context; 107 this.context = context;
104 this.solutionStore = context.getGlobalContext().getSolutionStore(); 108 this.solutionStore = context.getGlobalContext().getSolutionStore();
105 109 domain = Domain.valueOf(configuration.domain);
110
106 ViatraQueryEngine engine = context.getQueryEngine(); 111 ViatraQueryEngine engine = context.getQueryEngine();
107// // TODO: visualisation 112// // TODO: visualisation
108 mustMatchers = new LinkedList<ViatraQueryMatcher<? extends IPatternMatch>>(); 113 mustMatchers = new LinkedList<ViatraQueryMatcher<? extends IPatternMatch>>();
109 mayMatchers = new LinkedList<ViatraQueryMatcher<? extends IPatternMatch>>(); 114 mayMatchers = new LinkedList<ViatraQueryMatcher<? extends IPatternMatch>>();
110 115
116 // manully restict the number of super types of one class
111 this.method.getInvalidWF().forEach(a ->{ 117 this.method.getInvalidWF().forEach(a ->{
112 ViatraQueryMatcher<? extends IPatternMatch> matcher = a.getMatcher(engine); 118 ViatraQueryMatcher<? extends IPatternMatch> matcher = a.getMatcher(engine);
113 mustMatchers.add(matcher); 119 mustMatchers.add(matcher);
@@ -117,27 +123,27 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
117 ViatraQueryMatcher<? extends IPatternMatch> matcher = a.getMatcher(engine); 123 ViatraQueryMatcher<? extends IPatternMatch> matcher = a.getMatcher(engine);
118 mayMatchers.add(matcher); 124 mayMatchers.add(matcher);
119 }); 125 });
126
120 127
121 128 //set up comparator
122 this.solutionStoreWithCopy = new SolutionStoreWithCopy(); 129 final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper();
123 this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement);
124
125 trajectoryFit = new HashMap<TrajectoryWithFitness, Double>();
126 this.comparator = new Comparator<TrajectoryWithFitness>() { 130 this.comparator = new Comparator<TrajectoryWithFitness>() {
127 @Override 131 @Override
128 public int compare(TrajectoryWithFitness o1, TrajectoryWithFitness o2) { 132 public int compare(TrajectoryWithFitness o1, TrajectoryWithFitness o2) {
129 return Double.compare(trajectoryFit.get(o1), trajectoryFit.get(o2)); 133 return objectiveComparatorHelper.compare(o2.fitness, o1.fitness);
130 } 134 }
131 }; 135 };
132 136
137 this.solutionStoreWithCopy = new SolutionStoreWithCopy();
138 this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement);
139
133 trajectoiresToExplore = new PriorityQueue<TrajectoryWithFitness>(11, comparator); 140 trajectoiresToExplore = new PriorityQueue<TrajectoryWithFitness>(11, comparator);
134 stateAndActivations = new HashMap<Object, List<Object>>(); 141 stateAndActivations = new HashMap<Object, List<Object>>();
135
136 domain = Domain.valueOf(configuration.domain);
137 metricDistance = new PartialInterpretationMetricDistance(domain); 142 metricDistance = new PartialInterpretationMetricDistance(domain);
138 143
139 //set whether allows must violations during the realistic generation 144 //set whether allows must violations during the realistic generation
140 allowMustViolation = configuration.allowMustViolations; 145 allowMustViolation = configuration.allowMustViolations;
146 targetSize = configuration.typeScopes.maxNewElements + 2;
141 } 147 }
142 148
143 @Override 149 @Override
@@ -156,14 +162,12 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
156 //final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper(); 162 //final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper();
157 final Object[] firstTrajectory = context.getTrajectory().toArray(new Object[0]); 163 final Object[] firstTrajectory = context.getTrajectory().toArray(new Object[0]);
158 TrajectoryWithFitness currentTrajectoryWithFittness = new TrajectoryWithFitness(firstTrajectory, firstFittness); 164 TrajectoryWithFitness currentTrajectoryWithFittness = new TrajectoryWithFitness(firstTrajectory, firstFittness);
159 trajectoryFit.put(currentTrajectoryWithFittness, Double.MAX_VALUE);
160 trajectoiresToExplore.add(currentTrajectoryWithFittness); 165 trajectoiresToExplore.add(currentTrajectoryWithFittness);
161 Object lastState = null; 166 Object lastState = null;
162 167
163 //if(configuration) 168 //if(configuration)
164 visualiseCurrentState(); 169 visualiseCurrentState();
165 // the two is the True and False node generated at the beginning of the generation 170 // the two is the True and False node generated at the beginning of the generation
166 int targetSize = configuration.typeScopes.maxNewElements + 2;
167 int count = 0; 171 int count = 0;
168 mainLoop: while (!isInterrupted && !configuration.progressMonitor.isCancelled()) { 172 mainLoop: while (!isInterrupted && !configuration.progressMonitor.isCancelled()) {
169 173
@@ -202,21 +206,22 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
202 double epsilon = 1.0/count; 206 double epsilon = 1.0/count;
203 double draw = Math.random(); 207 double draw = Math.random();
204 count++; 208 count++;
205 209 this.currentNodeTypeDistance = heuristics.getNodeTypeDistance();
210 numNodesToGenerate = model.getMaxNewElements();
206 System.out.println("NA distance: " + heuristics.getNADistance()); 211 System.out.println("NA distance: " + heuristics.getNADistance());
207 System.out.println("MPC distance: " + heuristics.getMPCDistance()); 212 System.out.println("MPC distance: " + heuristics.getMPCDistance());
208 System.out.println("Out degree distance:" + heuristics.getOutDegreeDistance()); 213 System.out.println("Out degree distance:" + heuristics.getOutDegreeDistance());
209 System.out.println("NodeType :" + heuristics.getNodeTypeDistance()); 214 System.out.println("NodeType :" + currentNodeTypeDistance);
210 System.out.println("Edge :" + heuristics.edgeTypeDistance);
211 215
212// System.out.println("FinalState :" + heuristics.getNodeTypePercentage("FinalState")); 216// System.out.println("FinalState :" + heuristics.getNodeTypePercentage("FinalState"));
213 217
214 //TODO: the number of activations to be checked should be configurasble 218 //TODO: the number of activations to be checked should be configurasble
219 System.out.println(activationIds.size());
215 if(activationIds.size() > 50) { 220 if(activationIds.size() > 50) {
216 activationIds = activationIds.subList(0, 50); 221 activationIds = activationIds.subList(0, 50);
217 } 222 }
218 223
219 valueMap = sortWithWeight(activationIds, model.getNewElements().size()); 224 valueMap = sortWithWeight(activationIds);
220 lastState = context.getCurrentStateId(); 225 lastState = context.getCurrentStateId();
221 while (!isInterrupted && !configuration.progressMonitor.isCancelled() && activationIds.size() > 0) { 226 while (!isInterrupted && !configuration.progressMonitor.isCancelled() && activationIds.size() > 0) {
222 final Object nextActivation = drawWithEpsilonProbabilty(activationIds, valueMap, epsilon, draw); 227 final Object nextActivation = drawWithEpsilonProbabilty(activationIds, valueMap, epsilon, draw);
@@ -230,9 +235,10 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
230 235
231 int currentSize = model.getNewElements().size(); 236 int currentSize = model.getNewElements().size();
232 int targetDiff = targetSize - currentSize; 237 int targetDiff = targetSize - currentSize;
238 boolean shouldFinish = currentSize >= targetSize;
233 239
234 // does not allow must violations 240 // does not allow must violations
235 if((getNumberOfViolations(mustMatchers) > 0|| getNumberOfViolations(mayMatchers) > targetDiff) && !allowMustViolation) { 241 if((getNumberOfViolations(mustMatchers) > 0|| getNumberOfViolations(mayMatchers) > targetDiff) && !allowMustViolation && !shouldFinish) {
236 context.backtrack(); 242 context.backtrack();
237 }else { 243 }else {
238 final Fitness nextFitness = context.calculateFitness(); 244 final Fitness nextFitness = context.calculateFitness();
@@ -251,38 +257,21 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
251 context.getTrajectory().toArray(), nextFitness); 257 context.getTrajectory().toArray(), nextFitness);
252 int nodeSize = ((PartialInterpretation) context.getModel()).getNewElements().size(); 258 int nodeSize = ((PartialInterpretation) context.getModel()).getNewElements().size();
253 int violation = getNumberOfViolations(mayMatchers); 259 int violation = getNumberOfViolations(mayMatchers);
254 metricDistance.getLinearModel().feedData(context.getCurrentStateId(), metricDistance.calculateFeature(nodeSize, violation), calculateCurrentStateValue(nodeSize, violation), lastState); 260 double currentValue = calculateCurrentStateValue(nodeSize, violation);
255 double value = calculateCurrentStateValue(nodeSize, violation); 261 metricDistance.getLinearModel().feedData(context.getCurrentStateId(), metricDistance.calculateFeature(nodeSize, violation), currentValue, lastState);
256 trajectoryFit.put(nextTrajectoryWithFittness, value);
257 trajectoiresToExplore.add(nextTrajectoryWithFittness); 262 trajectoiresToExplore.add(nextTrajectoryWithFittness);
258 263 currentStateValue = currentValue;
259 //Currently, just go to the next state without considering the value of trajectory 264 //Currently, just go to the next state without considering the value of trajectory
260 currentTrajectoryWithFittness = nextTrajectoryWithFittness; 265 currentTrajectoryWithFittness = nextTrajectoryWithFittness;
261 continue mainLoop; 266 continue mainLoop;
262 267
263// int compare = objectiveComparatorHelper.compare(currentTrajectoryWithFittness.fitness,
264// nextTrajectoryWithFittness.fitness);
265// if (compare < 0) {
266// logger.debug("Better fitness, moving on: " + nextFitness);
267// currentTrajectoryWithFittness = nextTrajectoryWithFittness;
268// continue mainLoop;
269// } else if (compare == 0) {
270// logger.debug("Equally good fitness, moving on: " + nextFitness);
271// currentTrajectoryWithFittness = nextTrajectoryWithFittness;
272// continue mainLoop;
273// } else {
274// logger.debug("Worse fitness.");
275// currentTrajectoryWithFittness = nextTrajectoryWithFittness;
276// continue mainLoop;
277 }
278 } 268 }
279 } 269 }
280 logger.debug("State is fully traversed."); 270 logger.debug("State is fully traversed.");
281 trajectoiresToExplore.remove(currentTrajectoryWithFittness); 271 trajectoiresToExplore.remove(currentTrajectoryWithFittness);
282 currentTrajectoryWithFittness = null; 272 currentTrajectoryWithFittness = null;
283 context.backtrack(); 273 context.backtrack();
284// } 274 }
285
286 logger.info("Interrupted."); 275 logger.info("Interrupted.");
287 } 276 }
288 277
@@ -291,14 +280,23 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
291 * @param activationIds 280 * @param activationIds
292 * @return: activation to value map 281 * @return: activation to value map
293 */ 282 */
294 private Map<Object, Double> sortWithWeight(List<Object> activationIds, int factor){ 283 private Map<Object, Double> sortWithWeight(List<Object> activationIds){
295 Map<Object, Double> valueMap = new HashMap<Object, Double>(); 284 Map<Object, Double> valueMap = new HashMap<Object, Double>();
296 285 Object currentId = context.getCurrentStateId();
297 // check for next states 286 // check for next states
298 for(Object id : activationIds) { 287 for(Object id : activationIds) {
299 context.executeAcitvationId(id); 288 context.executeAcitvationId(id);
300 int violation = getNumberOfViolations(mayMatchers); 289 int violation = getNumberOfViolations(mayMatchers);
301 valueMap.put(id, calculateFutureStateValue(factor, violation)); 290
291 if(!allowMustViolation && getNumberOfViolations(mustMatchers) > 0) {
292 valueMap.put(id, Double.MAX_VALUE);
293 stateAndActivations.get(currentId).add(id);
294 }else {
295 valueMap.put(id, calculateFutureStateValue(violation));
296 }
297
298
299
302 context.backtrack(); 300 context.backtrack();
303 } 301 }
304 302
@@ -308,25 +306,22 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
308 return valueMap; 306 return valueMap;
309 } 307 }
310 308
311 private double calculateFutureStateValue(int step, int violation) { 309 private double calculateFutureStateValue(int violation) {
312 double currentValue = calculateCurrentStateValue(step, violation); 310 int nodeSize = ((PartialInterpretation) context.getModel()).getNewElements().size();
313 311 double currentValue = calculateCurrentStateValue(nodeSize,violation);
314 if(step > 10 && currentValue < 10000) { 312 double[] toPredict = metricDistance.calculateFeature(100, violation);
315 double[] toPredict = metricDistance.calculateFeature(100, violation); 313 if(Math.abs(currentValue - currentStateValue) < 0.001) {
316 try { 314 return Double.MAX_VALUE;
317 return metricDistance.getLinearModel().getPredictionForNextDataSample(metricDistance.calculateFeature(step, violation), currentValue, toPredict); 315 }
318 }catch(IllegalArgumentException e) { 316 try {
319 return currentValue; 317 return metricDistance.getLinearModel().getPredictionForNextDataSample(metricDistance.calculateFeature(nodeSize, violation), currentValue, toPredict);
320 } 318 }catch(IllegalArgumentException e) {
321 }else {
322 return currentValue; 319 return currentValue;
323 } 320 }
324 } 321 }
325
326 private double calculateCurrentStateValue(int factor, int violation) { 322 private double calculateCurrentStateValue(int factor, int violation) {
327 PartialInterpretation model = (PartialInterpretation) context.getModel(); 323 PartialInterpretation model = (PartialInterpretation) context.getModel();
328 MetricDistanceGroup g = metricDistance.calculateMetricDistanceKS(model); 324 MetricDistanceGroup g = metricDistance.calculateMetricDistanceKS(model);
329
330 if(configuration.realisticGuidance == RealisticGuidance.MPC) { 325 if(configuration.realisticGuidance == RealisticGuidance.MPC) {
331 return g.getMPCDistance(); 326 return g.getMPCDistance();
332 }else if(configuration.realisticGuidance == RealisticGuidance.NodeActivity) { 327 }else if(configuration.realisticGuidance == RealisticGuidance.NodeActivity) {
@@ -337,18 +332,35 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
337 return g.getNodeTypeDistance(); 332 return g.getNodeTypeDistance();
338 }else if(configuration.realisticGuidance == RealisticGuidance.Composite) { 333 }else if(configuration.realisticGuidance == RealisticGuidance.Composite) {
339 double consistenceWeights = 5 * factor / (configuration.typeScopes.maxNewElements + 2) * (1- 1.0/(1+violation)); 334 double consistenceWeights = 5 * factor / (configuration.typeScopes.maxNewElements + 2) * (1- 1.0/(1+violation));
340
341 if(domain == Domain.Yakindumm) { 335 if(domain == Domain.Yakindumm) {
342 return(100.0 *(g.getNodeTypeDistance()) + 5*(g.getNADistance() + 5*g.getMPCDistance() +g.getOutDegreeDistance()) + consistenceWeights); 336 double unfinishFactor = 50 * (1 - (double)factor / targetSize);
337 double nodeTypeFactor = g.getNodeTypeDistance();
338 double normalFactor = 5;
339 if(currentNodeTypeDistance <= 0.05 || numNodesToGenerate == 1) {
340 nodeTypeFactor = 0;
341 normalFactor = 100;
342 unfinishFactor = 0;
343 }
344
345 return 100*(nodeTypeFactor) + normalFactor*(2*g.getNADistance() + g.getMPCDistance() + 2*g.getOutDegreeDistance()) + normalFactor / 5*consistenceWeights + unfinishFactor;
343 }else { 346 }else {
344 return 10*(g.getNodeTypeDistance()) + 5*(g.getNADistance() + g.getMPCDistance() +2*g.getOutDegreeDistance()) + consistenceWeights; 347 double unfinishFactor = 100 * (1 - (double)factor / targetSize);
348 double nodeTypeFactor = g.getNodeTypeDistance();
349 double normalFactor = 5;
350 if(currentNodeTypeDistance <= 0.12 || numNodesToGenerate == 1) {
351 nodeTypeFactor = 0;
352 normalFactor = 100;
353 unfinishFactor *= 0.5;
354 }
355
356 return 100*(nodeTypeFactor) + normalFactor*(2*g.getNADistance() + g.getMPCDistance() + 2*g.getOutDegreeDistance()) + normalFactor / 5*consistenceWeights + unfinishFactor;
345 } 357 }
346 358
347 }else if(configuration.realisticGuidance == RealisticGuidance.Composite_Without_Violations) { 359 }else if(configuration.realisticGuidance == RealisticGuidance.Composite_Without_Violations) {
348 if(domain == Domain.Yakindumm) { 360 if(domain == Domain.Yakindumm) {
349 return 100.0 *(g.getNodeTypeDistance()) + 5*(g.getNADistance() + g.getMPCDistance() +g.getOutDegreeDistance()); 361 return 100.0 *(g.getNodeTypeDistance()) + 5*(g.getNADistance() + g.getMPCDistance() +g.getOutDegreeDistance());
350 }else { 362 }else {
351 return 10*(g.getNodeTypeDistance()) + 5*(g.getNADistance() + g.getMPCDistance() + 2*g.getOutDegreeDistance()); 363 return 15*(g.getNodeTypeDistance()) + 5*(g.getNADistance() + g.getMPCDistance() + 4*g.getOutDegreeDistance());
352 } 364 }
353 }else { 365 }else {
354 return violation; 366 return violation;