aboutsummaryrefslogtreecommitdiffstats
path: root/Metrics
diff options
context:
space:
mode:
authorLibravatar 20001LastOrder <boqi.chen@mail.mcgill.ca>2019-08-08 16:45:45 -0400
committerLibravatar 20001LastOrder <boqi.chen@mail.mcgill.ca>2019-08-08 16:45:45 -0400
commitc33f0b9c4e112ee573d1b26d205a253cc0e487f8 (patch)
tree1ec2c4ab56b5bc0d0d56fa111bab0520c05604b4 /Metrics
parentFurther development of realistic solver, create generation config for ecore m... (diff)
downloadVIATRA-Generator-c33f0b9c4e112ee573d1b26d205a253cc0e487f8.tar.gz
VIATRA-Generator-c33f0b9c4e112ee573d1b26d205a253cc0e487f8.tar.zst
VIATRA-Generator-c33f0b9c4e112ee573d1b26d205a253cc0e487f8.zip
Configurations for generation and new domain for generation ecore model
Diffstat (limited to 'Metrics')
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF8
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/build.properties3
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore104
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/na_rep/XSHMLMT.ecore203
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore549
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/mpc_rep.csv (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep.csv)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/mpc_rep/R_2016324.xmi (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/mpc_rep/R_2016324.xmi)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/na_rep.csv (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep.csv)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/na_rep/R_2017419.xmi (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/na_rep/R_2017419.xmi)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/mpc_rep/R_2015194.xmi (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2015194.xmi)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/na_rep/R_2017131.xmi (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017131.xmi)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/out_d_rep/R_2015248.xmi (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015248.xmi)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/out_d_rep.csv (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep.csv)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/out_d_rep/R_2015225.xmi (renamed from Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/out_d_rep/R_2015225.xmi)0
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt13
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig26
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml9
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql29
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore6
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/DirectSupertype.java692
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java97
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/LoopInInheritence.java548
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/NonSymmetricOpposite.java707
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Opposite.java693
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/OppositeDifferentClass.java577
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java11
-rw-r--r--Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig8
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/.classpath1
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF6
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoIncomingConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoOutgoingConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/IncomingToEntryConstraint0.java80
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleEntryInRegionConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleTransitionFromEntryConstraint0.java81
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoEntryInRegionConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoOutgoingTransitionFromEntryConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoStateInRegionConstraint0.java79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromExitConstraint0.java80
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromFinalConstraint0.java80
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/mpc_rep/R_2016324.xmi128
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/na_rep/R_2017419.xmi138
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/out_d_rep/R_2015225.xmi145
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend4
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend71
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend10
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java31
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend23
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend38
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend79
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend60
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend9
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend59
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/MultiplexParticipationCoefficientMetric.xtend6
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ConstraintCollection.xtend80
-rw-r--r--Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend69
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/input/.gitignore3
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.pngbin0 -> 285347 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.pngbin0 -> 285060 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.pngbin0 -> 316647 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.pngbin0 -> 322141 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.pngbin0 -> 306030 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb338
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.pngbin47645 -> 60526 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.pngbin50335 -> 54889 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.pngbin49640 -> 57228 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.pngbin0 -> 64516 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.pngbin0 -> 66166 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.pngbin0 -> 64141 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.pngbin0 -> 76199 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.pngbin0 -> 72990 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.pngbin0 -> 73421 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/MPC.pngbin0 -> 74009 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Node Activity.pngbin0 -> 73485 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Out Degree.pngbin0 -> 70233 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/MPC.pngbin0 -> 84604 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Node Activity.pngbin0 -> 83179 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Out Degree.pngbin0 -> 75807 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/MPC.pngbin0 -> 70321 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Node Activity.pngbin0 -> 61433 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Out Degree.pngbin0 -> 64145 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.pngbin0 -> 69414 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.pngbin0 -> 64936 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.pngbin0 -> 67587 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.pngbin0 -> 67954 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.pngbin0 -> 63561 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.pngbin0 -> 67238 bytes
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py24
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb58
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb137
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py3
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/utils/constants.py2
-rw-r--r--Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py2
92 files changed, 5958 insertions, 644 deletions
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF
index cf5154e4..a3f5076e 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF
@@ -7,6 +7,7 @@ Bundle-ClassPath: .
7Bundle-Vendor: %providerName 7Bundle-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 queries, 11 queries,
11 socialnetwork, 12 socialnetwork,
12 socialnetwork.impl, 13 socialnetwork.impl,
@@ -24,8 +25,9 @@ Require-Bundle: org.eclipse.viatra.query.runtime.rete,
24 hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph;bundle-version="1.0.0", 25 hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph;bundle-version="1.0.0",
25 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator;bundle-version="1.0.0", 26 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator;bundle-version="1.0.0",
26 hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.validation;bundle-version="0.0.1" 27 hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.validation;bundle-version="0.0.1"
28Bundle-RequiredExecutionEnvironment: JavaSE-1.8
29Bundle-ActivationPolicy: lazy
30Main-Class: ca.mcgill.ecse.socialnetwork.runner.Main
31Automatic-Module-Name: SocialNetwork_plugin
27Import-Package: org.apache.log4j, 32Import-Package: org.apache.log4j,
28 org.junit;version="4.12.0" 33 org.junit;version="4.12.0"
29Automatic-Module-Name: SocialNetwork_plugin
30Bundle-ActivationPolicy: lazy
31Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/build.properties b/Metrics/Metrics-Calculation/SocialNetwork_plugin/build.properties
index 63ef0274..b91f214f 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/build.properties
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/build.properties
@@ -2,7 +2,8 @@ bin.includes = .,\
2 model/,\ 2 model/,\
3 META-INF/,\ 3 META-INF/,\
4 plugin.xml,\ 4 plugin.xml,\
5 plugin.properties 5 plugin.properties,\
6 src/
6jars.compile.order = . 7jars.compile.order = .
7source.. = encore_gen/,\ 8source.. = encore_gen/,\
8 src-gen/ 9 src-gen/
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
new file mode 100644
index 00000000..57088b0c
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore
@@ -0,0 +1,104 @@
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/na_rep/XSHMLMT.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/na_rep/XSHMLMT.ecore
new file mode 100644
index 00000000..f741662e
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/na_rep/XSHMLMT.ecore
@@ -0,0 +1,203 @@
1<?xml version="1.0" encoding="ASCII"?>
2<ecore:EPackage 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" name="shml" nsURI="http://ecnu.models.xshml.xshmlmt/shml/" nsPrefix="shml">
3 <eClassifiers xsi:type="ecore:EClass" name="System">
4 <eOperations name="main">
5 <eAnnotations source="aspect"/>
6 </eOperations>
7 <eOperations name="doprintconfiguration">
8 <eAnnotations source="aspect"/>
9 </eOperations>
10 <eOperations name="dojump">
11 <eAnnotations source="aspect"/>
12 </eOperations>
13 <eOperations name="callscilab">
14 <eAnnotations source="aspect"/>
15 </eOperations>
16 <eOperations name="RealizeInitializeModel">
17 <eAnnotations source="aspect"/>
18 <eParameters name="arguments" upperBound="-1">
19 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
20 </eParameters>
21 </eOperations>
22 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
23 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
24 </eStructuralFeatures>
25 <eStructuralFeatures xsi:type="ecore:EReference" name="tshss" upperBound="-1" eType="//TSHS" containment="true"/>
26 <eStructuralFeatures xsi:type="ecore:EReference" name="globalvariables" upperBound="-1" eType="//Variable" containment="true"/>
27 <eStructuralFeatures xsi:type="ecore:EReference" name="globalclocks" upperBound="-1" eType="//Clock" containment="true"/>
28 <eStructuralFeatures xsi:type="ecore:EReference" name="globalevents" upperBound="-1" eType="//Event" containment="true"/>
29 </eClassifiers>
30 <eClassifiers xsi:type="ecore:EClass" name="TSHS">
31 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
32 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
33 </eStructuralFeatures>
34 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedodes" upperBound="-1" eType="//ODE" containment="true"/>
35 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedstates" upperBound="-1" eType="//State" containment="true"/>
36 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedtransitions" upperBound="-1" eType="//Transition" containment="true"/>
37 <eStructuralFeatures xsi:type="ecore:EReference" name="localvariables" upperBound="-1" eType="//Variable" containment="true"/>
38 <eStructuralFeatures xsi:type="ecore:EReference" name="localclocks" upperBound="-1" eType="//Clock" containment="true"/>
39 <eStructuralFeatures xsi:type="ecore:EReference" name="localevents" upperBound="-1" eType="//Event" containment="true"/>
40 <eStructuralFeatures xsi:type="ecore:EReference" name="initialstate" lowerBound="1" eType="//State"/>
41 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedexpos" upperBound="-1" eType="//ExpoDistribution" containment="true"/>
42 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedactions" upperBound="-1" eType="//Action" containment="true"/>
43 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedguards" upperBound="-1" eType="//Guard" containment="true"/>
44 <eStructuralFeatures xsi:type="ecore:EReference" name="ownedunifs" upperBound="-1" eType="//UnifDistribution" containment="true"/>
45 </eClassifiers>
46 <eClassifiers xsi:type="ecore:EClass" name="Variable">
47 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
48 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
49 </eStructuralFeatures>
50 <eStructuralFeatures xsi:type="ecore:EAttribute" name="value">
51 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
52 </eStructuralFeatures>
53 </eClassifiers>
54 <eClassifiers xsi:type="ecore:EClass" name="Clock">
55 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
56 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
57 </eStructuralFeatures>
58 <eStructuralFeatures xsi:type="ecore:EAttribute" name="time">
59 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
60 </eStructuralFeatures>
61 </eClassifiers>
62 <eClassifiers xsi:type="ecore:EClass" name="Event">
63 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
64 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
65 </eStructuralFeatures>
66 <eStructuralFeatures xsi:type="ecore:EAttribute" name="send">
67 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
68 </eStructuralFeatures>
69 <eStructuralFeatures xsi:type="ecore:EAttribute" name="receive">
70 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
71 </eStructuralFeatures>
72 <eStructuralFeatures xsi:type="ecore:EAttribute" name="active">
73 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
74 </eStructuralFeatures>
75 </eClassifiers>
76 <eClassifiers xsi:type="ecore:EClass" name="Transition" abstract="true">
77 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
78 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
79 </eStructuralFeatures>
80 <eStructuralFeatures xsi:type="ecore:EReference" name="triggerevent" lowerBound="1" eType="//Event"/>
81 <eStructuralFeatures xsi:type="ecore:EReference" name="taction" lowerBound="1" eType="//Action"/>
82 <eStructuralFeatures xsi:type="ecore:EReference" name="evaluateguard" lowerBound="1" eType="//EvaluateGuard"/>
83 <eStructuralFeatures xsi:type="ecore:EReference" name="temporalguard" lowerBound="1" eType="//TemporalGuard"/>
84 </eClassifiers>
85 <eClassifiers xsi:type="ecore:EClass" name="Guard" abstract="true">
86 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
87 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
88 </eStructuralFeatures>
89 </eClassifiers>
90 <eClassifiers xsi:type="ecore:EClass" name="TemporalGuard" eSuperTypes="//Guard">
91 <eOperations name="holdstg">
92 <eAnnotations source="aspect"/>
93 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
94 </eOperations>
95 <eStructuralFeatures xsi:type="ecore:EAttribute" name="tcondition">
96 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
97 </eStructuralFeatures>
98 <eStructuralFeatures xsi:type="ecore:EReference" name="onclock" lowerBound="1" eType="//Clock"/>
99 </eClassifiers>
100 <eClassifiers xsi:type="ecore:EClass" name="EvaluateGuard" eSuperTypes="//Guard">
101 <eOperations name="holdseg">
102 <eAnnotations source="aspect"/>
103 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
104 </eOperations>
105 <eStructuralFeatures xsi:type="ecore:EAttribute" name="vcondition">
106 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
107 </eStructuralFeatures>
108 <eStructuralFeatures xsi:type="ecore:EReference" name="onvariable" lowerBound="1" eType="//Variable"/>
109 </eClassifiers>
110 <eClassifiers xsi:type="ecore:EClass" name="State">
111 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
112 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
113 </eStructuralFeatures>
114 <eStructuralFeatures xsi:type="ecore:EReference" name="slaveode" lowerBound="1" eType="//ODE"/>
115 <eStructuralFeatures xsi:type="ecore:EReference" name="outgoingct" upperBound="-1" eType="//ComTransition" eOpposite="//ComTransition/csrc"/>
116 <eStructuralFeatures xsi:type="ecore:EReference" name="incomingct" upperBound="-1" eType="//ComTransition" eOpposite="//ComTransition/ctgt"/>
117 <eStructuralFeatures xsi:type="ecore:EReference" name="outgoingpt" upperBound="-1" eType="//ProbTransition" eOpposite="//ProbTransition/psrc"/>
118 <eStructuralFeatures xsi:type="ecore:EReference" name="incomingpt" upperBound="-1" eType="//ProbTransition" eOpposite="//ProbTransition/ptgt"/>
119 <eStructuralFeatures xsi:type="ecore:EReference" name="subdiagram" lowerBound="1" eType="//TSHS"/>
120 <eStructuralFeatures xsi:type="ecore:EReference" name="fatherstate" lowerBound="1" eType="//State"/>
121 <eStructuralFeatures xsi:type="ecore:EReference" name="slavelambda" lowerBound="1" eType="//ExpoDistribution"/>
122 <eStructuralFeatures xsi:type="ecore:EReference" name="slaveunif" lowerBound="1" eType="//UnifDistribution"/>
123 </eClassifiers>
124 <eClassifiers xsi:type="ecore:EClass" name="ComTransition" eSuperTypes="//Transition">
125 <eStructuralFeatures xsi:type="ecore:EReference" name="csrc" lowerBound="1" eType="//State" eOpposite="//State/outgoingct"/>
126 <eStructuralFeatures xsi:type="ecore:EReference" name="ctgt" eType="//State" eOpposite="//State/incomingct"/>
127 </eClassifiers>
128 <eClassifiers xsi:type="ecore:EClass" name="ProbTransition" eSuperTypes="//Transition">
129 <eStructuralFeatures xsi:type="ecore:EAttribute" name="probability">
130 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
131 </eStructuralFeatures>
132 <eStructuralFeatures xsi:type="ecore:EReference" name="psrc" lowerBound="1" eType="//State" eOpposite="//State/outgoingpt"/>
133 <eStructuralFeatures xsi:type="ecore:EReference" name="ptgt" lowerBound="1" eType="//State" eOpposite="//State/incomingpt"/>
134 </eClassifiers>
135 <eClassifiers xsi:type="ecore:EClass" name="Function">
136 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
137 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
138 </eStructuralFeatures>
139 <eStructuralFeatures xsi:type="ecore:EReference" name="indevariable" lowerBound="1" eType="//IndeVariable" containment="true"/>
140 <eStructuralFeatures xsi:type="ecore:EReference" name="devariable" lowerBound="1" eType="//DeVariable" containment="true"/>
141 <eStructuralFeatures xsi:type="ecore:EReference" name="fright" lowerBound="1" eType="//Fright" containment="true"/>
142 </eClassifiers>
143 <eClassifiers xsi:type="ecore:EClass" name="IndeVariable">
144 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
145 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
146 </eStructuralFeatures>
147 </eClassifiers>
148 <eClassifiers xsi:type="ecore:EClass" name="DeVariable">
149 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
150 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
151 </eStructuralFeatures>
152 </eClassifiers>
153 <eClassifiers xsi:type="ecore:EClass" name="Fright">
154 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
155 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
156 </eStructuralFeatures>
157 </eClassifiers>
158 <eClassifiers xsi:type="ecore:EClass" name="ODE">
159 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
160 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
161 </eStructuralFeatures>
162 <eStructuralFeatures xsi:type="ecore:EReference" name="condition" lowerBound="1" eType="//Condition" containment="true"/>
163 <eStructuralFeatures xsi:type="ecore:EReference" name="interval" lowerBound="1" eType="//Interval" containment="true"/>
164 <eStructuralFeatures xsi:type="ecore:EReference" name="function" lowerBound="1" eType="//Function" containment="true"/>
165 </eClassifiers>
166 <eClassifiers xsi:type="ecore:EClass" name="Condition">
167 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
168 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
169 </eStructuralFeatures>
170 </eClassifiers>
171 <eClassifiers xsi:type="ecore:EClass" name="Interval">
172 <eStructuralFeatures xsi:type="ecore:EAttribute" name="name">
173 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
174 </eStructuralFeatures>
175 <eStructuralFeatures xsi:type="ecore:EAttribute" name="left">
176 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
177 </eStructuralFeatures>
178 <eStructuralFeatures xsi:type="ecore:EAttribute" name="right">
179 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
180 </eStructuralFeatures>
181 <eStructuralFeatures xsi:type="ecore:EAttribute" name="subinterval">
182 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
183 </eStructuralFeatures>
184 </eClassifiers>
185 <eClassifiers xsi:type="ecore:EClass" name="ExpoDistribution">
186 <eStructuralFeatures xsi:type="ecore:EAttribute" name="lambda">
187 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
188 </eStructuralFeatures>
189 </eClassifiers>
190 <eClassifiers xsi:type="ecore:EClass" name="Action">
191 <eStructuralFeatures xsi:type="ecore:EAttribute" name="action">
192 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EString"/>
193 </eStructuralFeatures>
194 </eClassifiers>
195 <eClassifiers xsi:type="ecore:EClass" name="UnifDistribution">
196 <eStructuralFeatures xsi:type="ecore:EAttribute" name="a">
197 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
198 </eStructuralFeatures>
199 <eStructuralFeatures xsi:type="ecore:EAttribute" name="b">
200 <eType xsi:type="ecore:EDataType" href="http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
201 </eStructuralFeatures>
202 </eClassifiers>
203</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/out_d_rep/Sql.ecore
new file mode 100644
index 00000000..65d72135
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore
@@ -0,0 +1,549 @@
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="sql" nsURI="http://www.com.jaspersoft.studio.data.Sql" nsPrefix="sql">
4 <eClassifiers xsi:type="ecore:EClass" name="Model">
5 <eStructuralFeatures xsi:type="ecore:EReference" name="wq" eType="#//WithQuery"
6 containment="true"/>
7 <eStructuralFeatures xsi:type="ecore:EReference" name="query" eType="#//SelectQuery"
8 containment="true"/>
9 </eClassifiers>
10 <eClassifiers xsi:type="ecore:EClass" name="WithQuery">
11 <eStructuralFeatures xsi:type="ecore:EAttribute" name="w" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
12 <eStructuralFeatures xsi:type="ecore:EAttribute" name="wname" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
13 <eStructuralFeatures xsi:type="ecore:EReference" name="withCols" eType="#//WithColumns"
14 containment="true"/>
15 <eStructuralFeatures xsi:type="ecore:EReference" name="query" eType="#//SelectQuery"
16 containment="true"/>
17 </eClassifiers>
18 <eClassifiers xsi:type="ecore:EClass" name="WithColumns"/>
19 <eClassifiers xsi:type="ecore:EClass" name="FetchFirst">
20 <eStructuralFeatures xsi:type="ecore:EReference" name="fetchFirst" eType="#//UnsignedValue"
21 containment="true"/>
22 <eStructuralFeatures xsi:type="ecore:EAttribute" name="row" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
23 </eClassifiers>
24 <eClassifiers xsi:type="ecore:EClass" name="Offset">
25 <eStructuralFeatures xsi:type="ecore:EAttribute" name="offset" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
26 </eClassifiers>
27 <eClassifiers xsi:type="ecore:EClass" name="Limit">
28 <eStructuralFeatures xsi:type="ecore:EAttribute" name="l1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
29 <eStructuralFeatures xsi:type="ecore:EAttribute" name="l2" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
30 </eClassifiers>
31 <eClassifiers xsi:type="ecore:EClass" name="SelectQuery"/>
32 <eClassifiers xsi:type="ecore:EClass" name="SelectSubSet">
33 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
34 <eStructuralFeatures xsi:type="ecore:EAttribute" name="all" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
35 <eStructuralFeatures xsi:type="ecore:EReference" name="query" eType="#//Select"
36 containment="true"/>
37 </eClassifiers>
38 <eClassifiers xsi:type="ecore:EClass" name="Select" eSuperTypes="#//SelectQuery">
39 <eStructuralFeatures xsi:type="ecore:EReference" name="op" upperBound="-1" eType="#//SelectSubSet"
40 containment="true"/>
41 <eStructuralFeatures xsi:type="ecore:EAttribute" name="select" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
42 <eStructuralFeatures xsi:type="ecore:EReference" name="cols" eType="#//OrColumn"
43 containment="true"/>
44 <eStructuralFeatures xsi:type="ecore:EReference" name="tbl" eType="#//OrTable"
45 containment="true"/>
46 <eStructuralFeatures xsi:type="ecore:EReference" name="whereExpression" eType="#//OrExpr"
47 containment="true"/>
48 <eStructuralFeatures xsi:type="ecore:EReference" name="groupByEntry" eType="#//OrGroupByColumn"
49 containment="true"/>
50 <eStructuralFeatures xsi:type="ecore:EReference" name="havingEntry" eType="#//OrExpr"
51 containment="true"/>
52 <eStructuralFeatures xsi:type="ecore:EReference" name="orderByEntry" eType="#//OrOrderByColumn"
53 containment="true"/>
54 <eStructuralFeatures xsi:type="ecore:EReference" name="lim" eType="#//Limit" containment="true"/>
55 <eStructuralFeatures xsi:type="ecore:EReference" name="offset" eType="#//Offset"
56 containment="true"/>
57 <eStructuralFeatures xsi:type="ecore:EReference" name="fetchFirst" eType="#//FetchFirst"
58 containment="true"/>
59 </eClassifiers>
60 <eClassifiers xsi:type="ecore:EClass" name="OrColumn" eSuperTypes="#//PivotForClause">
61 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
62 eType="#//ColumnOrAlias" containment="true"/>
63 </eClassifiers>
64 <eClassifiers xsi:type="ecore:EClass" name="ColumnOrAlias" eSuperTypes="#//OrColumn">
65 <eStructuralFeatures xsi:type="ecore:EReference" name="ce" eType="#//Operands"
66 containment="true"/>
67 <eStructuralFeatures xsi:type="ecore:EAttribute" name="alias" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
68 <eStructuralFeatures xsi:type="ecore:EReference" name="colAlias" eType="#//DbObjectName"
69 containment="true"/>
70 <eStructuralFeatures xsi:type="ecore:EAttribute" name="allCols" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
71 <eStructuralFeatures xsi:type="ecore:EReference" name="dbAllCols" eType="#//DbObjectNameAll"
72 containment="true"/>
73 </eClassifiers>
74 <eClassifiers xsi:type="ecore:EClass" name="ColumnFull" eSuperTypes="#//PivotForClause"/>
75 <eClassifiers xsi:type="ecore:EClass" name="OrTable">
76 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
77 eType="#//FromTable" containment="true"/>
78 </eClassifiers>
79 <eClassifiers xsi:type="ecore:EClass" name="FromTable" eSuperTypes="#//OrTable">
80 <eStructuralFeatures xsi:type="ecore:EReference" name="table" eType="#//TableOrAlias"
81 containment="true"/>
82 <eStructuralFeatures xsi:type="ecore:EReference" name="fjoin" upperBound="-1"
83 eType="#//FromTableJoin" containment="true"/>
84 </eClassifiers>
85 <eClassifiers xsi:type="ecore:EClass" name="FromTableJoin">
86 <eStructuralFeatures xsi:type="ecore:EAttribute" name="join" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
87 <eStructuralFeatures xsi:type="ecore:EReference" name="onTable" eType="#//TableOrAlias"
88 containment="true"/>
89 <eStructuralFeatures xsi:type="ecore:EReference" name="joinExpr" eType="#//OrExpr"
90 containment="true"/>
91 <eStructuralFeatures xsi:type="ecore:EReference" name="joinCond" eType="#//JoinCondition"
92 containment="true"/>
93 </eClassifiers>
94 <eClassifiers xsi:type="ecore:EClass" name="JoinCondition">
95 <eStructuralFeatures xsi:type="ecore:EReference" name="useCols" eType="#//UsingCols"
96 containment="true"/>
97 </eClassifiers>
98 <eClassifiers xsi:type="ecore:EClass" name="UsingCols" eSuperTypes="#//WithColumns">
99 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
100 eType="#//DbObjectName" containment="true"/>
101 </eClassifiers>
102 <eClassifiers xsi:type="ecore:EClass" name="TableOrAlias">
103 <eStructuralFeatures xsi:type="ecore:EReference" name="tfull" eType="#//TableFull"
104 containment="true"/>
105 <eStructuralFeatures xsi:type="ecore:EReference" name="sq" eType="#//SubQueryOperand"
106 containment="true"/>
107 <eStructuralFeatures xsi:type="ecore:EReference" name="values" eType="#//FromValues"
108 containment="true"/>
109 <eStructuralFeatures xsi:type="ecore:EReference" name="pivot" eType="#//PivotTable"
110 containment="true"/>
111 <eStructuralFeatures xsi:type="ecore:EReference" name="unpivot" eType="#//UnpivotTable"
112 containment="true"/>
113 <eStructuralFeatures xsi:type="ecore:EAttribute" name="alias" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
114 <eStructuralFeatures xsi:type="ecore:EReference" name="tblAlias" eType="#//DbObjectName"
115 containment="true"/>
116 </eClassifiers>
117 <eClassifiers xsi:type="ecore:EClass" name="FromValues">
118 <eStructuralFeatures xsi:type="ecore:EReference" name="values" eType="#//Values"
119 containment="true"/>
120 <eStructuralFeatures xsi:type="ecore:EReference" name="c" eType="#//FromValuesColumns"
121 containment="true"/>
122 </eClassifiers>
123 <eClassifiers xsi:type="ecore:EClass" name="FromValuesColumns">
124 <eStructuralFeatures xsi:type="ecore:EReference" name="fvCols" eType="#//FromValuesColumnNames"
125 containment="true"/>
126 </eClassifiers>
127 <eClassifiers xsi:type="ecore:EClass" name="FromValuesColumnNames"/>
128 <eClassifiers xsi:type="ecore:EClass" name="ColumnNames" eSuperTypes="#//FromValuesColumnNames">
129 <eStructuralFeatures xsi:type="ecore:EAttribute" name="colName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
130 </eClassifiers>
131 <eClassifiers xsi:type="ecore:EClass" name="Values">
132 <eStructuralFeatures xsi:type="ecore:EReference" name="rows" eType="#//Rows" containment="true"/>
133 </eClassifiers>
134 <eClassifiers xsi:type="ecore:EClass" name="Rows">
135 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
136 eType="#//Row" containment="true"/>
137 </eClassifiers>
138 <eClassifiers xsi:type="ecore:EClass" name="Row" eSuperTypes="#//Rows">
139 <eStructuralFeatures xsi:type="ecore:EReference" name="rowValues" eType="#//RowValues"
140 containment="true"/>
141 </eClassifiers>
142 <eClassifiers xsi:type="ecore:EClass" name="RowValues">
143 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
144 eType="#//RowValue" containment="true"/>
145 </eClassifiers>
146 <eClassifiers xsi:type="ecore:EClass" name="RowValue" eSuperTypes="#//RowValues">
147 <eStructuralFeatures xsi:type="ecore:EAttribute" name="null" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
148 </eClassifiers>
149 <eClassifiers xsi:type="ecore:EClass" name="PivotTable">
150 <eStructuralFeatures xsi:type="ecore:EReference" name="pfun" eType="#//PivotFunctions"
151 containment="true"/>
152 <eStructuralFeatures xsi:type="ecore:EReference" name="pfor" eType="#//PivotForClause"
153 containment="true"/>
154 <eStructuralFeatures xsi:type="ecore:EReference" name="pin" eType="#//PivotInClause"
155 containment="true"/>
156 </eClassifiers>
157 <eClassifiers xsi:type="ecore:EClass" name="PivotFunctions">
158 <eStructuralFeatures xsi:type="ecore:EAttribute" name="abc" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
159 </eClassifiers>
160 <eClassifiers xsi:type="ecore:EClass" name="PivotFunction"/>
161 <eClassifiers xsi:type="ecore:EClass" name="PivotInClause">
162 <eStructuralFeatures xsi:type="ecore:EReference" name="sq" eType="#//SubQueryOperand"
163 containment="true"/>
164 <eStructuralFeatures xsi:type="ecore:EReference" name="args" eType="#//UnpivotInClauseArgs"
165 containment="true"/>
166 <eStructuralFeatures xsi:type="ecore:EAttribute" name="pinany" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
167 </eClassifiers>
168 <eClassifiers xsi:type="ecore:EClass" name="UnpivotTable">
169 <eStructuralFeatures xsi:type="ecore:EReference" name="pcols" eType="#//PivotColumns"
170 containment="true"/>
171 <eStructuralFeatures xsi:type="ecore:EReference" name="pfor" eType="#//PivotForClause"
172 containment="true"/>
173 <eStructuralFeatures xsi:type="ecore:EReference" name="inop" eType="#//UnpivotInClause"
174 containment="true"/>
175 </eClassifiers>
176 <eClassifiers xsi:type="ecore:EClass" name="UnpivotInClause"/>
177 <eClassifiers xsi:type="ecore:EClass" name="UnpivotInClauseArgs"/>
178 <eClassifiers xsi:type="ecore:EClass" name="UnpivotInClauseArg" eSuperTypes="#//UnpivotInClauseArgs">
179 <eStructuralFeatures xsi:type="ecore:EReference" name="pcols" eType="#//PivotColumns"
180 containment="true"/>
181 <eStructuralFeatures xsi:type="ecore:EReference" name="cfuls" eType="#//PivotColumns"
182 containment="true"/>
183 </eClassifiers>
184 <eClassifiers xsi:type="ecore:EClass" name="PivotForClause"/>
185 <eClassifiers xsi:type="ecore:EClass" name="PivotColumns"/>
186 <eClassifiers xsi:type="ecore:EClass" name="Pivots" eSuperTypes="#//PivotColumns"/>
187 <eClassifiers xsi:type="ecore:EClass" name="PivotCol" eSuperTypes="#//PivotFunction #//PivotColumns #//Pivots"/>
188 <eClassifiers xsi:type="ecore:EClass" name="TableFull"/>
189 <eClassifiers xsi:type="ecore:EClass" name="DbObjectNameAll">
190 <eStructuralFeatures xsi:type="ecore:EAttribute" name="dbname" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
191 </eClassifiers>
192 <eClassifiers xsi:type="ecore:EClass" name="DbObjectName" eSuperTypes="#//ColumnFull #//UsingCols #//PivotCol #//TableFull">
193 <eStructuralFeatures xsi:type="ecore:EAttribute" name="dbname" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
194 </eClassifiers>
195 <eClassifiers xsi:type="ecore:EClass" name="OrOrderByColumn">
196 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
197 eType="#//OrderByColumnFull" containment="true"/>
198 </eClassifiers>
199 <eClassifiers xsi:type="ecore:EClass" name="OrderByColumnFull" eSuperTypes="#//OrOrderByColumn">
200 <eStructuralFeatures xsi:type="ecore:EReference" name="colOrder" eType="#//ColumnFull"
201 containment="true"/>
202 <eStructuralFeatures xsi:type="ecore:EAttribute" name="colOrderInt" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
203 <eStructuralFeatures xsi:type="ecore:EAttribute" name="direction" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
204 </eClassifiers>
205 <eClassifiers xsi:type="ecore:EClass" name="OrGroupByColumn">
206 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
207 eType="#//GroupByColumnFull" containment="true"/>
208 </eClassifiers>
209 <eClassifiers xsi:type="ecore:EClass" name="GroupByColumnFull" eSuperTypes="#//OrGroupByColumn">
210 <eStructuralFeatures xsi:type="ecore:EReference" name="colGrBy" eType="#//ColumnFull"
211 containment="true"/>
212 <eStructuralFeatures xsi:type="ecore:EReference" name="gbFunction" eType="#//OpFunction"
213 containment="true"/>
214 <eStructuralFeatures xsi:type="ecore:EAttribute" name="grByInt" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
215 </eClassifiers>
216 <eClassifiers xsi:type="ecore:EClass" name="OrExpr">
217 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
218 eType="#//FullExpression" containment="true"/>
219 </eClassifiers>
220 <eClassifiers xsi:type="ecore:EClass" name="FullExpression" eSuperTypes="#//OrExpr">
221 <eStructuralFeatures xsi:type="ecore:EAttribute" name="c" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
222 <eStructuralFeatures xsi:type="ecore:EReference" name="efrag" eType="#//FullExpression"
223 containment="true"/>
224 <eStructuralFeatures xsi:type="ecore:EAttribute" name="notPrm" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
225 <eStructuralFeatures xsi:type="ecore:EReference" name="expgroup" eType="#//ExprGroup"
226 containment="true"/>
227 <eStructuralFeatures xsi:type="ecore:EReference" name="exp" eType="#//FullExpression"
228 containment="true"/>
229 <eStructuralFeatures xsi:type="ecore:EReference" name="xexp" eType="#//XExpr"
230 containment="true"/>
231 <eStructuralFeatures xsi:type="ecore:EReference" name="in" eType="#//InOper" containment="true"/>
232 <eStructuralFeatures xsi:type="ecore:EReference" name="exists" eType="#//ExistsOper"
233 containment="true"/>
234 <eStructuralFeatures xsi:type="ecore:EReference" name="op1" eType="#//Operands"
235 containment="true"/>
236 <eStructuralFeatures xsi:type="ecore:EAttribute" name="isnull" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
237 <eStructuralFeatures xsi:type="ecore:EReference" name="between" eType="#//Between"
238 containment="true"/>
239 <eStructuralFeatures xsi:type="ecore:EReference" name="like" eType="#//Like" containment="true"/>
240 <eStructuralFeatures xsi:type="ecore:EReference" name="comp" eType="#//Comparison"
241 containment="true"/>
242 </eClassifiers>
243 <eClassifiers xsi:type="ecore:EClass" name="ExprGroup">
244 <eStructuralFeatures xsi:type="ecore:EAttribute" name="isnot" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
245 <eStructuralFeatures xsi:type="ecore:EReference" name="expr" eType="#//OrExpr"
246 containment="true"/>
247 </eClassifiers>
248 <eClassifiers xsi:type="ecore:EClass" name="XExpr">
249 <eStructuralFeatures xsi:type="ecore:EAttribute" name="xf" eType="#//XFunction"/>
250 <eStructuralFeatures xsi:type="ecore:EReference" name="col" eType="#//Operands"
251 containment="true"/>
252 <eStructuralFeatures xsi:type="ecore:EReference" name="prm" eType="#//Prms" containment="true"/>
253 </eClassifiers>
254 <eClassifiers xsi:type="ecore:EEnum" name="XFunction">
255 <eLiterals name="xin" literal="{IN"/>
256 <eLiterals name="xnotin" value="1" literal="{NOTIN"/>
257 <eLiterals name="xeq" value="2" literal="{EQUAL"/>
258 <eLiterals name="xnoteq" value="3" literal="{NOTEQUAL"/>
259 <eLiterals name="xls" value="4" literal="{LESS"/>
260 <eLiterals name="xlsr" value="5" literal="{LESS]"/>
261 <eLiterals name="xgtl" value="6" literal="{[GREATER"/>
262 <eLiterals name="xgt" value="7" literal="{GREATER"/>
263 <eLiterals name="xbwn" value="8" literal="{BETWEEN"/>
264 <eLiterals name="xbwnc" value="9" literal="{[BETWEEN]"/>
265 <eLiterals name="xbwnl" value="10" literal="{[BETWEEN"/>
266 <eLiterals name="xbwnr" value="11" literal="{BETWEEN]"/>
267 </eClassifiers>
268 <eClassifiers xsi:type="ecore:EClass" name="Prms">
269 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
270 eType="#//JRParameter" containment="true"/>
271 </eClassifiers>
272 <eClassifiers xsi:type="ecore:EClass" name="JRParameter" eSuperTypes="#//Prms">
273 <eStructuralFeatures xsi:type="ecore:EAttribute" name="jrprm" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
274 </eClassifiers>
275 <eClassifiers xsi:type="ecore:EClass" name="Comparison">
276 <eStructuralFeatures xsi:type="ecore:EAttribute" name="operator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
277 <eStructuralFeatures xsi:type="ecore:EAttribute" name="subOperator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
278 <eStructuralFeatures xsi:type="ecore:EReference" name="op2" eType="#//Operands"
279 containment="true"/>
280 </eClassifiers>
281 <eClassifiers xsi:type="ecore:EClass" name="Like">
282 <eStructuralFeatures xsi:type="ecore:EAttribute" name="opLike" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
283 <eStructuralFeatures xsi:type="ecore:EReference" name="op2" eType="#//LikeOperand"
284 containment="true"/>
285 </eClassifiers>
286 <eClassifiers xsi:type="ecore:EClass" name="LikeOperand">
287 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op2" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
288 <eStructuralFeatures xsi:type="ecore:EReference" name="fop2" eType="#//OpFunction"
289 containment="true"/>
290 <eStructuralFeatures xsi:type="ecore:EReference" name="fcast" eType="#//OpFunctionCast"
291 containment="true"/>
292 <eStructuralFeatures xsi:type="ecore:EReference" name="fparam" eType="#//POperand"
293 containment="true"/>
294 </eClassifiers>
295 <eClassifiers xsi:type="ecore:EClass" name="Between">
296 <eStructuralFeatures xsi:type="ecore:EAttribute" name="opBetween" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
297 <eStructuralFeatures xsi:type="ecore:EReference" name="op2" eType="#//Operands"
298 containment="true"/>
299 <eStructuralFeatures xsi:type="ecore:EReference" name="op3" eType="#//Operands"
300 containment="true"/>
301 </eClassifiers>
302 <eClassifiers xsi:type="ecore:EClass" name="InOper">
303 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
304 <eStructuralFeatures xsi:type="ecore:EReference" name="subquery" eType="#//SubQueryOperand"
305 containment="true"/>
306 <eStructuralFeatures xsi:type="ecore:EReference" name="opList" eType="#//OperandListGroup"
307 containment="true"/>
308 </eClassifiers>
309 <eClassifiers xsi:type="ecore:EClass" name="ExistsOper">
310 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
311 <eStructuralFeatures xsi:type="ecore:EReference" name="subquery" eType="#//SubQueryOperand"
312 containment="true"/>
313 <eStructuralFeatures xsi:type="ecore:EReference" name="opList" eType="#//OperandListGroup"
314 containment="true"/>
315 </eClassifiers>
316 <eClassifiers xsi:type="ecore:EClass" name="OperandListGroup">
317 <eStructuralFeatures xsi:type="ecore:EReference" name="opGroup" eType="#//OperandList"
318 containment="true"/>
319 </eClassifiers>
320 <eClassifiers xsi:type="ecore:EClass" name="OperandList"/>
321 <eClassifiers xsi:type="ecore:EClass" name="Operands" eSuperTypes="#//OpFunctionArgAgregate">
322 <eStructuralFeatures xsi:type="ecore:EReference" name="op1" eType="#//Operand"
323 containment="true"/>
324 <eStructuralFeatures xsi:type="ecore:EReference" name="left" eType="#//Operands"
325 containment="true"/>
326 <eStructuralFeatures xsi:type="ecore:EReference" name="right" eType="#//Operand"
327 containment="true"/>
328 </eClassifiers>
329 <eClassifiers xsi:type="ecore:EClass" name="Operand">
330 <eStructuralFeatures xsi:type="ecore:EReference" name="column" eType="#//ColumnOperand"
331 containment="true"/>
332 <eStructuralFeatures xsi:type="ecore:EReference" name="xop" eType="#//Operand"
333 containment="true"/>
334 <eStructuralFeatures xsi:type="ecore:EReference" name="subq" eType="#//SubQueryOperand"
335 containment="true"/>
336 <eStructuralFeatures xsi:type="ecore:EReference" name="fcast" eType="#//OpFunctionCast"
337 containment="true"/>
338 <eStructuralFeatures xsi:type="ecore:EReference" name="fext" eType="#//FunctionExtract"
339 containment="true"/>
340 <eStructuralFeatures xsi:type="ecore:EReference" name="func" eType="#//OpFunction"
341 containment="true"/>
342 <eStructuralFeatures xsi:type="ecore:EReference" name="sqlcase" eType="#//SQLCaseOperand"
343 containment="true"/>
344 <eStructuralFeatures xsi:type="ecore:EReference" name="param" eType="#//POperand"
345 containment="true"/>
346 <eStructuralFeatures xsi:type="ecore:EReference" name="eparam" eType="#//ExpOperand"
347 containment="true"/>
348 <eStructuralFeatures xsi:type="ecore:EReference" name="scalar" eType="#//ScalarOperand"
349 containment="true"/>
350 </eClassifiers>
351 <eClassifiers xsi:type="ecore:EClass" name="OpFunction">
352 <eStructuralFeatures xsi:type="ecore:EAttribute" name="fname" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
353 <eStructuralFeatures xsi:type="ecore:EAttribute" name="star" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
354 <eStructuralFeatures xsi:type="ecore:EReference" name="args" eType="#//OpFunctionArg"
355 containment="true"/>
356 <eStructuralFeatures xsi:type="ecore:EReference" name="fan" eType="#//FunctionAnalytical"
357 containment="true"/>
358 </eClassifiers>
359 <eClassifiers xsi:type="ecore:EClass" name="FunctionExtract">
360 <eStructuralFeatures xsi:type="ecore:EAttribute" name="v" eType="#//EXTRACT_VALUES"/>
361 <eStructuralFeatures xsi:type="ecore:EReference" name="operand" eType="#//Operands"
362 containment="true"/>
363 </eClassifiers>
364 <eClassifiers xsi:type="ecore:EClass" name="FunctionAnalytical">
365 <eStructuralFeatures xsi:type="ecore:EReference" name="anClause" eType="#//AnalyticClause"
366 containment="true"/>
367 </eClassifiers>
368 <eClassifiers xsi:type="ecore:EClass" name="AnalyticClause">
369 <eStructuralFeatures xsi:type="ecore:EReference" name="abc" eType="#//QueryPartitionClause"
370 containment="true"/>
371 <eStructuralFeatures xsi:type="ecore:EReference" name="obc" eType="#//OrderByClause"
372 containment="true"/>
373 <eStructuralFeatures xsi:type="ecore:EReference" name="winc" eType="#//WindowingClause"
374 containment="true"/>
375 </eClassifiers>
376 <eClassifiers xsi:type="ecore:EClass" name="WindowingClause"/>
377 <eClassifiers xsi:type="ecore:EClass" name="WindowingClauseBetween" eSuperTypes="#//WindowingClause">
378 <eStructuralFeatures xsi:type="ecore:EReference" name="wcoP" eType="#//WindowingClauseOperandPreceding"
379 containment="true"/>
380 <eStructuralFeatures xsi:type="ecore:EReference" name="wcoF" eType="#//WindowingClauseOperandFollowing"
381 containment="true"/>
382 </eClassifiers>
383 <eClassifiers xsi:type="ecore:EClass" name="WindowingClauseOperandFollowing">
384 <eStructuralFeatures xsi:type="ecore:EReference" name="exp" eType="#//AnalyticExprArg"
385 containment="true"/>
386 </eClassifiers>
387 <eClassifiers xsi:type="ecore:EClass" name="WindowingClauseOperandPreceding" eSuperTypes="#//WindowingClause">
388 <eStructuralFeatures xsi:type="ecore:EReference" name="expr" eType="#//AnalyticExprArg"
389 containment="true"/>
390 </eClassifiers>
391 <eClassifiers xsi:type="ecore:EClass" name="OrderByClause">
392 <eStructuralFeatures xsi:type="ecore:EReference" name="args" eType="#//OrderByClauseArgs"
393 containment="true"/>
394 </eClassifiers>
395 <eClassifiers xsi:type="ecore:EClass" name="OrderByClauseArgs"/>
396 <eClassifiers xsi:type="ecore:EClass" name="OrderByClauseArg" eSuperTypes="#//OrderByClauseArgs">
397 <eStructuralFeatures xsi:type="ecore:EReference" name="col" eType="#//AnalyticExprArg"
398 containment="true"/>
399 </eClassifiers>
400 <eClassifiers xsi:type="ecore:EClass" name="QueryPartitionClause">
401 <eStructuralFeatures xsi:type="ecore:EReference" name="args" eType="#//AnalyticExprArgs"
402 containment="true"/>
403 </eClassifiers>
404 <eClassifiers xsi:type="ecore:EClass" name="AnalyticExprArgs" eSuperTypes="#//QueryPartitionClause"/>
405 <eClassifiers xsi:type="ecore:EClass" name="AnalyticExprArg" eSuperTypes="#//AnalyticExprArgs">
406 <eStructuralFeatures xsi:type="ecore:EReference" name="ce" eType="#//Operands"
407 containment="true"/>
408 <eStructuralFeatures xsi:type="ecore:EReference" name="colAlias" eType="#//DbObjectName"
409 containment="true"/>
410 </eClassifiers>
411 <eClassifiers xsi:type="ecore:EClass" name="OpFunctionArg"/>
412 <eClassifiers xsi:type="ecore:EClass" name="OpFunctionArgOperand" eSuperTypes="#//OpFunctionArg">
413 <eStructuralFeatures xsi:type="ecore:EReference" name="op" eType="#//OpFunctionArgAgregate"
414 containment="true"/>
415 </eClassifiers>
416 <eClassifiers xsi:type="ecore:EClass" name="OpFunctionCast">
417 <eStructuralFeatures xsi:type="ecore:EReference" name="op" eType="#//Operands"
418 containment="true"/>
419 <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
420 <eStructuralFeatures xsi:type="ecore:EAttribute" name="p" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
421 <eStructuralFeatures xsi:type="ecore:EAttribute" name="p2" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
422 </eClassifiers>
423 <eClassifiers xsi:type="ecore:EClass" name="OpFunctionArgAgregate"/>
424 <eClassifiers xsi:type="ecore:EClass" name="POperand">
425 <eStructuralFeatures xsi:type="ecore:EAttribute" name="prm" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
426 </eClassifiers>
427 <eClassifiers xsi:type="ecore:EClass" name="ExpOperand">
428 <eStructuralFeatures xsi:type="ecore:EAttribute" name="prm" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
429 </eClassifiers>
430 <eClassifiers xsi:type="ecore:EClass" name="ColumnOperand">
431 <eStructuralFeatures xsi:type="ecore:EReference" name="cfull" eType="#//ColumnFull"
432 containment="true"/>
433 <eStructuralFeatures xsi:type="ecore:EAttribute" name="ora" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
434 </eClassifiers>
435 <eClassifiers xsi:type="ecore:EClass" name="SubQueryOperand">
436 <eStructuralFeatures xsi:type="ecore:EReference" name="sel" eType="#//SelectQuery"
437 containment="true"/>
438 </eClassifiers>
439 <eClassifiers xsi:type="ecore:EClass" name="ScalarOperand" eSuperTypes="#//RowValue #//OperandList">
440 <eStructuralFeatures xsi:type="ecore:EAttribute" name="sostr" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
441 <eStructuralFeatures xsi:type="ecore:EAttribute" name="sodbl" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBigDecimal"/>
442 <eStructuralFeatures xsi:type="ecore:EAttribute" name="sodate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
443 <eStructuralFeatures xsi:type="ecore:EAttribute" name="sotime" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
444 <eStructuralFeatures xsi:type="ecore:EAttribute" name="sodt" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
445 <eStructuralFeatures xsi:type="ecore:EAttribute" name="soUInt" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
446 <eStructuralFeatures xsi:type="ecore:EAttribute" name="soint" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
447 </eClassifiers>
448 <eClassifiers xsi:type="ecore:EClass" name="SQLCaseOperand">
449 <eStructuralFeatures xsi:type="ecore:EReference" name="wop" eType="#//Operands"
450 containment="true"/>
451 <eStructuralFeatures xsi:type="ecore:EReference" name="expr" eType="#//OrExpr"
452 containment="true"/>
453 <eStructuralFeatures xsi:type="ecore:EReference" name="when" eType="#//SQLCaseWhens"
454 containment="true"/>
455 </eClassifiers>
456 <eClassifiers xsi:type="ecore:EClass" name="SQLCaseWhens"/>
457 <eClassifiers xsi:type="ecore:EClass" name="SqlCaseWhen" eSuperTypes="#//SQLCaseWhens">
458 <eStructuralFeatures xsi:type="ecore:EReference" name="wop" eType="#//Operands"
459 containment="true"/>
460 <eStructuralFeatures xsi:type="ecore:EReference" name="expr" eType="#//OrExpr"
461 containment="true"/>
462 <eStructuralFeatures xsi:type="ecore:EReference" name="texp" eType="#//Operands"
463 containment="true"/>
464 <eStructuralFeatures xsi:type="ecore:EReference" name="eexp" eType="#//Operands"
465 containment="true"/>
466 </eClassifiers>
467 <eClassifiers xsi:type="ecore:EEnum" name="EXTRACT_VALUES">
468 <eLiterals name="ms" literal="MICROSECOND"/>
469 <eLiterals name="s" value="1" literal="SECOND"/>
470 <eLiterals name="m" value="2" literal="MINUTE"/>
471 <eLiterals name="h" value="3" literal="HOUR"/>
472 <eLiterals name="day" value="4" literal="DAY"/>
473 <eLiterals name="week" value="5" literal="WEEK"/>
474 <eLiterals name="month" value="6" literal="MONTH"/>
475 <eLiterals name="quart" value="7" literal="QUARTER"/>
476 <eLiterals name="year" value="8" literal="YEAR"/>
477 <eLiterals name="micros" value="9" literal="SECOND_MICROSECOND"/>
478 <eLiterals name="minMicro" value="10" literal="MINUTE_MICROSECOND"/>
479 <eLiterals name="minSec" value="11" literal="MINUTE_SECOND"/>
480 <eLiterals name="hms" value="12" literal="HOUR_MICROSECOND"/>
481 <eLiterals name="hs" value="13" literal="HOUR_SECOND"/>
482 <eLiterals name="hmin" value="14" literal="HOUR_MINUTE"/>
483 <eLiterals name="dms" value="15" literal="DAY_MICROSECOND"/>
484 <eLiterals name="ds" value="16" literal="DAY_SECOND"/>
485 <eLiterals name="daymin" value="17" literal="DAY_MINUTE"/>
486 <eLiterals name="dayh" value="18" literal="DAY_HOUR"/>
487 <eLiterals name="yearMonth" value="19" literal="YEAR_MONTH"/>
488 </eClassifiers>
489 <eClassifiers xsi:type="ecore:EClass" name="IntegerValue">
490 <eStructuralFeatures xsi:type="ecore:EAttribute" name="integer" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
491 </eClassifiers>
492 <eClassifiers xsi:type="ecore:EClass" name="UnsignedValue">
493 <eStructuralFeatures xsi:type="ecore:EAttribute" name="integer" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELongObject"/>
494 </eClassifiers>
495 <eClassifiers xsi:type="ecore:EClass" name="Col" eSuperTypes="#//ColumnFull">
496 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
497 eType="#//DbObjectName" containment="true"/>
498 </eClassifiers>
499 <eClassifiers xsi:type="ecore:EClass" name="abc" eSuperTypes="#//FromValuesColumnNames">
500 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
501 eType="#//ColumnNames" containment="true"/>
502 </eClassifiers>
503 <eClassifiers xsi:type="ecore:EClass" name="UnipivotInClause" eSuperTypes="#//UnpivotInClause">
504 <eStructuralFeatures xsi:type="ecore:EAttribute" name="op" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
505 <eStructuralFeatures xsi:type="ecore:EReference" name="args" eType="#//UnpivotInClauseArgs"
506 containment="true"/>
507 </eClassifiers>
508 <eClassifiers xsi:type="ecore:EClass" name="uicargs" eSuperTypes="#//UnpivotInClauseArgs">
509 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
510 eType="#//UnpivotInClauseArg" containment="true"/>
511 </eClassifiers>
512 <eClassifiers xsi:type="ecore:EClass" name="pvcs" eSuperTypes="#//Pivots">
513 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
514 eType="#//PivotCol" containment="true"/>
515 </eClassifiers>
516 <eClassifiers xsi:type="ecore:EClass" name="pcols" eSuperTypes="#//PivotCol">
517 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
518 eType="#//DbObjectName" containment="true"/>
519 </eClassifiers>
520 <eClassifiers xsi:type="ecore:EClass" name="tbls" eSuperTypes="#//TableFull">
521 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
522 eType="#//DbObjectName" containment="true"/>
523 </eClassifiers>
524 <eClassifiers xsi:type="ecore:EClass" name="OpList" eSuperTypes="#//OperandList">
525 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
526 eType="#//ScalarOperand" containment="true"/>
527 </eClassifiers>
528 <eClassifiers xsi:type="ecore:EClass" name="Plus" eSuperTypes="#//Operands"/>
529 <eClassifiers xsi:type="ecore:EClass" name="Minus" eSuperTypes="#//Operands"/>
530 <eClassifiers xsi:type="ecore:EClass" name="Concat" eSuperTypes="#//Operands"/>
531 <eClassifiers xsi:type="ecore:EClass" name="Multiply" eSuperTypes="#//Operands"/>
532 <eClassifiers xsi:type="ecore:EClass" name="Division" eSuperTypes="#//Operands"/>
533 <eClassifiers xsi:type="ecore:EClass" name="OBCArgs" eSuperTypes="#//OrderByClauseArgs">
534 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
535 eType="#//OrderByClauseArg" containment="true"/>
536 </eClassifiers>
537 <eClassifiers xsi:type="ecore:EClass" name="AExpArgs" eSuperTypes="#//AnalyticExprArgs">
538 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
539 eType="#//AnalyticExprArg" containment="true"/>
540 </eClassifiers>
541 <eClassifiers xsi:type="ecore:EClass" name="OpFList" eSuperTypes="#//OpFunctionArg">
542 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
543 eType="#//OpFunctionArgOperand" containment="true"/>
544 </eClassifiers>
545 <eClassifiers xsi:type="ecore:EClass" name="WhenList" eSuperTypes="#//SQLCaseWhens">
546 <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
547 eType="#//SqlCaseWhen" containment="true"/>
548 </eClassifiers>
549</ecore:EPackage>
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep.csv b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/mpc_rep.csv
index fc39ac54..fc39ac54 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep.csv
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/mpc_rep.csv
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/mpc_rep/R_2016324.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/mpc_rep/R_2016324.xmi
index 493a1731..493a1731 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/mpc_rep/R_2016324.xmi
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/mpc_rep/R_2016324.xmi
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep.csv b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/na_rep.csv
index 43d411e4..43d411e4 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep.csv
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/na_rep.csv
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/na_rep/R_2017419.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/na_rep/R_2017419.xmi
index 369760bf..369760bf 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/na_rep/R_2017419.xmi
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/na_rep/R_2017419.xmi
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2015194.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/mpc_rep/R_2015194.xmi
index 25ff5ce0..25ff5ce0 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/mpc_rep/R_2015194.xmi
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/mpc_rep/R_2015194.xmi
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017131.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/na_rep/R_2017131.xmi
index 39780f72..39780f72 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/na_rep/R_2017131.xmi
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/na_rep/R_2017131.xmi
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015248.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/out_d_rep/R_2015248.xmi
index e7fe8114..e7fe8114 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep/R_2015248.xmi
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/new/out_d_rep/R_2015248.xmi
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep.csv b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/out_d_rep.csv
index 17965018..17965018 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/out_d_rep.csv
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/out_d_rep.csv
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/out_d_rep/R_2015225.xmi b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/out_d_rep/R_2015225.xmi
index 21fee5a9..21fee5a9 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakinduum/old/out_d_rep/R_2015225.xmi
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Yakindumm/out_d_rep/R_2015225.xmi
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt
new file mode 100644
index 00000000..e4925b3c
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt
@@ -0,0 +1,13 @@
1Error occured (IllegalArgumentException): Class EObject is not translated to logic!
2 hu.bme.mit.inf.dslreasoner.ecore2logic.EClassMapper_AllElementAsObject.TypeofEClass(EClassMapper_AllElementAsObject.java:63)
3 hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes.createIndicatorDeclarations(EReferenceMapper_RelationsOverTypes.java:88)
4 hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes.transformEReferences(EReferenceMapper_RelationsOverTypes.java:67)
5 hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic.transformEReferences(Ecore2Logic.java:120)
6 hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic.transformMetamodel(Ecore2Logic.java:81)
7 hu.bme.mit.inf.dslreasoner.application.execution.GenerationTaskExecutor.executeGenerationTask(GenerationTaskExecutor.java:189)
8 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)
10 hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.executeScript(ScriptExecutor.java:110)
11 hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor.executeScript(StandaloneScriptExecutor.java:149)
12 ca.mcgill.ecse.socialnetwork.runner.Main.runWithPath(Main.java:25)
13 ca.mcgill.ecse.socialnetwork.runner.Main.main(Main.java:38)
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig
index 2c83f94f..7da4f563 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig
@@ -1,4 +1,4 @@
1import viatra "./queries/queries/ecore_pattern.vql" 1import viatra "./queries/queries/Ecore.vql"
2import epackage "http://www.eclipse.org/emf/2002/Ecore" 2import epackage "http://www.eclipse.org/emf/2002/Ecore"
3 3
4generate { 4generate {
@@ -7,12 +7,20 @@ generate {
7 EStructuralFeature.derived, ENamedElement.name, EClass.interface, EClass.abstract, EClassifier.instanceTypeName, 7 EStructuralFeature.derived, ENamedElement.name, EClass.interface, EClass.abstract, EClassifier.instanceTypeName,
8 EClassifier.instanceClassName, EPackage.nsPrefix, EPackage.nsURI, EAnnotation.source, 8 EClassifier.instanceClassName, EPackage.nsPrefix, EPackage.nsURI, EAnnotation.source,
9 EAttribute.iD, EDataType.serializable, EEnumLiteral.literal, EEnumLiteral.value, 9 EAttribute.iD, EDataType.serializable, EEnumLiteral.literal, EEnumLiteral.value,
10 EGenericType.eTypeParameter, EReference.resolveProxies, EStringToStringMapEntry.key, 10 EReference.resolveProxies, EReference.container, EReference.containment, EStringToStringMapEntry.key,
11 EStringToStringMapEntry.value, EStructuralFeature.defaultValueLiteral, EStructuralFeature.transient, 11 EStringToStringMapEntry.value, EStructuralFeature.defaultValueLiteral, EStructuralFeature.transient,
12 EStructuralFeature.unsettable, EStructuralFeature.volatile, ETypedElement.lowerBound, 12 EStructuralFeature.unsettable, EStructuralFeature.volatile, ETypedElement.lowerBound,
13 ETypedElement.many, ETypedElement.ordered, ETypedElement.required, ETypedElement.unique,ETypedElement.upperBound, 13 ETypedElement.many, ETypedElement.ordered, ETypedElement.required, ETypedElement.unique,ETypedElement.upperBound,
14 EPackage.eFactoryInstance}} 14 // cannot generate eFactoryInstance
15// metamodel = {EPackage, EClass, EClassifier, EObject, ENamedElement, EModelElement, EReference, EStructuralFeature, ETypedElement} 15 EPackage.eFactoryInstance,
16 //Derived edges
17 EClass.eAllSuperTypes, EClass.eAllAttributes, EClass.eAllReferences, EClass.eAllContainments, EClass.eAllGenericSuperTypes,
18 EClass. eAllOperations, EClass.eAllStructuralFeatures, EClass.eAttributes, EClass.eIDAttribute, EClass.eReferences,
19 EAttribute.eAttributeType, EGenericType.eRawType, EReference.eReferenceType,
20 //Generic Types
21 EClass.eGenericSuperTypes, ETypedElement.eGenericType, EOperation.eGenericExceptions, EObject, EAnnotation.references, EAnnotation.contents
22
23 }}
16 partial-model = { "inputs/ecore.xmi"} 24 partial-model = { "inputs/ecore.xmi"}
17 constraints = { package queries } 25 constraints = { package queries }
18 26
@@ -20,13 +28,17 @@ generate {
20 solver = ViatraSolver 28 solver = ViatraSolver
21 29
22 scope = { 30 scope = {
23 #node = 75 31 #node = 100
24 } 32 }
25 33
26 number = 1 34 number = 1
27 runs = 50 35 runs = 1
28 config = { 36 config = {
29 log-level = none 37 log-level = none,
38 "optional-wf" = "true",
39 "realistic-guidance" = "Composite",
40 "allow-must-violations" = "true",
41 "domain" = "Ecore"
30 } 42 }
31 43
32 debug = "debug" 44 debug = "debug"
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml
index 6ac719c8..975fd574 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml
@@ -12,6 +12,15 @@
12 <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.friendship"/> 12 <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.friendship"/>
13 </group> 13 </group>
14 </extension> 14 </extension>
15 <extension id="queries.Ecore" point="org.eclipse.viatra.query.runtime.queryspecification">
16 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore" id="queries.Ecore">
17 <query-specification fqn="queries.directSupertype"/>
18 <query-specification fqn="queries.loopInInheritence"/>
19 <query-specification fqn="queries.opposite"/>
20 <query-specification fqn="queries.oppositeDifferentClass"/>
21 <query-specification fqn="queries.nonSymmetricOpposite"/>
22 </group>
23 </extension>
15 <extension id="queries.Ecore_pattern" point="org.eclipse.viatra.query.runtime.queryspecification"> 24 <extension id="queries.Ecore_pattern" point="org.eclipse.viatra.query.runtime.queryspecification">
16 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore_pattern" id="queries.Ecore_pattern"> 25 <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore_pattern" id="queries.Ecore_pattern">
17 <query-specification fqn="queries.sameSuperClass"/> 26 <query-specification fqn="queries.sameSuperClass"/>
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql
new file mode 100644
index 00000000..3b0e7fd9
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql
@@ -0,0 +1,29 @@
1package queries
2
3import epackage "http://www.eclipse.org/emf/2002/Ecore"
4
5pattern directSupertype(a: EClass, b:EClass) {
6 EClass.eSuperTypes(a,b);
7}
8
9@Constraint(key={a}, severity="error", message="error")
10pattern loopInInheritence(a: EClass) {
11 find directSupertype+(a,a);
12}
13
14pattern opposite(a:EReference, b: EReference) {
15 EReference.eOpposite(a,b);
16}
17@Constraint(key={a}, severity="error", message="error")
18pattern oppositeDifferentClass(a:EReference) {
19 EReference.eOpposite(a,b);
20 EReference.eContainingClass(a,aContaining);
21 EReference.eType(b,bTarget);
22 aContaining != bTarget;
23}
24
25@Constraint(key={a}, severity="error", message="error")
26pattern nonSymmetricOpposite(a:EReference, b:EReference) {
27 find opposite(a,b);
28 neg find opposite(b,a);
29} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore
index 121edf31..9ceca817 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore
@@ -1,3 +1,9 @@
1/.Ecore_pattern.java._trace 1/.Ecore_pattern.java._trace
2/.MultipleTransitionFromEntry.java._trace 2/.MultipleTransitionFromEntry.java._trace
3/.SameSuperClass.java._trace 3/.SameSuperClass.java._trace
4/.DirectSupertype.java._trace
5/.Ecore.java._trace
6/.LoopInInheritence.java._trace
7/.NonSymmetricOpposite.java._trace
8/.Opposite.java._trace
9/.OppositeDifferentClass.java._trace
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/DirectSupertype.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/DirectSupertype.java
new file mode 100644
index 00000000..003dbe3f
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/DirectSupertype.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 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 queries.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 "queries.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 queries.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: queries.DirectSupertype (visibility: PUBLIC, simpleName: DirectSupertype, identifier: queries.DirectSupertype, 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.DirectSupertype (visibility: PUBLIC, simpleName: DirectSupertype, identifier: queries.DirectSupertype, 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 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 "queries.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/SocialNetwork_plugin/src-gen/queries/Ecore.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java
new file mode 100644
index 00000000..e4f254d3
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java
@@ -0,0 +1,97 @@
1/**
2 * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/Ecore.vql
3 */
4package queries;
5
6import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine;
7import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup;
8import queries.DirectSupertype;
9import queries.LoopInInheritence;
10import queries.NonSymmetricOpposite;
11import queries.Opposite;
12import queries.OppositeDifferentClass;
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 queries, 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/LoopInInheritence.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/LoopInInheritence.java
new file mode 100644
index 00000000..18ef65f0
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/LoopInInheritence.java
@@ -0,0 +1,548 @@
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.basicenumerables.BinaryTransitiveClosure;
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;
40import queries.DirectSupertype;
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 queries.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 "queries.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 queries.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: queries.LoopInInheritence (visibility: PUBLIC, simpleName: LoopInInheritence, identifier: queries.LoopInInheritence, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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: queries.LoopInInheritence (visibility: PUBLIC, simpleName: LoopInInheritence, identifier: queries.LoopInInheritence, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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 "queries.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/SocialNetwork_plugin/src-gen/queries/NonSymmetricOpposite.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/NonSymmetricOpposite.java
new file mode 100644
index 00000000..cecbe2d8
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/NonSymmetricOpposite.java
@@ -0,0 +1,707 @@
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.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.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.basicdeferred.NegativePatternCall;
34import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall;
35import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint;
36import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter;
37import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection;
38import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility;
39import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple;
40import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples;
41import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil;
42import queries.Opposite;
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 queries.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 "queries.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 queries.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: queries.NonSymmetricOpposite (visibility: PUBLIC, simpleName: NonSymmetricOpposite, identifier: queries.NonSymmetricOpposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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: queries.NonSymmetricOpposite (visibility: PUBLIC, simpleName: NonSymmetricOpposite, identifier: queries.NonSymmetricOpposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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 "queries.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/SocialNetwork_plugin/src-gen/queries/Opposite.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Opposite.java
new file mode 100644
index 00000000..8c501b8e
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Opposite.java
@@ -0,0 +1,693 @@
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.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 queries.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 "queries.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 queries.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: queries.Opposite (visibility: PUBLIC, simpleName: Opposite, identifier: queries.Opposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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: queries.Opposite (visibility: PUBLIC, simpleName: Opposite, identifier: queries.Opposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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 "queries.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/SocialNetwork_plugin/src-gen/queries/OppositeDifferentClass.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/OppositeDifferentClass.java
new file mode 100644
index 00000000..05f3a312
--- /dev/null
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/OppositeDifferentClass.java
@@ -0,0 +1,577 @@
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.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 queries.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 "queries.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 queries.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: queries.OppositeDifferentClass (visibility: PUBLIC, simpleName: OppositeDifferentClass, identifier: queries.OppositeDifferentClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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: queries.OppositeDifferentClass (visibility: PUBLIC, simpleName: OppositeDifferentClass, identifier: queries.OppositeDifferentClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (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 "queries.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/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java
index 9b426200..383852f1 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java
@@ -5,6 +5,7 @@ import java.io.FileNotFoundException;
5import java.io.PrintStream; 5import java.io.PrintStream;
6import java.util.ArrayList; 6import java.util.ArrayList;
7import java.util.Map; 7import java.util.Map;
8import java.util.Scanner;
8 9
9import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain; 10import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain;
10import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance; 11import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance;
@@ -28,13 +29,13 @@ public class Main {
28 private static String configFolder = "yakinduum/config22/"; 29 private static String configFolder = "yakinduum/config22/";
29 private static String configFileName = configFolder + "info_old_metric.csv"; 30 private static String configFileName = configFolder + "info_old_metric.csv";
30 private static String aggregateViolationMeasureFileName = configFolder + "aggregateInfo.csv"; 31 private static String aggregateViolationMeasureFileName = configFolder + "aggregateInfo.csv";
31 private static String fileReadFolder = "output/Viatra_100/"; 32 private static String fileReadFolder = "output/Ecore_100/";
32 33
33 public static void main(String args[]) { 34 public static void main(String args[]) {
34 35 String ecoreFile = args[0];
35 36 System.out.println("Generation Started");
36 long begin = System.currentTimeMillis(); 37 long begin = System.currentTimeMillis();
37 String message = runWithPath("ecore.vsconfig"); 38 String message = runWithPath(ecoreFile);
38 long elapsed = System.currentTimeMillis() - begin; 39 long elapsed = System.currentTimeMillis() - begin;
39 40
40 if(message != null) { 41 if(message != null) {
@@ -147,7 +148,7 @@ public class Main {
147 ArrayList<String> output = new ArrayList<String>(); 148 ArrayList<String> output = new ArrayList<String>();
148 GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE, ".xmi"); 149 GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE, ".xmi");
149 EMFGraph graph = reader.readModel(fileReadFolder+"/run"+run, run + "_1.xmi"); 150 EMFGraph graph = reader.readModel(fileReadFolder+"/run"+run, run + "_1.xmi");
150 MetricSampleGroup metrics = RepMetricsReader.read(Domain.Yakinduum); 151 MetricSampleGroup metrics = RepMetricsReader.read(Domain.Yakindumm);
151 //KS distance 152 //KS distance
152 KSDistance ks = new KSDistance(metrics); 153 KSDistance ks = new KSDistance(metrics);
153 154
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig
index d2414e87..4ce9da27 100644
--- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig
+++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig
@@ -9,13 +9,17 @@ generate {
9 solver = ViatraSolver 9 solver = ViatraSolver
10 10
11 scope = { 11 scope = {
12 #node = 1 12 #node = 98
13 } 13 }
14 14
15 number = 1 15 number = 1
16 runs = 1 16 runs = 1
17 config = { 17 config = {
18 log-level = none 18 log-level = none,
19 "optional-wf" = "true",
20 "realistic-guidance" = "Composite",
21 "allow-must-violations" = "true",
22 "domain" = "Yakindumm"
19 } 23 }
20 24
21 debug = "debug" 25 debug = "debug"
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/.classpath b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/.classpath
index 006b2686..c5fe8c25 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/.classpath
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/.classpath
@@ -4,6 +4,7 @@
4 <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> 4 <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
5 <classpathentry kind="src" path="src"/> 5 <classpathentry kind="src" path="src"/>
6 <classpathentry kind="src" path="xtend-gen"/> 6 <classpathentry kind="src" path="xtend-gen"/>
7 <classpathentry kind="src" path="constraints"/>
7 <classpathentry kind="lib" path="C:/Users/chenp/eclipse-workspace/VIATRA-Generator/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/lib/commons-math3-3.6.1.jar"/> 8 <classpathentry kind="lib" path="C:/Users/chenp/eclipse-workspace/VIATRA-Generator/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/lib/commons-math3-3.6.1.jar"/>
8 <classpathentry kind="lib" path="C:/Users/chenp/eclipse-workspace/VIATRA-Generator/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/lib/commons-math3-3.6.1-javadoc.jar"/> 9 <classpathentry kind="lib" path="C:/Users/chenp/eclipse-workspace/VIATRA-Generator/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/lib/commons-math3-3.6.1-javadoc.jar"/>
9 <classpathentry kind="lib" path="C:/Users/chenp/eclipse-workspace/VIATRA-Generator/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/lib/weka.jar"/> 10 <classpathentry kind="lib" path="C:/Users/chenp/eclipse-workspace/VIATRA-Generator/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/lib/weka.jar"/>
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 febd4757..138f034a 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
@@ -14,7 +14,11 @@ Require-Bundle: com.google.guava,
14 hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0", 14 hu.bme.mit.inf.dslreasoner.viatra2logic;bundle-version="1.0.0",
15 hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph;bundle-version="1.0.0", 15 hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph;bundle-version="1.0.0",
16 hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage;bundle-version="1.0.0", 16 hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage;bundle-version="1.0.0",
17 org.eclipse.viatra.dse;bundle-version="0.21.2" 17 org.eclipse.viatra.dse;bundle-version="0.21.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",
20 org.eclipse.collections;bundle-version="9.2.0",
21 org.eclipse.viatra.query.runtime.localsearch;bundle-version="2.1.2"
18Export-Package: ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app, 22Export-Package: ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app,
19 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance, 23 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance,
20 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph, 24 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph,
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoIncomingConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoIncomingConstraint0.java
new file mode 100644
index 00000000..dbc51a5e
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoIncomingConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.ChoiceHasNoIncoming;
20
21public class ChoiceHasNoIncomingConstraint0 implements IConstraintSpecification {
22
23 private ChoiceHasNoIncoming querySpecification;
24
25 public ChoiceHasNoIncomingConstraint0() {
26 querySpecification = ChoiceHasNoIncoming.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/constraints/yakindumm/ChoiceHasNoOutgoingConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoOutgoingConstraint0.java
new file mode 100644
index 00000000..bdddd5b5
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/ChoiceHasNoOutgoingConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.ChoiceHasNoOutgoing;
20
21public class ChoiceHasNoOutgoingConstraint0 implements IConstraintSpecification {
22
23 private ChoiceHasNoOutgoing querySpecification;
24
25 public ChoiceHasNoOutgoingConstraint0() {
26 querySpecification = ChoiceHasNoOutgoing.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/constraints/yakindumm/IncomingToEntryConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/IncomingToEntryConstraint0.java
new file mode 100644
index 00000000..b49d9474
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/IncomingToEntryConstraint0.java
@@ -0,0 +1,80 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.IncomingToEntry;
20
21public class IncomingToEntryConstraint0 implements IConstraintSpecification {
22
23 private IncomingToEntry querySpecification;
24
25 public IncomingToEntryConstraint0() {
26 querySpecification = IncomingToEntry.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("e",signature.get("e"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "e"
46 );
47 return keyNames;
48 }
49
50 @Override
51 public List<String> getPropertyNames() {
52 List<String> propertyNames = Arrays.asList(
53 "t"
54 );
55 return propertyNames;
56 }
57
58 @Override
59 public Set<List<String>> getSymmetricPropertyNames() {
60 Set<List<String>> symmetricPropertyNamesSet = new HashSet<>();
61 return symmetricPropertyNamesSet;
62 }
63
64 @Override
65 public Set<List<String>> getSymmetricKeyNames() {
66 Set<List<String>> symmetricKeyNamesSet = new HashSet<>();
67 return symmetricKeyNamesSet;
68 }
69
70 @Override
71 public Severity getSeverity() {
72 return Severity.ERROR;
73 }
74
75 @Override
76 public IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> getQuerySpecification() {
77 return querySpecification;
78 }
79
80}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleEntryInRegionConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleEntryInRegionConstraint0.java
new file mode 100644
index 00000000..535e7eee
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleEntryInRegionConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.MultipleEntryInRegion;
20
21public class MultipleEntryInRegionConstraint0 implements IConstraintSpecification {
22
23 private MultipleEntryInRegion querySpecification;
24
25 public MultipleEntryInRegionConstraint0() {
26 querySpecification = MultipleEntryInRegion.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("r",signature.get("r"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "r"
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/constraints/yakindumm/MultipleTransitionFromEntryConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleTransitionFromEntryConstraint0.java
new file mode 100644
index 00000000..a41b2fc1
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/MultipleTransitionFromEntryConstraint0.java
@@ -0,0 +1,81 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.MultipleTransitionFromEntry;
20
21public class MultipleTransitionFromEntryConstraint0 implements IConstraintSpecification {
22
23 private MultipleTransitionFromEntry querySpecification;
24
25 public MultipleTransitionFromEntryConstraint0() {
26 querySpecification = MultipleTransitionFromEntry.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("e",signature.get("e"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "e"
46 );
47 return keyNames;
48 }
49
50 @Override
51 public List<String> getPropertyNames() {
52 List<String> propertyNames = Arrays.asList(
53 "t1",
54 "t2"
55 );
56 return propertyNames;
57 }
58
59 @Override
60 public Set<List<String>> getSymmetricPropertyNames() {
61 Set<List<String>> symmetricPropertyNamesSet = new HashSet<>();
62 return symmetricPropertyNamesSet;
63 }
64
65 @Override
66 public Set<List<String>> getSymmetricKeyNames() {
67 Set<List<String>> symmetricKeyNamesSet = new HashSet<>();
68 return symmetricKeyNamesSet;
69 }
70
71 @Override
72 public Severity getSeverity() {
73 return Severity.ERROR;
74 }
75
76 @Override
77 public IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> getQuerySpecification() {
78 return querySpecification;
79 }
80
81}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoEntryInRegionConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoEntryInRegionConstraint0.java
new file mode 100644
index 00000000..9eb7783f
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoEntryInRegionConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.NoEntryInRegion;
20
21public class NoEntryInRegionConstraint0 implements IConstraintSpecification {
22
23 private NoEntryInRegion querySpecification;
24
25 public NoEntryInRegionConstraint0() {
26 querySpecification = NoEntryInRegion.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("r1",signature.get("r1"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "r1"
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/constraints/yakindumm/NoOutgoingTransitionFromEntryConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoOutgoingTransitionFromEntryConstraint0.java
new file mode 100644
index 00000000..35d54e8e
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoOutgoingTransitionFromEntryConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.NoOutgoingTransitionFromEntry;
20
21public class NoOutgoingTransitionFromEntryConstraint0 implements IConstraintSpecification {
22
23 private NoOutgoingTransitionFromEntry querySpecification;
24
25 public NoOutgoingTransitionFromEntryConstraint0() {
26 querySpecification = NoOutgoingTransitionFromEntry.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("e",signature.get("e"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "e"
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/constraints/yakindumm/NoStateInRegionConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoStateInRegionConstraint0.java
new file mode 100644
index 00000000..49c0063f
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/NoStateInRegionConstraint0.java
@@ -0,0 +1,79 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.NoStateInRegion;
20
21public class NoStateInRegionConstraint0 implements IConstraintSpecification {
22
23 private NoStateInRegion querySpecification;
24
25 public NoStateInRegionConstraint0() {
26 querySpecification = NoStateInRegion.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("region",signature.get("region"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "region"
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/constraints/yakindumm/OutgoingFromExitConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromExitConstraint0.java
new file mode 100644
index 00000000..ddb907ff
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromExitConstraint0.java
@@ -0,0 +1,80 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.OutgoingFromExit;
20
21public class OutgoingFromExitConstraint0 implements IConstraintSpecification {
22
23 private OutgoingFromExit querySpecification;
24
25 public OutgoingFromExitConstraint0() {
26 querySpecification = OutgoingFromExit.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("e",signature.get("e"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "e"
46 );
47 return keyNames;
48 }
49
50 @Override
51 public List<String> getPropertyNames() {
52 List<String> propertyNames = Arrays.asList(
53 "t"
54 );
55 return propertyNames;
56 }
57
58 @Override
59 public Set<List<String>> getSymmetricPropertyNames() {
60 Set<List<String>> symmetricPropertyNamesSet = new HashSet<>();
61 return symmetricPropertyNamesSet;
62 }
63
64 @Override
65 public Set<List<String>> getSymmetricKeyNames() {
66 Set<List<String>> symmetricKeyNamesSet = new HashSet<>();
67 return symmetricKeyNamesSet;
68 }
69
70 @Override
71 public Severity getSeverity() {
72 return Severity.ERROR;
73 }
74
75 @Override
76 public IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> getQuerySpecification() {
77 return querySpecification;
78 }
79
80}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromFinalConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromFinalConstraint0.java
new file mode 100644
index 00000000..3b2949fd
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/yakindumm/OutgoingFromFinalConstraint0.java
@@ -0,0 +1,80 @@
1/**
2Generated from platform:/resource/hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph/queries/hu/bme/mit/inf/dslreasoner/partialsnapshot_mavo/yakindu/patterns.vql
3*/
4package constraints.yakindumm;
5
6import java.util.HashMap;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Map;
10import java.util.Set;
11import java.util.Arrays;
12
13import org.eclipse.viatra.addon.validation.core.api.Severity;
14import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification;
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 hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.OutgoingFromFinal;
20
21public class OutgoingFromFinalConstraint0 implements IConstraintSpecification {
22
23 private OutgoingFromFinal querySpecification;
24
25 public OutgoingFromFinalConstraint0() {
26 querySpecification = OutgoingFromFinal.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("f",signature.get("f"));
39 return map;
40 }
41
42 @Override
43 public List<String> getKeyNames() {
44 List<String> keyNames = Arrays.asList(
45 "f"
46 );
47 return keyNames;
48 }
49
50 @Override
51 public List<String> getPropertyNames() {
52 List<String> propertyNames = Arrays.asList(
53 "t"
54 );
55 return propertyNames;
56 }
57
58 @Override
59 public Set<List<String>> getSymmetricPropertyNames() {
60 Set<List<String>> symmetricPropertyNamesSet = new HashSet<>();
61 return symmetricPropertyNamesSet;
62 }
63
64 @Override
65 public Set<List<String>> getSymmetricKeyNames() {
66 Set<List<String>> symmetricKeyNamesSet = new HashSet<>();
67 return symmetricKeyNamesSet;
68 }
69
70 @Override
71 public Severity getSeverity() {
72 return Severity.ERROR;
73 }
74
75 @Override
76 public IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> getQuerySpecification() {
77 return querySpecification;
78 }
79
80}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/mpc_rep/R_2016324.xmi b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/mpc_rep/R_2016324.xmi
deleted file mode 100644
index 493a1731..00000000
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/mpc_rep/R_2016324.xmi
+++ /dev/null
@@ -1,128 +0,0 @@
1<?xml version="1.0" encoding="ASCII"?>
2<hu.bme.mit.inf.yakindumm:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hu.bme.mit.inf.yakindumm="hu.bme.mit.inf.yakindumm">
3 <regions>
4 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.1/@outgoingTransitions.0">
5 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/>
6 <regions>
7 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.2">
8 <regions>
9 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
10 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.1"/>
11 </vertices>
12 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.0">
13 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.3"/>
14 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.2"/>
15 </vertices>
16 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.1">
17 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.3"/>
18 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
19 </vertices>
20 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.0">
21 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.2"/>
22 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
23 </vertices>
24 </regions>
25 </vertices>
26 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.11/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.11/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.12/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.12/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.2">
27 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.12"/>
28 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.11"/>
29 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/>
30 </vertices>
31 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.13/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.13/@outgoingTransitions.1">
32 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.13"/>
33 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.7"/>
34 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
35 </vertices>
36 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.1">
37 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/>
38 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.10"/>
39 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.6"/>
40 </vertices>
41 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.1">
42 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/>
43 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/>
44 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.9"/>
45 </vertices>
46 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
47 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
48 </vertices>
49 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.2">
50 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
51 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
52 </vertices>
53 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.1">
54 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/>
55 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/>
56 </vertices>
57 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.0">
58 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/>
59 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/>
60 </vertices>
61 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.2">
62 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/>
63 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/>
64 </vertices>
65 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.1">
66 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
67 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
68 </vertices>
69 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.1">
70 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
71 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
72 </vertices>
73 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.0">
74 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
75 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
76 </vertices>
77 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.0">
78 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/>
79 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.2"/>
80 </vertices>
81 </regions>
82 </vertices>
83 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
84 <outgoingTransitions target="//@regions.0/@vertices.0"/>
85 </vertices>
86 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State">
87 <outgoingTransitions target="//@regions.0/@vertices.0"/>
88 <regions>
89 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry" incomingTransitions="//@regions.0/@vertices.0/@outgoingTransitions.0">
90 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
91 </vertices>
92 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.0">
93 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
94 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
95 </vertices>
96 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.9/@outgoingTransitions.1">
97 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.8"/>
98 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.10"/>
99 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.4"/>
100 </vertices>
101 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.8/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.8/@outgoingTransitions.1">
102 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.7"/>
103 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.9"/>
104 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.10"/>
105 </vertices>
106 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.2">
107 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
108 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.5"/>
109 </vertices>
110 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.1"/>
111 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.1"/>
112 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.0">
113 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
114 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.6"/>
115 </vertices>
116 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.0">
117 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
118 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
119 </vertices>
120 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.1">
121 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
122 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
123 </vertices>
124 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.2 //@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.1"/>
125 </regions>
126 </vertices>
127 </regions>
128</hu.bme.mit.inf.yakindumm:Statechart>
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/na_rep/R_2017419.xmi b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/na_rep/R_2017419.xmi
deleted file mode 100644
index 369760bf..00000000
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/na_rep/R_2017419.xmi
+++ /dev/null
@@ -1,138 +0,0 @@
1<?xml version="1.0" encoding="ASCII"?>
2<hu.bme.mit.inf.yakindumm:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hu.bme.mit.inf.yakindumm="hu.bme.mit.inf.yakindumm">
3 <regions>
4 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.5/@outgoingTransitions.0">
5 <regions>
6 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.2 //@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.2 //@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.2 //@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.3">
7 <outgoingTransitions target="//@regions.0/@vertices.1"/>
8 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
9 </vertices>
10 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.3/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.1">
11 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/>
12 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.4"/>
13 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/>
14 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.3"/>
15 </vertices>
16 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
17 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/>
18 </vertices>
19 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.3">
20 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
21 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
22 </vertices>
23 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.1">
24 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
25 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.1"/>
26 </vertices>
27 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.7/@outgoingTransitions.0">
28 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.6"/>
29 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.7"/>
30 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/>
31 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/>
32 </vertices>
33 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.0">
34 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/>
35 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/>
36 </vertices>
37 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.1">
38 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/>
39 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.5"/>
40 </vertices>
41 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.5/@outgoingTransitions.3 //@regions.0/@vertices.0/@regions.0/@vertices.10/@outgoingTransitions.1 //@regions.0/@vertices.0/@regions.0/@vertices.9/@outgoingTransitions.1">
42 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.10"/>
43 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.9"/>
44 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/>
45 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.0"/>
46 </vertices>
47 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.1">
48 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/>
49 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/>
50 </vertices>
51 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.0/@regions.0/@vertices.8/@outgoingTransitions.0">
52 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/>
53 <outgoingTransitions target="//@regions.0/@vertices.0/@regions.0/@vertices.8"/>
54 </vertices>
55 </regions>
56 </vertices>
57 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.0/@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.4/@outgoingTransitions.1">
58 <outgoingTransitions target="//@regions.0/@vertices.0"/>
59 <regions>
60 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.1/@regions.0/@vertices.7/@outgoingTransitions.0">
61 <outgoingTransitions target="//@regions.0/@vertices.3"/>
62 </vertices>
63 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.5/@outgoingTransitions.1">
64 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3"/>
65 <outgoingTransitions target="//@regions.0/@vertices.3"/>
66 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.5"/>
67 </vertices>
68 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.6/@outgoingTransitions.0"/>
69 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.6/@outgoingTransitions.1">
70 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.7"/>
71 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.6"/>
72 </vertices>
73 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
74 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.1"/>
75 </vertices>
76 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.1/@outgoingTransitions.2">
77 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2"/>
78 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.1"/>
79 </vertices>
80 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.3/@outgoingTransitions.1">
81 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.2"/>
82 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.3"/>
83 </vertices>
84 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.3/@outgoingTransitions.0">
85 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.0"/>
86 <outgoingTransitions target="//@regions.0/@vertices.1/@regions.0/@vertices.0"/>
87 </vertices>
88 </regions>
89 </vertices>
90 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.3/@outgoingTransitions.1 //@regions.0/@vertices.3/@outgoingTransitions.0">
91 <outgoingTransitions target="//@regions.0/@vertices.0"/>
92 <regions>
93 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.1">
94 <outgoingTransitions target="//@regions.0/@vertices.4"/>
95 </vertices>
96 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.1">
97 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
98 <outgoingTransitions target="//@regions.0/@vertices.4"/>
99 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.5"/>
100 </vertices>
101 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.0"/>
102 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.6/@outgoingTransitions.1">
103 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.6"/>
104 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.7"/>
105 </vertices>
106 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
107 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
108 </vertices>
109 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.2">
110 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
111 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
112 </vertices>
113 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.0">
114 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
115 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
116 </vertices>
117 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.1">
118 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/>
119 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/>
120 </vertices>
121 </regions>
122 </vertices>
123 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.1/@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.1/@regions.0/@vertices.1/@outgoingTransitions.1">
124 <outgoingTransitions target="//@regions.0/@vertices.2"/>
125 <outgoingTransitions target="//@regions.0/@vertices.2"/>
126 </vertices>
127 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.1">
128 <outgoingTransitions target="//@regions.0/@vertices.1"/>
129 <outgoingTransitions target="//@regions.0/@vertices.1"/>
130 </vertices>
131 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.6/@outgoingTransitions.0">
132 <outgoingTransitions target="//@regions.0/@vertices.0"/>
133 </vertices>
134 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
135 <outgoingTransitions target="//@regions.0/@vertices.5"/>
136 </vertices>
137 </regions>
138</hu.bme.mit.inf.yakindumm:Statechart>
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/out_d_rep/R_2015225.xmi b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/out_d_rep/R_2015225.xmi
deleted file mode 100644
index 21fee5a9..00000000
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/data/Yakinduum/out_d_rep/R_2015225.xmi
+++ /dev/null
@@ -1,145 +0,0 @@
1<?xml version="1.0" encoding="ASCII"?>
2<hu.bme.mit.inf.yakindumm:Statechart xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hu.bme.mit.inf.yakindumm="hu.bme.mit.inf.yakindumm">
3 <regions>
4 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
5 <outgoingTransitions target="//@regions.0/@vertices.1"/>
6 </vertices>
7 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.2 //@regions.0/@vertices.2/@outgoingTransitions.0 //@regions.0/@vertices.3/@outgoingTransitions.0">
8 <outgoingTransitions target="//@regions.0/@vertices.2"/>
9 <outgoingTransitions target="//@regions.0/@vertices.3"/>
10 </vertices>
11 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@outgoingTransitions.0">
12 <outgoingTransitions target="//@regions.0/@vertices.1"/>
13 <regions>
14 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.2">
15 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/>
16 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
17 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/>
18 </vertices>
19 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.10/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.9/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.0/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.10/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.9/@outgoingTransitions.0">
20 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.9"/>
21 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
22 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.10"/>
23 </vertices>
24 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.7/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.8/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.8/@outgoingTransitions.1">
25 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.8"/>
26 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
27 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.7"/>
28 </vertices>
29 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.2/@regions.0/@vertices.6/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.1 //@regions.0/@vertices.2/@regions.0/@vertices.5/@outgoingTransitions.1">
30 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.6"/>
31 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.5"/>
32 <outgoingTransitions target="//@regions.0/@vertices.1"/>
33 </vertices>
34 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
35 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.0"/>
36 </vertices>
37 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.1">
38 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
39 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
40 </vertices>
41 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.3/@outgoingTransitions.0">
42 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
43 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.3"/>
44 </vertices>
45 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.2">
46 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
47 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
48 </vertices>
49 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.2/@outgoingTransitions.0">
50 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
51 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.2"/>
52 </vertices>
53 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.0">
54 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
55 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
56 </vertices>
57 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.2/@regions.0/@vertices.1/@outgoingTransitions.2">
58 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
59 <outgoingTransitions target="//@regions.0/@vertices.2/@regions.0/@vertices.1"/>
60 </vertices>
61 </regions>
62 </vertices>
63 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.6/@outgoingTransitions.0">
64 <outgoingTransitions target="//@regions.0/@vertices.1"/>
65 <outgoingTransitions target="//@regions.0/@vertices.5"/>
66 <regions>
67 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
68 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.1"/>
69 </vertices>
70 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.0/@outgoingTransitions.0">
71 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.2"/>
72 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.3"/>
73 </vertices>
74 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.6/@outgoingTransitions.0 //@regions.0/@vertices.3/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.3/@regions.0/@vertices.5/@outgoingTransitions.0 //@regions.0/@vertices.3/@regions.0/@vertices.5/@outgoingTransitions.1">
75 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.4"/>
76 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.6"/>
77 </vertices>
78 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.3/@regions.0/@vertices.8/@outgoingTransitions.0 //@regions.0/@vertices.3/@regions.0/@vertices.1/@outgoingTransitions.1 //@regions.0/@vertices.3/@regions.0/@vertices.4/@outgoingTransitions.1">
79 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.8"/>
80 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.5"/>
81 </vertices>
82 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.2/@outgoingTransitions.0">
83 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.3"/>
84 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.3"/>
85 </vertices>
86 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.3/@outgoingTransitions.1">
87 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.2"/>
88 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.2"/>
89 </vertices>
90 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.2/@outgoingTransitions.1">
91 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.2"/>
92 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.7"/>
93 </vertices>
94 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.5/@outgoingTransitions.1 //@regions.0/@vertices.3/@regions.0/@vertices.6/@outgoingTransitions.1"/>
95 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.3/@outgoingTransitions.0">
96 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.3"/>
97 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.9"/>
98 </vertices>
99 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.3/@regions.0/@vertices.8/@outgoingTransitions.1 //@regions.0/@vertices.5/@outgoingTransitions.2"/>
100 </regions>
101 </vertices>
102 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.5/@outgoingTransitions.0">
103 <outgoingTransitions target="//@regions.0/@vertices.6"/>
104 <regions>
105 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Entry">
106 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.1"/>
107 </vertices>
108 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.0/@outgoingTransitions.0">
109 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.3"/>
110 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.2"/>
111 </vertices>
112 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.4/@outgoingTransitions.0 //@regions.0/@vertices.4/@regions.0/@vertices.1/@outgoingTransitions.1">
113 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.4"/>
114 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.8"/>
115 </vertices>
116 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.1/@outgoingTransitions.0 //@regions.0/@vertices.4/@regions.0/@vertices.6/@outgoingTransitions.0">
117 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.9"/>
118 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.6"/>
119 </vertices>
120 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.2/@outgoingTransitions.0">
121 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.2"/>
122 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.5"/>
123 </vertices>
124 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.4/@outgoingTransitions.1 //@regions.0/@vertices.6/@outgoingTransitions.2"/>
125 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.3/@outgoingTransitions.1">
126 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.3"/>
127 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.7"/>
128 </vertices>
129 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.6/@outgoingTransitions.1 //@regions.0/@vertices.6/@outgoingTransitions.1"/>
130 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.2/@outgoingTransitions.1"/>
131 <vertices xsi:type="hu.bme.mit.inf.yakindumm:State" incomingTransitions="//@regions.0/@vertices.4/@regions.0/@vertices.3/@outgoingTransitions.0"/>
132 </regions>
133 </vertices>
134 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.3/@outgoingTransitions.1">
135 <outgoingTransitions target="//@regions.0/@vertices.4"/>
136 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.7"/>
137 <outgoingTransitions target="//@regions.0/@vertices.3/@regions.0/@vertices.9"/>
138 </vertices>
139 <vertices xsi:type="hu.bme.mit.inf.yakindumm:Choice" incomingTransitions="//@regions.0/@vertices.4/@outgoingTransitions.0">
140 <outgoingTransitions target="//@regions.0/@vertices.3"/>
141 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.7"/>
142 <outgoingTransitions target="//@regions.0/@vertices.4/@regions.0/@vertices.5"/>
143 </vertices>
144 </regions>
145</hu.bme.mit.inf.yakindumm:Statechart>
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend
index 8351e96b..c8fd435b 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Domain.xtend
@@ -1,5 +1,7 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app 1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
2 2
3enum Domain{ 3enum Domain{
4 Yakinduum 4 Yakindumm,
5 Ecore,
6 Github
5} \ No newline at end of file 7} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/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 062d69fa..ab187b3a 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
@@ -3,13 +3,25 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter 4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter
5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader 5import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader
6import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation.ViolationCheck
6import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl 7import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl
8import java.io.File
7import java.util.ArrayList 9import java.util.ArrayList
10import org.eclipse.emf.ecore.EPackage
8import org.eclipse.emf.ecore.EcorePackage 11import org.eclipse.emf.ecore.EcorePackage
12import org.eclipse.viatra.query.runtime.rete.matcher.ReteEngine
13import org.eclipse.emf.ecore.impl.EcorePackageImpl
14import org.eclipse.emf.ecore.EReference
9 15
10//import yakindumm2.impl.Yakindumm2PackageImpl 16//import yakindumm2.impl.Yakindumm2PackageImpl
11 17
12class Main { 18class Main {
19 var static Domain d = Domain.Ecore;
20 val static String suffix = '.ecore'
21 val static String OUTPUT_FOLDER = "Inputs/human/";
22 val static String INPUT_FOLDER = "outputs/human/";
23 val static int NUM_RUNS = 1;
24
13 static class RWInformation{ 25 static class RWInformation{
14 public var String inputFolder; 26 public var String inputFolder;
15 public var String outputFolder; 27 public var String outputFolder;
@@ -24,36 +36,32 @@ class Main {
24 36
25 def static void main(String[] args){ 37 def static void main(String[] args){
26 //init model 38 //init model
27 YakindummPackageImpl.eINSTANCE.eClass; 39 var EPackage metamodel;
28 EcorePackage.eINSTANCE.eClass;
29// Yakindumm2PackageImpl.eINSTANCE.eClass;
30 //val infos = initData();
31
32 println("Start Reading Models...");
33 var reader = new GraphReader(EcorePackage.eINSTANCE, ".xmi");
34// for(info : infos){
35// calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader);
36// }
37 40
38 //human input has different package declaration 41 //init viatra engine for the violation checker
39// reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); 42 ReteEngine.getClass();
40 val human = new RWInformation("Inputs/viatra75/", "outputs/", 50);
41 calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader);
42 43
44 if(d == Domain.Yakindumm){
45 YakindummPackageImpl.eINSTANCE.eClass;
46 metamodel = YakindummPackageImpl.eINSTANCE;
47 }else if (d == Domain.Ecore){
48 EcorePackage.eINSTANCE.eClass;
49 metamodel = EcorePackageImpl.eINSTANCE;
50 }else if (d == Domain.Github){
51 //TODO: Initialize Github Package
52 }
43 53
54
55 println("Start Reading Models...");
56 var reader = new GraphReader(metamodel, suffix);
57
58 val models = new RWInformation(OUTPUT_FOLDER, INPUT_FOLDER, NUM_RUNS);
59 calculateAllModels(models.inputFolder, models.outputFolder,models.numRuns, reader);
44 println("finished"); 60 println("finished");
45 } 61 }
46 62
47 static def initData(){
48 val infos = new ArrayList<RWInformation>();
49 infos.add(new RWInformation("inputs/alloyInput/models/", "../plot/statistics/alloyOutput/", 20));
50 infos.add(new RWInformation("inputs/randomInput/models/", "../plot/statistics/randomOutput/", 20));
51 infos.add(new RWInformation("inputs/viatraInput30/", "../plot/statistics/viatraOutput30/", 20));
52 infos.add(new RWInformation("inputs/viatraInput100/", "../plot/statistics/viatraOutput100/", 10));
53 return infos;
54 }
55
56 static def calculateAllModels(String inputFolder, String outputFolder, int numRuns, GraphReader reader){ 63 static def calculateAllModels(String inputFolder, String outputFolder, int numRuns, GraphReader reader){
64 (new File(outputFolder)).mkdir();
57 for(var i = 1; i <= numRuns; i++){ 65 for(var i = 1; i <= numRuns; i++){
58 val models = new ArrayList<EMFGraph>(); 66 val models = new ArrayList<EMFGraph>();
59 models.addAll(reader.readModels(inputFolder + "run" + i)); 67 models.addAll(reader.readModels(inputFolder + "run" + i));
@@ -67,8 +75,21 @@ class Main {
67 } 75 }
68 76
69 static def calculateAndOutputMetrics(EMFGraph model, String metaModel, String fileName){ 77 static def calculateAndOutputMetrics(EMFGraph model, String metaModel, String fileName){
70 //println("evaluating for " + model.name); 78 //println("evaluating for " + model.name);
71 model.metaModel = metaModel; 79 model.metaModel = metaModel;
72 CsvFileWriter.write(model.evaluateAllMetrics(), fileName); 80
81 //remove eGenericType for Ecore domain
82 if(d == Domain.Ecore){
83 var refsToRemove = EcorePackageImpl.eINSTANCE.eAllContents.filter(EReference).filter[
84 it.name.equals('eGenericType') || it.name.equals('eGenericSuperTypes') || it.name.equals('eFactoryInstance')||
85 it.name.equals('eGenericExceptions') || it.name.equals('references') || it.name.equals('contents');
86 ];
87 refsToRemove.forEach[model.removeReference(it)];
88 }
89
90 var outputs = model.evaluateAllMetrics();
91 var violationsOutput = newArrayList('violations', ViolationCheck.calculateViolationCounts(model.root, d)+'');
92 outputs.add(violationsOutput);
93 CsvFileWriter.write(outputs, fileName);
73 } 94 }
74} \ No newline at end of file 95} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/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 66dcdff6..b2288f52 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
@@ -20,6 +20,7 @@ import java.util.List
20import java.util.Map 20import java.util.Map
21import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression 21import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression
22import org.eclipse.xtend.lib.annotations.Accessors 22import org.eclipse.xtend.lib.annotations.Accessors
23import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.EdgeTypeMetric
23 24
24class PartialInterpretationMetricDistance { 25class PartialInterpretationMetricDistance {
25 26
@@ -34,8 +35,8 @@ class PartialInterpretationMetricDistance {
34 var LinearModel linearModel; 35 var LinearModel linearModel;
35 36
36 37
37 new(){ 38 new(Domain d){
38 var metrics = RepMetricsReader.read(Domain.Yakinduum); 39 var metrics = RepMetricsReader.read(d);
39 this.g = metrics; 40 this.g = metrics;
40 ks = new KSDistance(g); 41 ks = new KSDistance(g);
41 js = new JSDistance(g); 42 js = new JSDistance(g);
@@ -53,6 +54,7 @@ class PartialInterpretationMetricDistance {
53 metrics.add(new NodeActivityMetric()); 54 metrics.add(new NodeActivityMetric());
54 metrics.add(new MultiplexParticipationCoefficientMetric()); 55 metrics.add(new MultiplexParticipationCoefficientMetric());
55 metrics.add(new NodeTypeMetric()); 56 metrics.add(new NodeTypeMetric());
57 metrics.add(new EdgeTypeMetric());
56 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); 58 val metricCalculator = new PartialInterpretationGraph(partial, metrics, null);
57 var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); 59 var metricSamples = metricCalculator.evaluateAllMetricsToSamples();
58 60
@@ -63,6 +65,7 @@ class PartialInterpretationMetricDistance {
63 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); 65 //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples);
64 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); 66 var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType);
65 distance.nodeTypeInfo = metricSamples.nodeTypeSamples; 67 distance.nodeTypeInfo = metricSamples.nodeTypeSamples;
68 distance.edgeTypeDistance = ks.edgeTypeDistance(metricSamples.edgeTypeSamples);
66 return distance; 69 return distance;
67 } 70 }
68 71
@@ -177,7 +180,8 @@ class MetricDistanceGroup{
177 var double outDegreeDistance; 180 var double outDegreeDistance;
178 var double nodeTypeDistance; 181 var double nodeTypeDistance;
179 protected var HashMap<String, Double> nodeTypeInfo; 182 protected var HashMap<String, Double> nodeTypeInfo;
180 183 public var double edgeTypeDistance;
184
181 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ 185 new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){
182 this.mpcDistance = mpcDistance; 186 this.mpcDistance = mpcDistance;
183 this.naDistance = naDistance; 187 this.naDistance = naDistance;
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java
deleted file mode 100644
index f06b377f..00000000
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Test.java
+++ /dev/null
@@ -1,31 +0,0 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import weka.core.matrix.LinearRegression;
7import weka.core.matrix.Matrix;
8
9public class Test {
10 public static void main(String[] args) {
11 linearRegressionTest();
12 }
13
14 public static void linearRegressionTest() {
15 double[][] x = {{1,1,2,3}, {1,2,3,4}, {1,3,5,7}, {1,1,5,7}};
16 double[] y = {10, 13, 19, 17};
17 double[] valueToPredict = {1,1,1,1};
18 Matrix m = new Matrix(x);
19 Matrix n = new Matrix(y, y.length);
20
21 LinearRegression regression = new LinearRegression(m, n, 0);
22 double[] coef = regression.getCoefficients();
23
24 //predict
25 double a = 0;
26 for(int i = 0; i < coef.length; i++) {
27 a += coef[i] * valueToPredict[i];
28 }
29 System.out.println(a);
30 }
31}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend
index 08d8704a..c486a328 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend
@@ -70,13 +70,30 @@ class KSDistance extends CostDistance {
70 instanceDist.add(samples.getOrDefault(key, 0.0)); 70 instanceDist.add(samples.getOrDefault(key, 0.0));
71 } 71 }
72 72
73 return ks_distance_two_dist(sourceDist, instanceDist);
74 }
75
76 def edgeTypeDistance(HashMap<String, Double> samples){
77 var typesDistMap = g.edgeTypeSamples;
78 var sourceDist = newArrayList();
79 var instanceDist = newArrayList();
80
81 for(key : typesDistMap.keySet()){
82 sourceDist.add(typesDistMap.get(key));
83 instanceDist.add(samples.getOrDefault(key, 0.0));
84 }
85
86 return ks_distance_two_dist(sourceDist, instanceDist);
87 }
88
89 def double ks_distance_two_dist(List<Double> dist1, List<Double> dist2){
73 // Since we already know the pdf, we compute the ks-test manully 90 // Since we already know the pdf, we compute the ks-test manully
74 var ksStatistics = 0.0; 91 var ksStatistics = 0.0;
75 var sum1 = 0.0; 92 var sum1 = 0.0;
76 var sum2 = 0.0; 93 var sum2 = 0.0;
77 for(var i = 0; i < sourceDist.size(); i++){ 94 for(var i = 0; i < dist1.size(); i++){
78 sum1 += sourceDist.get(i); 95 sum1 += dist1.get(i);
79 sum2 += instanceDist.get(i); 96 sum2 += dist2.get(i);
80 97
81 ksStatistics = Math.max(ksStatistics, Math.abs(sum1 - sum2)); 98 ksStatistics = Math.max(ksStatistics, Math.abs(sum1 - sum2));
82 } 99 }
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend
index 959006f4..8fa29fe6 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend
@@ -7,10 +7,15 @@ import java.util.List
7import org.eclipse.emf.common.util.EList 7import org.eclipse.emf.common.util.EList
8import org.eclipse.emf.ecore.EObject 8import org.eclipse.emf.ecore.EObject
9import org.eclipse.emf.ecore.EReference 9import org.eclipse.emf.ecore.EReference
10import org.eclipse.xtend.lib.annotations.Accessors
10 11
11class EMFGraph extends Graph{ 12class EMFGraph extends Graph{
13 @Accessors(PUBLIC_GETTER)
14 var EObject root;
15
12 def void init (EObject root, List<Metric> metrics, String name, List<EReference> referenceTypes){ 16 def void init (EObject root, List<Metric> metrics, String name, List<EReference> referenceTypes){
13 val otherContents = root.eAllContents.toList(); 17 val otherContents = root.eAllContents.toList();
18 this.root = root;
14 otherContents.add(root); 19 otherContents.add(root);
15 init(otherContents, metrics, name, referenceTypes); 20 init(otherContents, metrics, name, referenceTypes);
16 } 21 }
@@ -30,17 +35,11 @@ class EMFGraph extends Graph{
30 statistic.addNodeWithAllTypes(it, types); 35 statistic.addNodeWithAllTypes(it, types);
31 ] 36 ]
32 37
33 referenceTypes.forEach[it| 38 referenceTypes.forEach[it|
34 var typeToAdd = it; 39 // Only consider the edges that are not derived to preserve the statistical property
35 40 if(!it.derived){
36 // TODO: Here is to only consider one part of opposite edges 41 statistic.addEdgeType(it.name);
37// if(it.upperBound != -1 && it.EOpposite !== null && 42 }
38// (it.EOpposite.upperBound == -1 || it.EOpposite.upperBound > it.upperBound
39// )){
40// typeToAdd = it.EOpposite;
41// }
42//
43 statistic.addEdgeType(typeToAdd.name);
44 ]; 43 ];
45 44
46 objects.forEach[source| 45 objects.forEach[source|
@@ -62,6 +61,12 @@ class EMFGraph extends Graph{
62 this.name = name; 61 this.name = name;
63 } 62 }
64 63
64 def void removeReference(EReference r){
65 if (statistic.containsEdgeType(r.name)){
66 statistic.removeReference(r.name, r.containment);
67 }
68 }
69
65 /** 70 /**
66 * Set basic information for the output 71 * Set basic information for the output
67 */ 72 */
@@ -94,15 +99,8 @@ class EMFGraph extends Graph{
94 } 99 }
95 100
96 def addEdge(EObject source, EObject target, EReference r){ 101 def addEdge(EObject source, EObject target, EReference r){
97 // TODO: Here is to only consider one part of opposite edges 102 //Only add the edge if the reference is not derived to preserve the statistical property
98 //check for the opposite reference and do not add if its opposite will be added 103 if(target !== null && r !== null && !r.derived){
99// if(r.upperBound != -1 && r.EOpposite !== null &&
100// (r.EOpposite.upperBound == -1 || r.EOpposite.upperBound > r.upperBound
101// )){
102// return;
103// }
104
105 if(target !== null && r !== null){
106 statistic.addEdge(source, target, r.name); 104 statistic.addEdge(source, target, r.name);
107 } 105 }
108 } 106 }
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend
index 84071176..af05a1cd 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend
@@ -12,7 +12,7 @@ import org.eclipse.emf.ecore.EReference
12 12
13class GraphStatistic { 13class GraphStatistic {
14 val incomingEdges = new HashMap<String, Multimap<EObject, EObject>>; 14 val incomingEdges = new HashMap<String, Multimap<EObject, EObject>>;
15 val outcomingEdges = new HashMap<String, Multimap<EObject, EObject>>; 15 val outgoingEdges = new HashMap<String, Multimap<EObject, EObject>>;
16 16
17 val edgeTypes = new HashSet<String>(); 17 val edgeTypes = new HashSet<String>();
18 val nodeToType = new HashMap<EObject, Set<String>>(); 18 val nodeToType = new HashMap<EObject, Set<String>>();
@@ -22,15 +22,13 @@ class GraphStatistic {
22 * @param type: type to add 22 * @param type: type to add
23 */ 23 */
24 def void addEdgeType(String type){ 24 def void addEdgeType(String type){
25
26
27 if(edgeTypes.contains(type)){ 25 if(edgeTypes.contains(type)){
28 return; 26 return;
29 } 27 }
30 28
31 edgeTypes.add(type); 29 edgeTypes.add(type);
32 incomingEdges.put(type, ArrayListMultimap.create()); 30 incomingEdges.put(type, ArrayListMultimap.create());
33 outcomingEdges.put(type, ArrayListMultimap.create()); 31 outgoingEdges.put(type, ArrayListMultimap.create());
34 } 32 }
35 33
36 /** 34 /**
@@ -43,6 +41,23 @@ class GraphStatistic {
43 nodeToType.put(n, types); 41 nodeToType.put(n, types);
44 } 42 }
45 43
44 def boolean containsNode(EObject o){
45 return nodeToType.containsKey(o);
46 }
47
48 def Set<String> getTypesForNode(EObject o){
49 return nodeToType.getOrDefault(o, new HashSet<String>());
50 }
51
52 def void overwriteCurrentType(EObject o, String type){
53 var typeSet = nodeToType.getOrDefault(o, new HashSet<String>());
54
55 // clear current types
56 typeSet.clear();
57 typeSet.add(type);
58 nodeToType.put(o, typeSet);
59 }
60
46 /** 61 /**
47 * Add a node to the graph with all types in its type hierarchy 62 * Add a node to the graph with all types in its type hierarchy
48 */ 63 */
@@ -57,18 +72,66 @@ class GraphStatistic {
57 * @param type: type of the reference 72 * @param type: type of the reference
58 */ 73 */
59 def void addEdge(EObject source, EObject target, String type){ 74 def void addEdge(EObject source, EObject target, String type){
60 outcomingEdges.get(type).put(source, target); 75 outgoingEdges.get(type).put(source, target);
61 incomingEdges.get(type).put(target, source); 76 incomingEdges.get(type).put(target, source);
62 } 77 }
63 78
64 /** 79 /**
80 * check if this graph contains a specific edge type
81 */
82 def boolean containsEdgeType(String typeName){
83 if(outgoingEdges.containsKey(typeName) && incomingEdges.containsKey(typeName)){
84 return true;
85 }
86 return false;
87 }
88
89 /**
90 * remove references from the statistics, potentially remove the nodes associated with it
91 * @Param name: name of the reference
92 * @Param isContainment: if true then the corresponding nodes on the incoming side will also be removed
93 */
94 def removeReference(String name, boolean isContainment){
95 if(!edgeTypes.contains(name)){
96 return;
97 }
98
99 edgeTypes.remove(name);
100 var incomingSet = incomingEdges.remove(name);
101 outgoingEdges.remove(name);
102
103 // if the reference is not a containment, then removing the reference is enough
104 if(!isContainment){
105 return;
106 }
107
108 // else remove all corresponding nodes
109 val nodesToRemove = incomingSet.keySet();
110
111 //remove nodes from node sets
112 nodesToRemove.forEach[nodeToType.remove(it)];
113
114 val removeForMultimap = [Multimap<EObject, EObject> refMap|
115 nodesToRemove.forEach[refMap.removeAll(it)];
116 var values = refMap.values()
117 //remove the values from the list is equavalent to remove it in the multimap
118 values.removeAll(nodesToRemove);
119 return;
120 ];
121
122 //remove nodes from all other references on incomingEdges
123 incomingEdges.values.forEach(removeForMultimap);
124 outgoingEdges.values.forEach(removeForMultimap);
125 }
126
127 /**
65 * calculate the out degree for an object 128 * calculate the out degree for an object
66 */ 129 */
67 def int outDegree(EObject o){ 130 def int outDegree(EObject o){
68 var count = 0; 131 var count = 0;
69 132
70 for (String type : edgeTypes){ 133 for (String type : edgeTypes){
71 count += outcomingEdges.get(type).get(o).size(); 134 count += outgoingEdges.get(type).get(o).size();
72 } 135 }
73 return count; 136 return count;
74 } 137 }
@@ -89,7 +152,7 @@ class GraphStatistic {
89 * calculate the dimentional degree of a node 152 * calculate the dimentional degree of a node
90 */ 153 */
91 def int dimentionalDegree(EObject o, String type){ 154 def int dimentionalDegree(EObject o, String type){
92 return incomingEdges.get(type).get(o).size() + outcomingEdges.get(type).get(o).size(); 155 return incomingEdges.get(type).get(o).size() + outgoingEdges.get(type).get(o).size();
93 } 156 }
94 157
95 /** 158 /**
@@ -120,7 +183,7 @@ class GraphStatistic {
120 } 183 }
121 184
122 def HashMap<String, Multimap<EObject, EObject>> getOutgoingEdges(){ 185 def HashMap<String, Multimap<EObject, EObject>> getOutgoingEdges(){
123 return outcomingEdges; 186 return outgoingEdges;
124 } 187 }
125 188
126} 189}
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend
index ef68f366..a2934eb9 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend
@@ -2,6 +2,8 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph
2 2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric 3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric
4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration 4import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.RelationDeclaration
5import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.Type
6import hu.bme.mit.inf.dslreasoner.logic.model.logiclanguage.TypeDefinition
5import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink 7import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.BinaryElementRelationLink
6import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation 8import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation
7import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialComplexTypeInterpretationImpl 9import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.impl.PartialComplexTypeInterpretationImpl
@@ -20,19 +22,25 @@ class PartialInterpretationGraph extends Graph{
20 partial.problem.relations.filter(RelationDeclaration).forEach[ 22 partial.problem.relations.filter(RelationDeclaration).forEach[
21 //only need the name of the reference type (remove everything with and after "reference") 23 //only need the name of the reference type (remove everything with and after "reference")
22 var n = it.name.split(" ").get(0); 24 var n = it.name.split(" ").get(0);
23 // TODO: Here is to only consider one part of opposite edges
24 if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){
25 this.statistic.addEdgeType(n); 25 this.statistic.addEdgeType(n);
26 }
27 ] 26 ]
28 // add all elements 27 // add all elements
29 val typeInterpretations = getTypes(partial); 28 val typeInterpretations = getTypes(partial);
30 for(type : typeInterpretations){ 29 for(type : typeInterpretations){
31 //Only consider the most concrete class 30 //Only consider the most concrete class
32 if(type.interpretationOf.subtypes.size == 0){ 31 if(isConcreteType(type.interpretationOf)){
33 var typeName = type.interpretationOf.name.replace(classSuffix, ''); 32 var typeName = type.interpretationOf.name.replace(classSuffix, '');
34 for(node : type.elements){ 33 for(node : type.elements){
35 this.statistic.addNodeWithType(node, typeName); 34 if(!this.statistic.containsNode(node)){
35 this.statistic.addNodeWithType(node, typeName);
36 }else{
37 // if the current type of the node is a super type of the type to check,
38 // substitute the current type with the new type
39 var currentType = statistic.getTypesForNode(node).get(0);
40 if(isSuperType(currentType, type.interpretationOf)){
41 statistic.overwriteCurrentType(node, typeName);
42 }
43 }
36 } 44 }
37 } 45 }
38 } 46 }
@@ -40,12 +48,9 @@ class PartialInterpretationGraph extends Graph{
40 for(relationInterpretation : partial.partialrelationinterpretation) { 48 for(relationInterpretation : partial.partialrelationinterpretation) {
41 //only need the name of the reference type (remove everything with and after "reference") 49 //only need the name of the reference type (remove everything with and after "reference")
42 val type = relationInterpretation.interpretationOf.name.split(" ").get(0); 50 val type = relationInterpretation.interpretationOf.name.split(" ").get(0);
43 // TODO: Here is to only consider one part of opposite edges 51 for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){
44 if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){ 52 statistic.addEdge(edge.param1, edge.param2, type);
45 for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ 53 }
46 statistic.addEdge(edge.param1, edge.param2, type);
47 }
48 }
49 } 54 }
50 55
51 this.name = name; 56 this.name = name;
@@ -53,6 +58,39 @@ class PartialInterpretationGraph extends Graph{
53 } 58 }
54 59
55 /** 60 /**
61 * recursively check if a type is the super type of another
62 */
63 def boolean isSuperType(String typeName, Type subtypeToCheck){
64 var superTypes = subtypeToCheck.supertypes;
65 if(superTypes.size == 0){
66 return false;
67 }else if(subtypeToCheck.supertypes.map[it.name.replace(classSuffix, '')].contains(typeName)){
68 return true;
69 }else{
70 for(superType : superTypes){
71 if(isSuperType(typeName, superType)){
72 return true;
73 }
74 }
75 return false;
76 }
77 }
78
79 /**
80 * Check if a Type object is the class that we want to consider
81 * A type object is to be considered if it satisfy one of the following:
82 * 1. if it is not abstract
83 * 2. if it is abstract but has a subclass of type TypeDefinition (This means the generation is
84 * started with nodes in this type)
85 */
86 def boolean isConcreteType(Type t){
87 if(!t.isAbstract || t.subtypes.findFirst[it instanceof TypeDefinition] !== null){
88 return true;
89 }
90 return false;
91 }
92
93 /**
56 * Set basic information for the output 94 * Set basic information for the output
57 */ 95 */
58 override setBasicInformation(ArrayList<ArrayList<String>> output){ 96 override setBasicInformation(ArrayList<ArrayList<String>> output){
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
index 491501b0..858113e9 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend
@@ -20,6 +20,8 @@ import org.eclipse.emf.ecore.resource.Resource
20import org.eclipse.emf.ecore.resource.ResourceSet 20import org.eclipse.emf.ecore.resource.ResourceSet
21import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl 21import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
22import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl 22import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
23import org.eclipse.emf.ecore.EGenericType
24import org.eclipse.emf.ecore.EStructuralFeature
23 25
24class GraphReader{ 26class GraphReader{
25 val ResourceSet resSet = new ResourceSetImpl(); 27 val ResourceSet resSet = new ResourceSetImpl();
@@ -53,9 +55,11 @@ class GraphReader{
53 metrics.add(new TypedOutDegree()); 55 metrics.add(new TypedOutDegree());
54 metrics.add(new NodeTypeMetric()); 56 metrics.add(new NodeTypeMetric());
55 metrics.add(new EdgeTypeMetric()); 57 metrics.add(new EdgeTypeMetric());
56 58 var count = 1
57 //check all files in the directory with suffix 59 //check all files in the directory with suffix
58 for(String name : dir.list.filter[it| it.endsWith(suffix)]){ 60 for(String name : dir.list.filter[it| it.endsWith(suffix)]){
61 println(name)
62 println(count)
59 val file = new File(name); 63 val file = new File(name);
60 val roots = readModel(EObject, path, file.name); 64 val roots = readModel(EObject, path, file.name);
61 //add a list of metrics 65 //add a list of metrics
@@ -63,7 +67,8 @@ class GraphReader{
63 for(root : roots){ 67 for(root : roots){
64 g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes); 68 g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes);
65 } 69 }
66 70
71 count ++;
67 graphs.add(g); 72 graphs.add(g);
68 } 73 }
69 74
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
index 6af0b6c7..06e88efc 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend
@@ -4,34 +4,62 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup 4import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup
5import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl 5import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl
6import java.util.HashMap 6import java.util.HashMap
7import org.eclipse.emf.ecore.EReference
8import org.eclipse.emf.ecore.impl.EcorePackageImpl
7 9
8/** 10/**
9 * Read the sample of the distribution of a metric provided the csv file of the metric 11 * Read the sample of the distribution of a metric provided the csv file of the metric
10 */ 12 */
11class RepMetricsReader { 13class RepMetricsReader {
14 static var Domain domain;
12 static def read(Domain d){ 15 static def read(Domain d){
13 var reader = new GraphReader(YakindummPackageImpl.eINSTANCE, '.xmi'); 16 var GraphReader reader;
17 if(d == Domain.Yakindumm){
18 reader = new GraphReader(YakindummPackageImpl.eINSTANCE, '.xmi');
19 }else if (d == Domain.Ecore){
20 reader = new GraphReader(EcorePackageImpl.eINSTANCE, '.ecore');
21 }else if (d == Domain.Github){
22 // Initialize the reader with github package
23 }
14 24
25 domain = d;
15 26
16 var domainRepPath = DataName.REP_PATH + d.name + '/'; 27 var domainRepPath = DataName.REP_PATH + d.name + '/';
17 var rep = new MetricSampleGroup() 28 var rep = new MetricSampleGroup()
18 var out_d = readMetrics(reader, domainRepPath + DataName.OUT_D_REP); 29 var out_d = readMetrics(reader, domainRepPath + DataName.OUT_D_REP);
19 rep.mpcSamples = readMetrics(reader, domainRepPath + DataName.MPC_REP).mpcSamples; 30 var mpc = readMetrics(reader, domainRepPath + DataName.MPC_REP);
31 rep.mpcSamples = mpc.mpcSamples;
20 rep.outDegreeSamples = out_d.outDegreeSamples; 32 rep.outDegreeSamples = out_d.outDegreeSamples;
21 rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples; 33 rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples;
22 rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples; 34 rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples;
23 rep.edgeTypeSamples = out_d.edgeTypeSamples; 35 rep.edgeTypeSamples = mpc.edgeTypeSamples;
24 36
25 //TODO: Parameterize the prior node distribution 37 //TODO: Parameterize the prior node distribution
26 var nodeTypeSamples = new HashMap<String, Double>(); 38 var nodeTypeSamples = new HashMap<String, Double>();
27 nodeTypeSamples.put('Entry', 0.04257802080554814); 39 if(d == Domain.Yakindumm){
28 nodeTypeSamples.put('Choice', 0.1267671379034409); 40 nodeTypeSamples.put('Entry', 0.04257802080554814);
29 nodeTypeSamples.put('State', 0.1596092291277674); 41 nodeTypeSamples.put('Choice', 0.1267671379034409);
30 nodeTypeSamples.put('Transition', 0.6138636969858629); 42 nodeTypeSamples.put('State', 0.1596092291277674);
31 nodeTypeSamples.put('Statechart', 0.010136036276340358); 43 nodeTypeSamples.put('Transition', 0.6138636969858629);
32 nodeTypeSamples.put('Region', 0.04467858095492131); 44 nodeTypeSamples.put('Statechart', 0.010136036276340358);
33 nodeTypeSamples.put('Exit', 0.0018338223526273673); 45 nodeTypeSamples.put('Region', 0.04467858095492131);
34 nodeTypeSamples.put('FinalState', 0.0005334755934915977); 46 nodeTypeSamples.put('Exit', 0.0018338223526273673);
47 nodeTypeSamples.put('FinalState', 0.0005334755934915977);
48 }else if(d ==Domain.Ecore){
49 nodeTypeSamples.put('EAttribute', 0.23539778449144008);
50 nodeTypeSamples.put('EClass', 0.33081570996978854);
51 nodeTypeSamples.put('EReference', 0.30996978851963747);
52 nodeTypeSamples.put('EPackage', 0.012789526686807653);
53 nodeTypeSamples.put('EAnnotation', 0.002517623363544813);
54 nodeTypeSamples.put('EEnumLiteral', 0.07275931520644502);
55 nodeTypeSamples.put('EEnum', 0.013645518630412891);
56 nodeTypeSamples.put('EDataType', 0.004028197381671702);
57 nodeTypeSamples.put('EParameter', 0.005941591137965764);
58 nodeTypeSamples.put('EGenericType', 0.002014098690835851);
59 nodeTypeSamples.put('EOperation', 0.009415911379657605);
60 nodeTypeSamples.put('ETypeParameter', 0.0007049345417925478);
61 }
62
35 63
36 64
37 rep.nodeTypeSamples = nodeTypeSamples; 65 rep.nodeTypeSamples = nodeTypeSamples;
@@ -42,7 +70,14 @@ class RepMetricsReader {
42 * Read representative model 70 * Read representative model
43 */ 71 */
44 private static def readMetrics(GraphReader r, String path){ 72 private static def readMetrics(GraphReader r, String path){
45 var model = r.readModels(path).head; 73 val model = r.readModels(path).head;
74 if(domain == Domain.Ecore){
75 var refsToRemove = EcorePackageImpl.eINSTANCE.eAllContents.filter(EReference).filter[
76 it.name.equals('eGenericType') || it.name.equals('eGenericSuperTypes') || it.name.equals('eFactoryInstance') ||
77 it.name.equals('eGenericExceptions') || it.name.equals('references') || it.name.equals('contents');
78 ];
79 refsToRemove.forEach[model.removeReference(it)];
80 }
46 return model.evaluateAllMetricsToSamples(); 81 return model.evaluateAllMetricsToSamples();
47 } 82 }
48 83
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/MultiplexParticipationCoefficientMetric.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/MultiplexParticipationCoefficientMetric.xtend
index d9c88bb4..eafa49b2 100644
--- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/MultiplexParticipationCoefficientMetric.xtend
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/MultiplexParticipationCoefficientMetric.xtend
@@ -9,11 +9,11 @@ import org.eclipse.emf.ecore.EObject
9class MultiplexParticipationCoefficientMetric extends Metric { 9class MultiplexParticipationCoefficientMetric extends Metric {
10 public static val countName = "MPCCount"; 10 public static val countName = "MPCCount";
11 public static val valueName = "MPCValue"; 11 public static val valueName = "MPCValue";
12 12 val formatter = new DecimalFormat("#0.00000");
13 13
14 override evaluate(GraphStatistic g) { 14 override evaluate(GraphStatistic g) {
15 //because the precision issue of double, we translate double values into String to be the key 15 //because the precision issue of double, we translate double values into String to be the key
16 val formatter = new DecimalFormat("#0.00000"); 16
17 17
18 //get number of different types 18 //get number of different types
19 val typeCounts = g.allTypes.size; 19 val typeCounts = g.allTypes.size;
@@ -75,6 +75,6 @@ class MultiplexParticipationCoefficientMetric extends Metric {
75 coef = 0; 75 coef = 0;
76 } 76 }
77 77
78 return coef; 78 return Double.parseDouble(formatter.format(coef));
79 } 79 }
80} \ No newline at end of file 80} \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ConstraintCollection.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ConstraintCollection.xtend
new file mode 100644
index 00000000..685c5836
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ConstraintCollection.xtend
@@ -0,0 +1,80 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation
2
3import java.util.ArrayList
4import java.util.HashMap
5import java.util.List
6import java.util.Map
7import org.eclipse.emf.common.notify.Notifier
8import org.eclipse.emf.common.util.URI
9import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl
10import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification
11import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine
12import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup
13import org.eclipse.viatra.query.runtime.emf.EMFScope
14
15class ConstraintCollection{
16 val constraints = new ArrayList<IConstraintSpecification>();
17 var BaseGeneratedPatternGroup patterns;
18 var List<Notifier> resources = new ArrayList<Notifier>();
19
20
21 new(List<IConstraintSpecification> constraints, List<String> uris, BaseGeneratedPatternGroup patterns){
22 this.constraints.addAll(constraints);
23 this.patterns = patterns;
24 setURIs(uris);
25 }
26
27 new(List<IConstraintSpecification> constraints, BaseGeneratedPatternGroup patterns){
28 this.constraints.addAll(constraints);
29 this.patterns = patterns;
30 }
31
32 def addModel(Notifier n ){
33 resources.add(n);
34 }
35
36 def setURIs(List<String> uris){
37 val resSet = new ResourceSetImpl();
38
39 for(uri : uris){
40 var resource = resSet.getResource(URI.createURI(uri), true);
41 resources.add(resource);
42 }
43
44 println('reading model finished')
45 }
46
47 def List<Integer> calculateViolations(){
48 var results = new ArrayList<Integer>();
49
50 for(resource : resources){
51 val engine = initEngine(resource);
52 var matches = constraints.stream.mapToInt([ele| ele.querySpecification.getMatcher(engine).countMatches]).sum();
53 results.add(matches);
54 }
55
56 return results;
57 }
58
59 def ArrayList<Map<String, Integer>> calculateViolationMaps(){
60 val result = new ArrayList<Map<String, Integer>>()
61
62 for(resource : resources){
63 val map = new HashMap<String, Integer>();
64 val engine = initEngine(resource);
65 constraints.forEach[
66 var count = it.querySpecification.getMatcher(engine).countMatches;
67 map.put(it.querySpecification.simpleName, count);
68 ];
69 result.add(map);
70 }
71 return result;
72 }
73
74 private def initEngine(Notifier r){
75 var engine = ViatraQueryEngine.on(new EMFScope(r));
76 //init patterns with the new engine
77 patterns.prepare(engine);
78 return engine;
79 }
80}
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
new file mode 100644
index 00000000..72239e22
--- /dev/null
+++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend
@@ -0,0 +1,69 @@
1package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation
2
3import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain
4import com.google.common.reflect.ClassPath
5import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns
6import java.util.ArrayList
7import org.eclipse.emf.ecore.EObject
8import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification
9
10class ViolationCheck {
11 /**
12 * Return the total number of violations
13 */
14 def static int calculateViolationCounts(EObject root, Domain d){
15 var packageName = '';
16 if(d == Domain.Yakindumm){
17 packageName = 'constraints.yakindumm';
18 }else if (d == Domain.Ecore){
19 //TODO: put constraints package names for ecore and github models
20 return -1;
21 }else if (d == Domain.Github){
22 return -1;
23 }
24
25
26 var constriants = loadConstraints(packageName);
27 var collections = new ConstraintCollection(constriants, Patterns.instance);
28 collections.addModel(root);
29 var results = collections.calculateViolations();
30 if(results.size > 0){
31 return results.get(0);
32 }else{
33 throw new IllegalArgumentException("Calculate Violation Failed");
34 }
35 }
36
37 /**
38 * return a map contain the count for each type of violation
39 */
40 def static violationMaps(EObject root){
41 var constriants = loadConstraints('hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu');
42 var collections = new ConstraintCollection(constriants, Patterns.instance);
43 collections.addModel(root);
44 var results = collections.calculateViolationMaps();
45 if(results.size > 0){
46 return results.get(0);
47 }else{
48 throw new IllegalArgumentException("Calculate Violation Failed");
49 }
50 }
51
52 def static loadConstraints(String packageName){
53 val constraints = new ArrayList<IConstraintSpecification>();
54
55 val classPath = ClassPath.from(ClassLoader.systemClassLoader);
56 val classInfos = classPath.getTopLevelClasses(packageName);
57
58 for(info : classInfos){
59 if(info.load.interfaces.contains(IConstraintSpecification)){
60 //IConstraintSpecification only has one constructor with empty argument list
61 var constructor = info.load.constructors.get(0);
62 var instance = constructor.newInstance();
63 constraints.add(instance as IConstraintSpecification);
64 }
65 }
66
67 return constraints
68 }
69}
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/input/.gitignore b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/input/.gitignore
new file mode 100644
index 00000000..b3934b01
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/input/.gitignore
@@ -0,0 +1,3 @@
1# ignore everything in this folder
2*
3!.gitignore \ No newline at end of file
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png
new file mode 100644
index 00000000..3ba463f4
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png
new file mode 100644
index 00000000..ed6c1c43
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png
new file mode 100644
index 00000000..bfb0f1fd
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png
new file mode 100644
index 00000000..f7349c93
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png
new file mode 100644
index 00000000..a8790329
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb
new file mode 100644
index 00000000..bfae000e
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb
@@ -0,0 +1,338 @@
1{
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": 1,
6 "metadata": {},
7 "outputs": [],
8 "source": [
9 "import matplotlib.pyplot as plt\n",
10 "import statistics\n",
11 "import os\n",
12 "import sys\n",
13 "lib_path = os.path.abspath(os.path.join('..','..', '..', 'utils'))\n",
14 "sys.path.append(lib_path)\n",
15 "from GraphType import GraphStat\n",
16 "import readCSV as reader\n",
17 "import constants\n",
18 "import DistributionMetrics as metrics"
19 ]
20 },
21 {
22 "cell_type": "code",
23 "execution_count": 2,
24 "metadata": {},
25 "outputs": [],
26 "source": [
27 "def getModels(folderName, numberOfModels):\n",
28 " filenames = reader.readmultiplefiles(folderName, numberOfModels, False)\n",
29 " graphStats = [GraphStat(filename) for filename in filenames]\n",
30 " return graphStats"
31 ]
32 },
33 {
34 "cell_type": "markdown",
35 "metadata": {},
36 "source": [
37 "## Import"
38 ]
39 },
40 {
41 "cell_type": "code",
42 "execution_count": 33,
43 "metadata": {},
44 "outputs": [],
45 "source": [
46 "domain = 'yakindumm'\n",
47 "mpc_guide = getModels('../input/{}/MPC/'.format(domain), 100)\n",
48 "na_guide = getModels('../input/{}/NodeActivity/'.format(domain), 100)\n",
49 "od_guide = getModels('../input/{}/OutDegree/'.format(domain), 100)\n",
50 "nt_guide = getModels('../input/{}/NodeType/'.format(domain), 100)\n",
51 "composite_guide = getModels('../input/{}/Composite/'.format(domain), 100)\n",
52 "composite_no_violations_guide = getModels('../input/{}/Composite_Without_Violations/'.format(domain), 100)\n",
53 "violations_guide = getModels('../input/{}/Violations/'.format(domain), 100)\n",
54 "human = getModels('../input/{}/Human/'.format(domain), 304)\n",
55 "model_types = [human, composite_guide, mpc_guide, na_guide, od_guide, nt_guide, composite_no_violations_guide, violations_guide]"
56 ]
57 },
58 {
59 "cell_type": "code",
60 "execution_count": 34,
61 "metadata": {},
62 "outputs": [],
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}"
65 ]
66 },
67 {
68 "cell_type": "code",
69 "execution_count": 35,
70 "metadata": {},
71 "outputs": [],
72 "source": [
73 "# import rep\n",
74 "mpc_rep = getModels('../input/{}/MPC_REP/'.format(domain), 1)\n",
75 "na_rep = getModels('../input/{}/NA_REP/'.format(domain), 1)\n",
76 "od_rep = getModels('../input/{}/OUT_DEGREE_REP/'.format(domain), 1)\n",
77 "rep = mpc_rep[0]\n",
78 "rep.na = na_rep[0].na\n",
79 "rep.out_d = od_rep[0].out_d\n",
80 "rep.nodeTypeStat = type_map"
81 ]
82 },
83 {
84 "cell_type": "markdown",
85 "metadata": {},
86 "source": [
87 "### Helper Functions"
88 ]
89 },
90 {
91 "cell_type": "code",
92 "execution_count": 36,
93 "metadata": {},
94 "outputs": [],
95 "source": [
96 "def calculate_ks(dist1, dist2):\n",
97 " value, p= metrics.ks_distance(dist1, dist2)\n",
98 " return value"
99 ]
100 },
101 {
102 "cell_type": "code",
103 "execution_count": 37,
104 "metadata": {},
105 "outputs": [],
106 "source": [
107 "def mkdir(path):\n",
108 " if not os.path.exists(path):\n",
109 " os.makedirs(path)"
110 ]
111 },
112 {
113 "cell_type": "markdown",
114 "metadata": {},
115 "source": [
116 "### Plot Config"
117 ]
118 },
119 {
120 "cell_type": "code",
121 "execution_count": 46,
122 "metadata": {},
123 "outputs": [],
124 "source": [
125 "labels = ['human', 'combined', 'mpc', 'node activity', 'out degree', 'node type', 'combined_nv', 'violations']\n",
126 "output_path = '../output/{}/'.format(domain)\n",
127 "mkdir(output_path)"
128 ]
129 },
130 {
131 "cell_type": "markdown",
132 "metadata": {},
133 "source": [
134 "### Draw diagrams"
135 ]
136 },
137 {
138 "cell_type": "code",
139 "execution_count": 47,
140 "metadata": {},
141 "outputs": [],
142 "source": [
143 "def drawBoxDiagram(title, target, types, distance_func):\n",
144 " distances = []\n",
145 " for distributions in types:\n",
146 " distances.append([distance_func(target, distribution) for distribution in distributions])\n",
147 " fig, ax1 = plt.subplots()\n",
148 " fig.set_size_inches(5, 4)\n",
149 " ax1.set_xticklabels(labels, rotation=45, fontsize=15)\n",
150 " #plt.title(title, fontsize=20)\n",
151 " plt.boxplot(distances)\n",
152 " plt.savefig('{}/{}.png'.format(output_path, title), dpi=500, bbox_inches=\"tight\")"
153 ]
154 },
155 {
156 "cell_type": "code",
157 "execution_count": 48,
158 "metadata": {},
159 "outputs": [
160 {
161 "data": {
162 "image/png": "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\n",
163 "text/plain": [
164 "<Figure size 360x288 with 1 Axes>"
165 ]
166 },
167 "metadata": {
168 "needs_background": "light"
169 },
170 "output_type": "display_data"
171 }
172 ],
173 "source": [
174 "# draw mpc\n",
175 "mpc_types = []\n",
176 "for models in model_types:\n",
177 " mpc_types.append([model.mpc for model in models])\n",
178 "drawBoxDiagram('MPC', rep.mpc, mpc_types, calculate_ks)"
179 ]
180 },
181 {
182 "cell_type": "code",
183 "execution_count": 49,
184 "metadata": {},
185 "outputs": [
186 {
187 "data": {
188 "image/png": "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\n",
189 "text/plain": [
190 "<Figure size 360x288 with 1 Axes>"
191 ]
192 },
193 "metadata": {
194 "needs_background": "light"
195 },
196 "output_type": "display_data"
197 }
198 ],
199 "source": [
200 "# draw node activity\n",
201 "na_types = []\n",
202 "for models in model_types:\n",
203 " na_types.append([model.na for model in models])\n",
204 "drawBoxDiagram('Node_Activity', rep.na, na_types, calculate_ks)"
205 ]
206 },
207 {
208 "cell_type": "code",
209 "execution_count": 50,
210 "metadata": {},
211 "outputs": [
212 {
213 "data": {
214 "image/png": "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\n",
215 "text/plain": [
216 "<Figure size 360x288 with 1 Axes>"
217 ]
218 },
219 "metadata": {
220 "needs_background": "light"
221 },
222 "output_type": "display_data"
223 }
224 ],
225 "source": [
226 "# draw out degree\n",
227 "out_d_types = []\n",
228 "for models in model_types:\n",
229 " out_d_types.append([model.out_d for model in models])\n",
230 "drawBoxDiagram('Out_Degree', rep.out_d, out_d_types, calculate_ks)"
231 ]
232 },
233 {
234 "cell_type": "code",
235 "execution_count": 51,
236 "metadata": {},
237 "outputs": [],
238 "source": [
239 "def manual_ks(pdf1, pdf2):\n",
240 " result = 0\n",
241 " sum1 = 0\n",
242 " sum2 = 0\n",
243 " for(a, b) in zip(pdf1, pdf2):\n",
244 " sum1 += a\n",
245 " sum2 += b\n",
246 " result = max(result, abs(sum1-sum2))\n",
247 " return result\n"
248 ]
249 },
250 {
251 "cell_type": "code",
252 "execution_count": 52,
253 "metadata": {},
254 "outputs": [
255 {
256 "data": {
257 "image/png": "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\n",
258 "text/plain": [
259 "<Figure size 360x288 with 1 Axes>"
260 ]
261 },
262 "metadata": {
263 "needs_background": "light"
264 },
265 "output_type": "display_data"
266 }
267 ],
268 "source": [
269 "# draw node type\n",
270 "types = rep.nodeTypeStat.keys()\n",
271 "rep_type_dist = [float(rep.nodeTypeStat[key]) for key in types]\n",
272 "node_type_types = []\n",
273 "for models in model_types:\n",
274 " type_dists = []\n",
275 " for model in models:\n",
276 " type_dists.append([float(model.nodeTypeStat.get(key, 0)) for key in types])\n",
277 " node_type_types.append(type_dists)\n",
278 "\n",
279 "#since we already know the pdf, we can compute the ks distance manually\n",
280 "drawBoxDiagram('Node_Type', rep_type_dist, node_type_types, manual_ks)"
281 ]
282 },
283 {
284 "cell_type": "code",
285 "execution_count": 53,
286 "metadata": {},
287 "outputs": [
288 {
289 "data": {
290 "image/png": "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\n",
291 "text/plain": [
292 "<Figure size 360x288 with 1 Axes>"
293 ]
294 },
295 "metadata": {
296 "needs_background": "light"
297 },
298 "output_type": "display_data"
299 }
300 ],
301 "source": [
302 "# draw violations\n",
303 "violation_types = []\n",
304 "for models in model_types:\n",
305 " violation_types.append([model.violations for model in models])\n",
306 "drawBoxDiagram('Violations', None, violation_types, lambda a, b:b)"
307 ]
308 },
309 {
310 "cell_type": "code",
311 "execution_count": null,
312 "metadata": {},
313 "outputs": [],
314 "source": []
315 }
316 ],
317 "metadata": {
318 "kernelspec": {
319 "display_name": "Python 3",
320 "language": "python",
321 "name": "python3"
322 },
323 "language_info": {
324 "codemirror_mode": {
325 "name": "ipython",
326 "version": 3
327 },
328 "file_extension": ".py",
329 "mimetype": "text/x-python",
330 "name": "python",
331 "nbconvert_exporter": "python",
332 "pygments_lexer": "ipython3",
333 "version": "3.7.3"
334 }
335 },
336 "nbformat": 4,
337 "nbformat_minor": 2
338}
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
index 1d17b819..b76e1162 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png
index 64eee192..7c1e381e 100644
--- 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
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
index eb298324..b6c865a8 100644
--- 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
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
new file mode 100644
index 00000000..e734a9c2
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png
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
new file mode 100644
index 00000000..a4f9033f
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png
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
new file mode 100644
index 00000000..343550b4
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png
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
new file mode 100644
index 00000000..8795605d
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png
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
new file mode 100644
index 00000000..5abfa423
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png
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
new file mode 100644
index 00000000..e21d38f8
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/MPC.png
new file mode 100644
index 00000000..d6531283
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Node Activity.png
new file mode 100644
index 00000000..f6abf122
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Node Activity.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Out Degree.png
new file mode 100644
index 00000000..aebdb83c
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human rep-Viatra (75 nodes)-/Out Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/MPC.png
new file mode 100644
index 00000000..b92655a7
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Node Activity.png
new file mode 100644
index 00000000..f9004fad
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Node Activity.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Out Degree.png
new file mode 100644
index 00000000..080eda75
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Human_No_anno-/Out Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/MPC.png
new file mode 100644
index 00000000..3acff7a8
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/MPC.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Node Activity.png
new file mode 100644
index 00000000..4c44074c
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Node Activity.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Out Degree.png
new file mode 100644
index 00000000..6a1added
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-No-Annotations-Viatra (75 nodes)-/Out Degree.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
new file mode 100644
index 00000000..da20de14
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png
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
new file mode 100644
index 00000000..0c60d130
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png
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
new file mode 100644
index 00000000..e2cadbc5
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png
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
new file mode 100644
index 00000000..ccd02aca
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png
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
new file mode 100644
index 00000000..1edf0945
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png
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
new file mode 100644
index 00000000..1e70734b
--- /dev/null
+++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png
Binary files differ
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py
index d761ef82..eb9d4ae2 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,31 +12,31 @@ import DistributionMetrics as metrics
12 12
13def main(): 13def main():
14 # read models 14 # read models
15 human = GraphCollection('../input/yakindumm/human_output_100/', 500, 'Human') 15 human = GraphCollection('../input/human_30_500_no_xml/', 500, 'human_no_xml')
16 human_na = GraphCollection('../input/yakindumm/human_output_100/na_rep/', 1, 'Human rep') 16 human2 = GraphCollection('../input/human_30_500_xml/', 500, 'human_xml')
17 human_mpc = GraphCollection('../input/yakindumm/human_output_100/mpc_rep/', 1, 'Human rep') 17 # human_na = GraphCollection('../input/human_models_50_500/na_rep/', 1, 'Human rep')
18 human_od = GraphCollection('../input/yakindumm/human_output_100/od_rep/', 1, 'Human rep') 18 # human_mpc = GraphCollection('../input/human_models_50_500/mpc_rep/', 1, 'Human rep')
19 # human_od = GraphCollection('../input/human_models_50_500/od_rep/', 1, 'Human rep')
19 20
20 #viatra75 = GraphCollection('../input/viatra_75/', 500, 'Viatra (75 nodes)') 21 # viatra75 = GraphCollection('../input/viatra_75/', 500, 'Viatra (75 nodes)')
21 # viatra30 = GraphCollection('../input/viatraOutput30/', 500,'Viatra (30 nodes)') 22 # viatra30 = GraphCollection('../input/viatraOutput30/', 500,'Viatra (30 nodes)')
22 # viatra60 = GraphCollection('../input/viatraOutput60/', 500, 'Viatra (60 nodes)') 23 # viatra60 = GraphCollection('../input/viatraOutput60/', 500, 'Viatra (60 nodes)')
23 # viatra100 = GraphCollection('../input/viatraOutput100/', 500, 'Viatra (100 nodes)') 24 # viatra100 = GraphCollection('../input/viatraOutput100/', 500, 'Viatra (100 nodes)')
24 # viatra100R = GraphCollection('../input/realisticViatraOutput_newMetric/', 500, 'Realistic Viatra (100 nodes)') 25 # viatra100R = GraphCollection('../input/realisticViatraOutput_newMetric/', 500, 'Realistic Viatra (100 nodes)')
25 viatra100C = GraphCollection('../input/yakindumm/viatraOutput100C/', 500, 'Viatra consistent (100 nodes)') 26 # viatra100C = GraphCollection('../input/yakindumm/viatraOutput100C/', 500, 'Viatra consistent (100 nodes)')
26 # viatra100EE = GraphCollection('../input/realisticViatra_excludeExit/', 500, 'Realistic Viatra no Exit (100 nodes)') 27 # viatra100EE = GraphCollection('../input/realisticViatra_excludeExit/', 500, 'Realistic Viatra no Exit (100 nodes)')
27 # viatra100EEF = GraphCollection('../input/realisticViatra_excludeExitFinal/', 500, 'Realistic Viatra no Exit Final (100 nodes)') 28 # viatra100EEF = GraphCollection('../input/realisticViatra_excludeExitFinal/', 500, 'Realistic Viatra no Exit Final (100 nodes)')
28 viatra100NT = GraphCollection('../input/yakindumm/realisticVIatraOutput_nodeTypeKS/', 500, 'Realistic Viatra with Node Type KS (100 nodes)') 29 # viatra100NT = GraphCollection('../input/yakindumm/realisticVIatraOutput_nodeTypeKS/', 500, 'Realistic Viatra with Node Type KS (100 nodes)')
29 30
30 # random = GraphCollection('../input/randomOutput/', 500, 'Random') 31 # random = GraphCollection('../input/randomOutput/', 500, 'Random')
31 # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)') 32 # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)')
32 # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)') 33 # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)')
33 # human100 = GraphCollection('../input/human_output_100/', 304, 'Human') 34 models_to_compare_na = [human, human2]
34 models_to_compare_na = [human, human_na, viatra100C,viatra100NT] 35 models_to_compare_mpc = [human, human2]
35 models_to_compare_mpc = [human, human_mpc ,viatra100C,viatra100NT] 36 models_to_compare_od = [human, human2]
36 models_to_compare_od = [human, human_od, viatra100C,viatra100NT]
37 37
38 # define output folder 38 # define output folder
39 outputFolder = '../output/Yakindumm/' 39 outputFolder = '../output/'
40 40
41 #calculate metrics 41 #calculate metrics
42 metricStat(models_to_compare_na, 'Node Activity', nodeActivity, 0, outputFolder) 42 metricStat(models_to_compare_na, 'Node Activity', nodeActivity, 0, outputFolder)
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 543b0ab7..8d7b1bc3 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
@@ -64,16 +64,16 @@
64 }, 64 },
65 { 65 {
66 "cell_type": "code", 66 "cell_type": "code",
67 "execution_count": 3, 67 "execution_count": 27,
68 "metadata": {}, 68 "metadata": {},
69 "outputs": [ 69 "outputs": [
70 { 70 {
71 "data": { 71 "data": {
72 "text/plain": [ 72 "text/plain": [
73 "231" 73 "198"
74 ] 74 ]
75 }, 75 },
76 "execution_count": 3, 76 "execution_count": 27,
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_models_75/', 1300, False)\n", 93 "humanFiles = reader.readmultiplefiles('../input/human_30_500_no_xml/', 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": 4, 118 "execution_count": 28,
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": 5, 167 "execution_count": 29,
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_models_75\\146.csv\n", 174 "../input/human_30_500_no_xml\\rdm_run_1.csv\n",
175 "../input/human_models_75\\146.csv\n" 175 "../input/human_30_500_no_xml\\rdm_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": 6, 188 "execution_count": 30,
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.14846721554626746\n", 195 "average distance: 0.1120958646931491\n",
196 "median: 0.11344781014856264\n", 196 "median: 0.07794784580498866\n",
197 "std: 0.0839789139821567\n", 197 "std: 0.10338893965532157\n",
198 "max: 0.40999194198227235\n", 198 "max: 0.8512271307452031\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": 7, 245 "execution_count": 31,
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_models_75\\97.csv\n", 252 "../input/human_30_500_no_xml\\XSHMLMT_run_1.csv\n",
253 "../input/human_models_75\\97.csv\n" 253 "../input/human_30_500_no_xml\\XSHMLMT_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": 8, 266 "execution_count": 32,
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.16296252607812808\n", 273 "average distance: 0.11606713468404145\n",
274 "median: 0.11606886657101867\n", 274 "median: 0.08615545879696823\n",
275 "std: 0.1196590575339798\n", 275 "std: 0.09424733847431985\n",
276 "max: 0.49411764705882355\n", 276 "max: 0.8536367692994199\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": 9, 323 "execution_count": 33,
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_models_75\\151.csv\n", 330 "../input/human_30_500_no_xml\\Sql_run_1.csv\n",
331 "../input/human_models_75\\151.csv\n" 331 "../input/human_30_500_no_xml\\Sql_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": 10, 344 "execution_count": 34,
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.18751521685526348\n", 351 "average distance: 0.1365610722702415\n",
352 "median: 0.13400833829660508\n", 352 "median: 0.10589419186354082\n",
353 "std: 0.13829078925748192\n", 353 "std: 0.09795223151686845\n",
354 "max: 0.5745366639806608\n", 354 "max: 0.8574673315618971\n",
355 "min: 0.0\n" 355 "min: 0.0\n"
356 ] 356 ]
357 } 357 }
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 ba62c3b1..8f01040d 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": 9, 5 "execution_count": 5,
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": 10, 21 "execution_count": 6,
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": 11, 33 "execution_count": 7,
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": 12, 55 "execution_count": 5,
56 "metadata": { 56 "metadata": {
57 "scrolled": true 57 "scrolled": true
58 }, 58 },
@@ -61,24 +61,12 @@
61 "name": "stdout", 61 "name": "stdout",
62 "output_type": "stream", 62 "output_type": "stream",
63 "text": [ 63 "text": [
64 "['EAttribute', 'EGenericType', 'ETypeParameter', 'EPackage', 'EOperation', 'EStringToStringMapEntry', 'EEnum', 'EDataType', 'EClass', 'EReference', 'EObject', 'EEnumLiteral', 'EAnnotation', 'EParameter']\n" 64 "['EParameter', 'EStringToStringMapEntry', 'EOperation', 'EAttribute', 'ETypeParameter', 'EClass', 'EReference', 'EDataType', 'EGenericType', 'EEnum', 'EAnnotation', 'EEnumLiteral', 'EPackage']\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": [
71 "<Figure size 432x288 with 1 Axes>"
72 ]
73 },
74 "metadata": {
75 "needs_background": "light"
76 },
77 "output_type": "display_data"
78 },
79 {
80 "data": {
81 "image/png": "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\n",
82 "text/plain": [ 70 "text/plain": [
83 "<Figure size 432x288 with 1 Axes>" 71 "<Figure size 432x288 with 1 Axes>"
84 ] 72 ]
@@ -90,7 +78,7 @@
90 }, 78 },
91 { 79 {
92 "data": { 80 "data": {
93 "image/png": "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\n", 81 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAZMklEQVR4nO3df5RdZX3v8ffHhF8WJEgmCEnsgMQliNdAp5SWrhaJLRCvBCu04aKkNKuBCi5ZtLWg9Sq1VOwtpmWVohGQwLKEFEVGC1Z+1uK9CQwSAyFSpxDJkEgGgQgNIAnf+8d+RjYnZ+bsmfNjZp58XmvNmrOf/ex9vs+c5HP2ec4+ZysiMDOzvLxhvAswM7PWc7ibmWXI4W5mliGHu5lZhhzuZmYZcribmWXI4W4tJ+mtkl6QNGW8a2mWpGslfXy86zAbLYf7LkrSBkkvphAe+vlHSbtLukzSQGp7XNLSmu3eO9K+I+KJiNg7InY0WeMXS7X9XNIrpeXbKmx/nKRVkrZK+qmk/5D07rTuHEl3NNpHRPxhRPxtM+NI97enpJC0UdIbSu17SHpW0kvN3kfa3wpJL9c8rvdV3PZSSVe1og4bfw73Xdv7UwgP/ZwHXAT0AEcD+wDvAR6sukNJU1tVXEScM1Qb8DfAjaVaT2pQx/7ALcD/AfYDZqd9vFL1/tv0ymMbMK+0vADY0uL7+GzN43p0K3Yq6Q3lJyab2PxAWa1fBW6OiE1R2BAR1wFIuh54K/DNdET4cUnd6Yh0saQngLtKbVPTdvdI+qyk70l6XtJ3JE0fukNJZ0r6cTq6/lSVVwelbT8o6RFJz0m6Q9KctOow4MWI+FpEvBoR2yLitoh4RNKRwN8Dx6Vx/CTta4Wky1N9/w38emr7y7T+REn9kj4haVDSk5LOKNUyQ9Jtkn6WXjFcWufVwfXAmaXlM4HrasZ0tqQfpr9Vv6Q/Kq0bquFiSc9IekzSaRX/Vu+QtF3SWemV2aCkP0/rTgEuABaVj/bTOP5K0mqKJ6YzJH2vZr+flLSiSg3WOQ53q7UKuEDSRyS9S5KGVkTEh4EneO2Ivzxd8dsUgXrCMPv9X8BZwAxgd+DPACQdDvwTcAZwILAvMLNKoZKOAK4FPpL2++9Ab3pSWQ/sJelqSSdImlYax4PA+cA9aRxvKe32Q8CnKF613F/nbn8ZEHAQcB7wRUl7p3XLgEHgAGAJsKjO9jcBJ0jaW9IM4FeAW2v6bAZOAt4EnANcIemdpfXdFH/Dt6T7WS7p4Lp/pJ1NoXhldigwH7hE0iER8Q3gC8DyOkf7H6J4EtoH6AXeJemQ0vozKJ60bAJxuO/avpGOeId+/hj4HPB5iv+wfcCTkuqFVK3PRMR/R8SLw6z/SkT8Z1q/Epib2k8FvhkR90bEz4H/DVT9wqPTKV5l3JO2/RtgOtATET8FjgV2A74CDEr6evkVwzBuiojV6Wj/5TrrtwGfi4hXIuLmVOuhkvYETgY+FREvRsRa4Kt1tn8B+A7wQYonvJuomSqKiN6IeDy9crqD4knrN0tdtgMXR8TP0/o7KP6OQz5Z87h+qaaGT0fESxFxP/BD4H80+JtcFRGPpjFvBb5G8e8DST0Uf/N/a7AP6zCH+67tlIiYVvr5ckTsiIgrIuJYYBpwCXCNpMMa7Gtjg/U/Kd3eBgwd7R5U3jYitgE/rVj/QcCPS9vuAJ4kHflHxMMRcWZEHETxZPI2ijn4kTQax2BEvFpaHhrLWyiO6Acq7Os6iiPhnaZkACSdLOm+NO3yHHA8RYCWayi/Aftjir/FkEtqHtezS+t2RMTTdeofSe04lpPCneKo/oaI2N5gH9ZhDncbVjoCvQJ4Fjh8qHm47mO8m83ArKEFSXsB+1fcdhPFNMnQtlMogv3JnYqLWEcxdXBEg3rHOo6fpG3LU0qzh+l7B/B2YK909PwLkn4J+Bfgs8CMiJgG3EXxxDFkenqlMOStFH+LZlX9m/w7sKekY4CFeEpmQnK42+tIOl/FKYR7SZqapmT24bUzZp4CDhl+D6N2E/B+Sb8haXfgYl4fZCO5EfiApN+StBtwIcVRf196v+B8STPTuLqBP6B4TwGKccxO2zUtHUl/E7hYxWmPR1BMu9Tr+yrFfPfv1Vm9F8VU0hbgVUknA8fV9NkN+JSK01aPB36HYqqkWU8BB5ffZ6kniu8Jv57iPYZnIqKvBfdtLeZw37UNnfUy9HMz8CJwGcWR6NPAucAHI+KxtM3ngL9Mc7l/1mwB6Yj6o8AKiqP45ymCrd58d+22a4HFwJco3sicByxIUwQ/o5invj+d+XIvcB/FEwDAt4ENwBZJA7TG2RTTI4PAVcANw40jIh6KiPV12p+meLP5mxRPVKew8xuuGyjm3X8CXAOcVXp8oAj+8uNadXwrgDcCz0j6vw36LgfehY/aJyz5Yh02kaQzT54D5kTE4+NdTzMk/QOwZ82cd7P7PBH4x4g4tFX7HGMd+1Ac6b8jIp4Yz1qsPh+527iT9H5Jb0zzzX8HPERxdDqpSDpC0jtV+A2KN0xvHu+62uSjFKeSOtgnqJZ9mtCsCQsoXt6L4vTLhTE5X1LuSzGOt1BMmfx1RHx7fEtqPRUf+tpGceqnTVCeljEzy5CnZczMMjQhpmWmT58e3d3d412Gmdmk8sADDzwdEV311k2IcO/u7qavz6fKmpmNhqQfD7fO0zJmZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhmaEJ9QbUb3hf867LoNl76vg5WYmU0cPnI3M8uQw93MLEMOdzOzDDnczcwy5HA3M8uQw93MLEMOdzOzDFUOd0lTJD0o6Vtp+WBJqyX9SNKNknZP7Xuk5f60vrs9pZuZ2XBGc+T+MWB9afnzwNKImAM8CyxO7YuBZyPiUGBp6mdmZh1UKdwlzQLeB1yVlgUcD9yUuiwHTkm3F6Rl0vp5qb+ZmXVI1SP3vwc+DryalvcHnouI7Wl5AJiZbs8ENgKk9VtT/9eRtERSn6S+wcHBMZZvZmb1NAx3Sf8T2BIRD5Sb63SNCutea4hYFhE9EdHT1dVVqVgzM6umyheHHQucLGk+sCfwJooj+WmSpqaj81nAptR/AJgNDEiaCuwLPNPyys3MbFgNj9wj4qKImBUR3cBC4K6IOAO4Gzg1dVsE3JJu96Zl0vq7ImKnI3czM2ufZs5z/wvgAkn9FHPqV6f2q4H9U/sFwIXNlWhmZqM1qu9zj4h7gHvS7ceAo+v0eQk4rQW1mZnZGPkTqmZmGXK4m5llyOFuZpYhh7uZWYYc7mZmGXK4m5llyOFuZpYhh7uZWYYc7mZmGXK4m5llyOFuZpYhh7uZWYYc7mZmGXK4m5llyOFuZpahKtdQ3VPSfZJ+IGmdpItT+7WSHpe0Jv3MTe2SdLmkfklrJR3V7kGYmdnrVblYx8vA8RHxgqTdgHsl3ZbW/XlE3FTT/yRgTvr5NeDK9NvMzDqkyjVUIyJeSIu7pZ+Rrom6ALgubbeK4kLaBzZfqpmZVVVpzl3SFElrgC3A7RGxOq26JE29LJW0R2qbCWwsbT6Q2mr3uURSn6S+wcHBJoZgZma1KoV7ROyIiLnALOBoSUcAFwHvAH4VeDPFBbMBVG8Xdfa5LCJ6IqKnq6trTMWbmVl9ozpbJiKeo7hA9okRsTlNvbwMfIXXLpY9AMwubTYL2NSCWs3MrKIqZ8t0SZqWbu8FvBf44dA8uiQBpwAPp016gTPTWTPHAFsjYnNbqjczs7qqnC1zILBc0hSKJ4OVEfEtSXdJ6qKYhlkDnJP63wrMB/qBbcBZrS/bzMxG0jDcI2ItcGSd9uOH6R/Auc2XZmZmY+VPqJqZZcjhbmaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhmqcpm9PSXdJ+kHktZJuji1HyxptaQfSbpR0u6pfY+03J/Wd7d3CGZmVqvKkfvLwPER8W5gLnBiujbq54GlETEHeBZYnPovBp6NiEOBpamfmZl1UMNwj8ILaXG39BPA8cBNqX05xUWyARakZdL6eeki2mZm1iGV5twlTZG0BtgC3A78F/BcRGxPXQaAmen2TGAjQFq/Fdi/zj6XSOqT1Dc4ONjcKMzM7HUqhXtE7IiIucAs4GjgsHrd0u96R+mxU0PEsojoiYierq6uqvWamVkFozpbJiKeA+4BjgGmSZqaVs0CNqXbA8BsgLR+X+CZVhRrZmbVVDlbpkvStHR7L+C9wHrgbuDU1G0RcEu63ZuWSevvioidjtzNzKx9pjbuwoHAcklTKJ4MVkbEtyQ9AqyQ9NfAg8DVqf/VwPWS+imO2Be2oW4zMxtBw3CPiLXAkXXaH6OYf69tfwk4rSXVmZnZmPgTqmZmGXK4m5llyOFuZpYhh7uZWYYc7mZmGXK4m5llyOFuZpYhh7uZWYYc7mZmGXK4m5llyOFuZpYhh7uZWYYc7mZmGXK4m5llyOFuZpahKldimi3pbknrJa2T9LHU/hlJT0pak37ml7a5SFK/pEclndDOAZiZ2c6qXIlpO/CnEfF9SfsAD0i6Pa1bGhF/V+4s6XCKqy+9EzgIuEPS2yNiRysLNzOz4TU8co+IzRHx/XT7eYrrp84cYZMFwIqIeDkiHgf6qXPFJjMza59RzblL6qa45N7q1HSepLWSrpG0X2qbCWwsbTZAnScDSUsk9UnqGxwcHHXhZmY2vMrhLmlv4GvA+RHxM+BK4G3AXGAzcNlQ1zqbx04NEcsioicierq6ukZduJmZDa9SuEvajSLYvxoRXweIiKciYkdEvAp8mdemXgaA2aXNZwGbWleymZk1UuVsGQFXA+sj4gul9gNL3T4APJxu9wILJe0h6WBgDnBf60o2M7NGqpwtcyzwYeAhSWtS2yeA0yXNpZhy2QCcDRAR6yStBB6hONPmXJ8pY2bWWQ3DPSLupf48+q0jbHMJcEkTdZmZWRP8CVUzsww53M3MMuRwNzPLkMPdzCxDDnczsww53M3MMuRwNzPLkMPdzCxDDnczsww53M3MMuRwNzPLkMPdzCxDDnczsww53M3MMuRwNzPLkMPdzCxDVS6zN1vS3ZLWS1on6WOp/c2Sbpf0o/R7v9QuSZdL6pe0VtJR7R6EmZm9XpUj9+3An0bEYcAxwLmSDgcuBO6MiDnAnWkZ4CSK66bOAZYAV7a8ajMzG1HDcI+IzRHx/XT7eWA9MBNYACxP3ZYDp6TbC4DrorAKmFZzMW0zM2uzUc25S+oGjgRWAwdExGYongCAGanbTGBjabOB1Fa7ryWS+iT1DQ4Ojr5yMzMbVuVwl7Q38DXg/Ij42Uhd67TFTg0RyyKiJyJ6urq6qpZhZmYVVAp3SbtRBPtXI+LrqfmpoemW9HtLah8AZpc2nwVsak25ZmZWRZWzZQRcDayPiC+UVvUCi9LtRcAtpfYz01kzxwBbh6ZvzMysM6ZW6HMs8GHgIUlrUtsngEuBlZIWA08Ap6V1twLzgX5gG3BWSys2M7OGGoZ7RNxL/Xl0gHl1+gdwbpN1mZlZE/wJVTOzDDnczcwy5HA3M8uQw93MLEMOdzOzDDnczcwy5HA3M8uQw93MLEMOdzOzDDnczcwy5HA3M8uQw93MLEMOdzOzDDnczcwy5HA3M8tQlSsxXSNpi6SHS22fkfSkpDXpZ35p3UWS+iU9KumEdhVuZmbDq3Lkfi1wYp32pRExN/3cCiDpcGAh8M60zT9JmtKqYs3MrJqG4R4R3wWeqbi/BcCKiHg5Ih6nuNTe0U3UZ2ZmY9DMnPt5ktamaZv9UttMYGOpz0Bq24mkJZL6JPUNDg42UYaZmdUaa7hfCbwNmAtsBi5L7fWutRr1dhARyyKiJyJ6urq6xliGmZnVM6Zwj4inImJHRLwKfJnXpl4GgNmlrrOATc2VaGZmozWmcJd0YGnxA8DQmTS9wEJJe0g6GJgD3NdciWZmNlpTG3WQdANwHDBd0gDwaeA4SXMpplw2AGcDRMQ6SSuBR4DtwLkRsaM9pZuZ2XAahntEnF6n+eoR+l8CXNJMUWZm1hx/QtXMLEMOdzOzDDnczcwy5HA3M8uQw93MLEMOdzOzDDnczcwy5HA3M8uQw93MLEMOdzOzDDnczcwy5HA3M8uQw93MLEMOdzOzDDnczcwy5HA3M8tQw3CXdI2kLZIeLrW9WdLtkn6Ufu+X2iXpckn9ktZKOqqdxZuZWX1VjtyvBU6sabsQuDMi5gB3pmWAkyiumzoHWAJc2ZoyzcxsNBqGe0R8F3impnkBsDzdXg6cUmq/LgqrgGk1F9M2M7MOGOuc+wERsRkg/Z6R2mcCG0v9BlLbTiQtkdQnqW9wcHCMZZiZWT2tfkNVddqiXseIWBYRPRHR09XV1eIyzMx2bWMN96eGplvS7y2pfQCYXeo3C9g09vLMzGwsxhruvcCidHsRcEup/cx01swxwNah6RszM+ucqY06SLoBOA6YLmkA+DRwKbBS0mLgCeC01P1WYD7QD2wDzmpDzWZm1kDDcI+I04dZNa9O3wDObbYoMzNrjj+hamaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhlyuJuZZcjhbmaWIYe7mVmGHO5mZhlq+H3uI5G0AXge2AFsj4geSW8GbgS6gQ3A70fEs82VaWZmo9GKI/f3RMTciOhJyxcCd0bEHODOtGxmZh3UjmmZBcDydHs5cEob7sPMzEbQbLgH8B1JD0haktoOGLoodvo9o96GkpZI6pPUNzg42GQZZmZW1tScO3BsRGySNAO4XdIPq24YEcuAZQA9PT3RZB1mZlbS1JF7RGxKv7cANwNHA09JOhAg/d7SbJFmZjY6Yw53Sb8kaZ+h28DvAg8DvcCi1G0RcEuzRZqZ2eg0My1zAHCzpKH9/HNEfFvS/cBKSYuBJ4DTmi/TzMxGY8zhHhGPAe+u0/5TYF4zRZmZWXP8CVUzsww53M3MMuRwNzPLkMPdzCxDDnczsww53M3MMuRwNzPLkMPdzCxDDnczsww1+62QE1r3hf9at33Dpe/rcCUTl/9GZnnykbuZWYYc7mZmGcp6Wmai8RTIrsGPs00EDvddwHBh08ptHFxmE4vDvQljCc2JtH+rZrIfiU/2+m1sHO4l4xWmOYR4q470HURmrdG2cJd0IvAPwBTgqoi4tF33NVo5hOlk16rHYLRPBiPd72ifQEY7Bj9xWSe1JdwlTQGuAH4HGADul9QbEY+04/4sf60K0lZvM5FM9vqttdp15H400J8uxYekFcACwOFuVmOiTQeO9EqiVbW26lWSX/UMr13hPhPYWFoeAH6t3EHSEmBJWnxB0qNjvK/pwNNj3Hay8ph3DeMyZn1+XO9jVGPuRK0d0Mzj/MvDrWhXuKtOW7xuIWIZsKzpO5L6IqKn2f1MJh7zrsFj3jW0a8zt+oTqADC7tDwL2NSm+zIzsxrtCvf7gTmSDpa0O7AQ6G3TfZmZWY22TMtExHZJ5wH/RnEq5DURsa4d90ULpnYmIY951+Ax7xraMmZFRONeZmY2qfhbIc3MMuRwNzPL0KQJd0knSnpUUr+kC+us30PSjWn9akndna+ytSqM+QJJj0haK+lOScOe8zpZNBpzqd+pkkLSpD9trsqYJf1+eqzXSfrnTtfYahX+bb9V0t2SHkz/vuePR52tIukaSVskPTzMekm6PP091ko6quk7jYgJ/0Pxpux/AYcAuwM/AA6v6fMR4Ivp9kLgxvGuuwNjfg/wxnT7T3aFMad++wDfBVYBPeNddwce5znAg8B+aXnGeNfdgTEvA/4k3T4c2DDedTc55t8CjgIeHmb9fOA2is8IHQOsbvY+J8uR+y++ziAifg4MfZ1B2QJgebp9EzBPUr0PU00WDcccEXdHxLa0uIri8wSTWZXHGeCzwN8CL3WyuDapMuY/Bq6IiGcBImJLh2tstSpjDuBN6fa+TPLPyUTEd4FnRuiyALguCquAaZIObOY+J0u41/s6g5nD9YmI7cBWYP+OVNceVcZctpjimX8yazhmSUcCsyPiW50srI2qPM5vB94u6XuSVqVvXJ3Mqoz5M8CHJA0AtwIf7Uxp42a0/98bmizf597w6wwq9plMKo9H0oeAHuC321pR+404ZklvAJYCf9ipgjqgyuM8lWJq5jiKV2f/IemIiHiuzbW1S5Uxnw5cGxGXSfp14Po05lfbX964aHl+TZYj9ypfZ/CLPpKmUryUG+ll0ERX6SscJL0X+CRwckS83KHa2qXRmPcBjgDukbSBYm6yd5K/qVr13/YtEfFKRDwOPEoR9pNVlTEvBlYCRMT/A/ak+IKtXLX8K1smS7hX+TqDXmBRun0qcFekdyomqYZjTlMUX6II9sk+DwsNxhwRWyNiekR0R0Q3xfsMJ0dE3/iU2xJV/m1/g+LNcyRNp5imeayjVbZWlTE/AcwDkHQYRbgPdrTKzuoFzkxnzRwDbI2IzU3tcbzfRR7Fu83zgf+keJf9k6ntryj+c0Px4P8L0A/cBxwy3jV3YMx3AE8Ba9JP73jX3O4x1/S9h0l+tkzFx1nAFyiuh/AQsHC8a+7AmA8HvkdxJs0a4HfHu+Ymx3sDsBl4heIofTFwDnBO6TG+Iv09HmrFv2t//YCZWYYmy7SMmZmNgsPdzCxDDnczsww53M3MMuRwNzPLkMPdzCxDDnczswz9f3HITODo+FGHAAAAAElFTkSuQmCC\n",
94 "text/plain": [ 82 "text/plain": [
95 "<Figure size 432x288 with 1 Axes>" 83 "<Figure size 432x288 with 1 Axes>"
96 ] 84 ]
@@ -102,7 +90,7 @@
102 }, 90 },
103 { 91 {
104 "data": { 92 "data": {
105 "image/png": "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\n", 93 "image/png": "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\n",
106 "text/plain": [ 94 "text/plain": [
107 "<Figure size 432x288 with 1 Axes>" 95 "<Figure size 432x288 with 1 Axes>"
108 ] 96 ]
@@ -114,7 +102,7 @@
114 }, 102 },
115 { 103 {
116 "data": { 104 "data": {
117 "image/png": "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\n", 105 "image/png": "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\n",
118 "text/plain": [ 106 "text/plain": [
119 "<Figure size 432x288 with 1 Axes>" 107 "<Figure size 432x288 with 1 Axes>"
120 ] 108 ]
@@ -126,7 +114,7 @@
126 }, 114 },
127 { 115 {
128 "data": { 116 "data": {
129 "image/png": "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\n", 117 "image/png": "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\n",
130 "text/plain": [ 118 "text/plain": [
131 "<Figure size 432x288 with 1 Axes>" 119 "<Figure size 432x288 with 1 Axes>"
132 ] 120 ]
@@ -138,7 +126,7 @@
138 }, 126 },
139 { 127 {
140 "data": { 128 "data": {
141 "image/png": "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\n", 129 "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAP90lEQVR4nO3de4zlZ13H8feHllqEQik7rZteGJBF2VQpZCxFErkUSGWxrUnBIpclWdkAYjCQ6CqJAvrHQmIxxCa4WMIKAq0V6EpVLEsrSmhh15ZeKNhS1tLsprvQKwi1l69/nN/COp3Z+c3Muewz+34lJ+d3O+d8nzlnPvPMc57fOakqJEntecykC5AkLY0BLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANch60kleQZk65DWioDXE1LsivJj5L84IDLX3X7Vie5KMmeJPcn+WaS9yR5/KTrlobBANdK8BtV9YQDLm9LchzwFeBxwPOr6hjgZcCxwM9PslhpWAxwrVTvAO4HXldVuwCq6rtV9faqun72wUnWJbk2yX1Jvpvk3QfsOzrJx5N8P8k9Sb6W5IRu3xuT3Nb18L+T5LXjaZ4ER066AGlEXgp8uqoe6Xn8D4E3ADcBpwJXJLmuqj4LrAeeBJwMPACcBvyoG4r5IPArVfWtJKuB44bcDmle9sC1Eny26xnvv7wJeAqwp+8dVNVVVXVDVT3S9dA/Cbyw2/1gd3/PqKqHq2pnVd3X7XsEODXJ46pqT1XdNMR2SQdlgGslOLeqjj3g8mHg+8DqvneQ5HlJrkyyL8m9wJuBVd3ujwGfBz6VZHeS9yd5bFX9EPit7tg9SS5P8ovDbZo0PwNcK9UXgN9M0vc1/glgG3ByVT0J+BAQgKp6sKreU1VrgV8FXslguIWq+nxVvYzBH4tvAh8ebjOk+RngWqkuAJ4IbE3yVIAkJya5IMkvz3H8McBdVfXjJKcDv71/R5IXJ/mlJEcA9zEYUnk4yQlJzu7Gwh8AfgA8POJ2ST9hgGsl+MdZ88A/U1V3MegtPwhck+R+YDtwL3DrHPfxVuC93XF/AlxywL6fAy5lEN43A/8GfJzB7887gd3AXQzGzN86igZKc4lf6CBJbbIHLkmNMsAlqVEGuCQ1ygCXpEaN9VT6VatW1fT09DgfUpKat3Pnzu9V1dTs7WMN8OnpaXbs2DHOh5Sk5iX577m2O4QiSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmN8lvp1dv0psvn3bdr87oxViIJegZ4kl3A/Qy+LuqhqppJchxwMTAN7AJeXVV3j6ZMSdJsixlCeXFVnVZVM936JmB7Va1h8FVVm4ZenSRpXssZAz8H2NotbwXOXX45kqS++gZ4Af+aZGeSjd22E6pqD0B3ffxcN0yyMcmOJDv27du3/IolSUD/NzFfUFW7kxwPXJHkm30foKq2AFsAZmZm/AZlSRqSXj3wqtrdXe8FPgOcDtyZZDVAd713VEVKkh5twQBP8vgkx+xfBl4O3AhsA9Z3h60HLhtVkZKkR+szhHIC8Jkk+4//RFX9S5KvAZck2QDcDrxqdGVKkmZbMMCr6jbg2XNs/z5w5iiKkiQtzFPpJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqVO8AT3JEkmuTfK5bf1qSa5LckuTiJEeNrkxJ0myL6YG/Hbj5gPX3AR+oqjXA3cCGYRYmSTq4XgGe5CRgHfA33XqAlwCXdodsBc4dRYGSpLn17YH/JfAHwCPd+lOAe6rqoW79DuDEuW6YZGOSHUl27Nu3b1nFSpJ+asEAT/JKYG9V7Txw8xyH1ly3r6otVTVTVTNTU1NLLFOSNNuRPY55AXB2klcARwNPZNAjPzbJkV0v/CRg9+jKlCTNtmAPvKr+qKpOqqpp4Hzgi1X1WuBK4LzusPXAZSOrUpL0KMuZB/6HwDuS3MpgTPyi4ZQkSeqjzxDKT1TVVcBV3fJtwOnDL0mS1IdnYkpSowxwSWqUAS5JjVrUGLjGa3rT5XNu37V53ZgrkXQosgcuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjnAe+gjhvXDq82AOXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRzc8Dd+6zpMOVPXBJapQBLkmNMsAlqVHNj4HPZ7Fj45McS5/vsSXpYOyBS1KjDHBJapQBLkmNWrFj4FqYc+ilttkDl6RGGeCS1CgDXJIa5Rj4CDi2LGkcFuyBJzk6yVeTfD3JTUne021/WpJrktyS5OIkR42+XEnSfn2GUB4AXlJVzwZOA85KcgbwPuADVbUGuBvYMLoyJUmzLRjgNfCDbvWx3aWAlwCXdtu3AueOpEJJ0px6jYEnOQLYCTwDuBD4NnBPVT3UHXIHcOI8t90IbAQ45ZRTlltv0yb1mSd+1oq0MvWahVJVD1fVacBJwOnAs+Y6bJ7bbqmqmaqamZqaWnqlkqT/Z1HTCKvqHuAq4Azg2CT7e/AnAbuHW5ok6WD6zEKZSnJst/w44KXAzcCVwHndYeuBy0ZVpCTp0fqMga8Gtnbj4I8BLqmqzyX5BvCpJH8OXAtcNMI6JUmzLBjgVXU98Jw5tt/GYDxckjQBnkovSY0ywCWpUYfdZ6E4J1rSSmEPXJIaZYBLUqMMcElq1GE3Bq6FDfN9Aj8bXRode+CS1CgDXJIaZYBLUqOaGQN3/vZP+bOQBPbAJalZBrgkNcoAl6RGNTMGPikHG292LvNPOS4vjZ89cElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGuU88GVw7rOkSbIHLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWrUggGe5OQkVya5OclNSd7ebT8uyRVJbumunzz6ciVJ+/XpgT8EvLOqngWcAfxukrXAJmB7Va0BtnfrkqQxWTDAq2pPVf1nt3w/cDNwInAOsLU7bCtw7qiKlCQ92qLGwJNMA88BrgFOqKo9MAh54PhhFydJml/vAE/yBOAfgN+vqvsWcbuNSXYk2bFv376l1ChJmkOvAE/yWAbh/XdV9elu851JVnf7VwN757ptVW2pqpmqmpmamhpGzZIk+s1CCXARcHNVXXDArm3A+m55PXDZ8MuTJM2nz+eBvwB4PXBDkuu6bX8MbAYuSbIBuB141WhKlCTNZcEAr6r/ADLP7jOHW44kqS/PxJSkRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVF9TuSRxmZ60+Vzbt+1ed2YK5EOffbAJalRBrgkNcoAl6RGOQauiZhvrFtSf/bAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEb5nZhqwmK/Q3PX5nVDuf/F3o80Tgv2wJN8JMneJDcesO24JFckuaW7fvJoy5QkzdZnCOWjwFmztm0CtlfVGmB7ty5JGqMFA7yqvgTcNWvzOcDWbnkrcO6Q65IkLWCpb2KeUFV7ALrr4+c7MMnGJDuS7Ni3b98SH06SNNvIZ6FU1ZaqmqmqmampqVE/nCQdNpYa4HcmWQ3QXe8dXkmSpD6WGuDbgPXd8nrgsuGUI0nqa8F54Ek+CbwIWJXkDuBPgc3AJUk2ALcDrxplkdJiLXbeuNSiBQO8ql4zz64zh1yLJGkRPJVekhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktQoA1ySGmWAS1KjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYdOekCpBZNb7p80bfZtXndSB97WPevdtgDl6RGGeCS1CgDXJIa5Ri4NGGOaS/d4f6zswcuSY0ywCWpUQa4JDXKMXDpIJYy33sc97WY+x/1ePChOA59KNY0CsvqgSc5K8m3ktyaZNOwipIkLWzJAZ7kCOBC4NeBtcBrkqwdVmGSpINbTg/8dODWqrqtqv4X+BRwznDKkiQtJFW1tBsm5wFnVdXvdOuvB55XVW+bddxGYGO3+gvAt5ZY6yrge0u8bats8+HBNq98y23vU6tqavbG5byJmTm2PeqvQVVtAbYs43EGD5bsqKqZ5d5PS2zz4cE2r3yjau9yhlDuAE4+YP0kYPfyypEk9bWcAP8asCbJ05IcBZwPbBtOWZKkhSx5CKWqHkryNuDzwBHAR6rqpqFV9mjLHoZpkG0+PNjmlW8k7V3ym5iSpMnyVHpJapQBLkmNOuQCfKHT85P8TJKLu/3XJJkef5XD1aPN70jyjSTXJ9me5KmTqHOY+n4MQ5LzklSSpqec9Wlvkld3z/NNST4x7hqHrcfr+pQkVya5tnttv2ISdQ5Tko8k2Zvkxnn2J8kHu5/J9Umeu6wHrKpD5sLgzdBvA08HjgK+DqyddcxbgQ91y+cDF0+67jG0+cXAz3bLbzkc2twddwzwJeBqYGbSdY/4OV4DXAs8uVs/ftJ1j6HNW4C3dMtrgV2TrnsI7f414LnAjfPsfwXwzwzOozkDuGY5j3eo9cD7nJ5/DrC1W74UODPJXCcVtWLBNlfVlVX1P93q1Qzm3Les78cw/BnwfuDH4yxuBPq0903AhVV1N0BV7R1zjcPWp80FPLFbfhIr4DySqvoScNdBDjkH+NsauBo4NsnqpT7eoRbgJwLfPWD9jm7bnMdU1UPAvcBTxlLdaPRp84E2MPgL3rIF25zkOcDJVfW5cRY2In2e42cCz0zy5SRXJzlrbNWNRp82vxt4XZI7gH8Cfm88pU3UYn/fD+pQ+zzwPqfn9zqFvyG925PkdcAM8MKRVjR6B21zkscAHwDeOK6CRqzPc3wkg2GUFzH4D+vfk5xaVfeMuLZR6dPm1wAfraq/SPJ84GNdmx8ZfXkTM9T8OtR64H1Oz//JMUmOZPCv18H+ZTnU9fpIgiQvBd4FnF1VD4yptlFZqM3HAKcCVyXZxWCscFvDb2T2fV1fVlUPVtV3GHzo25ox1TcKfdq8AbgEoKq+AhzN4EOfVrKhfgTJoRbgfU7P3was75bPA75Y3bsDjVqwzd1wwl8zCO/Wx0ZhgTZX1b1VtaqqpqtqmsG4/9lVtWMy5S5bn9f1Zxm8WU2SVQyGVG4ba5XD1afNtwNnAiR5FoMA3zfWKsdvG/CGbjbKGcC9VbVnyfc26Xdt53mX9r8YvIP9rm7bexn8AsPgSf574Fbgq8DTJ13zGNr8BeBO4Lrusm3SNY+6zbOOvYqGZ6H0fI4DXAB8A7gBOH/SNY+hzWuBLzOYoXId8PJJ1zyENn8S2AM8yKC3vQF4M/DmA57nC7ufyQ3LfV17Kr0kNepQG0KRJPVkgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RG/R9RJW0yZ0628wAAAABJRU5ErkJggg==\n",
142 "text/plain": [ 130 "text/plain": [
143 "<Figure size 432x288 with 1 Axes>" 131 "<Figure size 432x288 with 1 Axes>"
144 ] 132 ]
@@ -150,7 +138,7 @@
150 }, 138 },
151 { 139 {
152 "data": { 140 "data": {
153 "image/png": "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\n", 141 "image/png": "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\n",
154 "text/plain": [ 142 "text/plain": [
155 "<Figure size 432x288 with 1 Axes>" 143 "<Figure size 432x288 with 1 Axes>"
156 ] 144 ]
@@ -162,7 +150,7 @@
162 }, 150 },
163 { 151 {
164 "data": { 152 "data": {
165 "image/png": "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\n", 153 "image/png": "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\n",
166 "text/plain": [ 154 "text/plain": [
167 "<Figure size 432x288 with 1 Axes>" 155 "<Figure size 432x288 with 1 Axes>"
168 ] 156 ]
@@ -174,7 +162,7 @@
174 }, 162 },
175 { 163 {
176 "data": { 164 "data": {
177 "image/png": "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\n", 165 "image/png": "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\n",
178 "text/plain": [ 166 "text/plain": [
179 "<Figure size 432x288 with 1 Axes>" 167 "<Figure size 432x288 with 1 Axes>"
180 ] 168 ]
@@ -186,7 +174,7 @@
186 }, 174 },
187 { 175 {
188 "data": { 176 "data": {
189 "image/png": "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\n", 177 "image/png": "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\n",
190 "text/plain": [ 178 "text/plain": [
191 "<Figure size 432x288 with 1 Axes>" 179 "<Figure size 432x288 with 1 Axes>"
192 ] 180 ]
@@ -198,7 +186,7 @@
198 }, 186 },
199 { 187 {
200 "data": { 188 "data": {
201 "image/png": "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\n", 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",
202 "text/plain": [ 190 "text/plain": [
203 "<Figure size 432x288 with 1 Axes>" 191 "<Figure size 432x288 with 1 Axes>"
204 ] 192 ]
@@ -210,7 +198,7 @@
210 }, 198 },
211 { 199 {
212 "data": { 200 "data": {
213 "image/png": "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\n", 201 "image/png": "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\n",
214 "text/plain": [ 202 "text/plain": [
215 "<Figure size 432x288 with 1 Axes>" 203 "<Figure size 432x288 with 1 Axes>"
216 ] 204 ]
@@ -222,7 +210,7 @@
222 }, 210 },
223 { 211 {
224 "data": { 212 "data": {
225 "image/png": "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\n", 213 "image/png": "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\n",
226 "text/plain": [ 214 "text/plain": [
227 "<Figure size 432x288 with 1 Axes>" 215 "<Figure size 432x288 with 1 Axes>"
228 ] 216 ]
@@ -234,7 +222,7 @@
234 } 222 }
235 ], 223 ],
236 "source": [ 224 "source": [
237 "drawTypeDistributions('../input/human_models_75/', 1500)" 225 "drawTypeDistributions('../input/human/', 1500)"
238 ] 226 ]
239 }, 227 },
240 { 228 {
@@ -433,7 +421,7 @@
433 }, 421 },
434 { 422 {
435 "cell_type": "code", 423 "cell_type": "code",
436 "execution_count": 8, 424 "execution_count": 4,
437 "metadata": {}, 425 "metadata": {},
438 "outputs": [], 426 "outputs": [],
439 "source": [ 427 "source": [
@@ -467,25 +455,28 @@
467 "name": "stdout", 455 "name": "stdout",
468 "output_type": "stream", 456 "output_type": "stream",
469 "text": [ 457 "text": [
470 "{'EAnnotation': 0.04240463215258856, 'EClass': 0.1558242506811989, 'EAttribute': 0.12880336058128974, 'EStringToStringMapEntry': 0.07317211625794733, 'EGenericType': 0.3791439600363306, 'EReference': 0.14208673932788374, 'EPackage': 0.01759763851044505, 'EDataType': 0.005619891008174387, 'EEnumLiteral': 0.03139191643960036, 'EEnum': 0.008174386920980926, 'EOperation': 0.009366485013623978, 'EParameter': 0.00607402361489555, 'ETypeParameter': 0.00022706630336058128, 'EObject': 0.00011353315168029064}\n" 458 "0.9999999999999998\n",
459 "{'EAttribute': 0.23539778449144008, 'EClass': 0.30996978851963747, 'EReference': 0.33081570996978854, 'EPackage': 0.012789526686807653, 'EAnnotation': 0.002517623363544813, 'EEnumLiteral': 0.07275931520644502, 'EEnum': 0.013645518630412891, 'EDataType': 0.004028197381671702, 'EParameter': 0.005941591137965764, 'EGenericType': 0.002014098690835851, 'EOperation': 0.009415911379657605, 'ETypeParameter': 0.0007049345417925478}\n"
471 ] 460 ]
472 } 461 }
473 ], 462 ],
474 "source": [ 463 "source": [
475 "import numpy as np\n", 464 "import numpy as np\n",
476 "import scipy.stats as stats\n", 465 "import scipy.stats as stats\n",
477 "graphStats = getModels('../input/human_models_75/', 1500)\n", 466 "graphStats = getModels('../input/human_30_500_no_xml/', 1500)\n",
478 "totalNodes = sum(list(map(lambda g: g.numNodes, graphStats)))[0]\n", 467 "totalNodes = 0\n",
479 "typeMap = {}\n", 468 "typeMap = {}\n",
480 "for g in graphStats:\n", 469 "for g in graphStats:\n",
481 " gKeys = g.nodeTypeStat.keys()\n", 470 " gKeys = g.nodeTypeStat.keys()\n",
482 " size = g.numNodes[0]\n", 471 " size = g.numNodes[0]\n",
472 " totalNodes += size\n",
483 " for key in gKeys:\n", 473 " for key in gKeys:\n",
484 " curNum = typeMap.get(key, 0)\n", 474 " curNum = typeMap.get(key, 0)\n",
485 " typeMap[key] = curNum + float(g.nodeTypeStat[key]) * size\n", 475 " typeMap[key] = curNum + float(g.nodeTypeStat[key]) * size\n",
486 "\n", 476 " \n",
487 "for key in typeMap.keys():\n", 477 "for key in typeMap.keys():\n",
488 " typeMap[key] /= totalNodes\n", 478 " typeMap[key] /= totalNodes\n",
479 "print(sum(typeMap.values()))\n",
489 "print(typeMap)" 480 "print(typeMap)"
490 ] 481 ]
491 }, 482 },
@@ -550,32 +541,70 @@
550 }, 541 },
551 { 542 {
552 "cell_type": "code", 543 "cell_type": "code",
553 "execution_count": 32, 544 "execution_count": 20,
554 "metadata": {}, 545 "metadata": {},
555 "outputs": [], 546 "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 ],
556 "source": [ 583 "source": [
557 "import matplotlib.pyplot as plt\n", 584 "import matplotlib.pyplot as plt\n",
558 "from shutil import copyfile\n", 585 "from shutil import copyfile\n",
586 "import statistics \n",
559 "\n", 587 "\n",
560 "# graphStats = getModels('../input/human_models/', 1500)\n", 588 "graphStats = getModels('../input/human_30_500_no_xml/', 1500)\n",
561 "# sizes = []\n", 589 "sizes = []\n",
562 "filenames = reader.readmultiplefiles('../input/human_models/', 1500, False)\n", 590 "filenames = reader.readmultiplefiles('../input/human/', 1500, False)\n",
563 "count = 1\n", 591 "count = 1\n",
564 "for filename in filenames:\n", 592 "# for filename in filenames:\n",
565 " graphStat = GraphStat(filename)\n", 593 "# graphStat = GraphStat(filename)\n",
566 " size = graphStat.numNodes[0]\n", 594 "# size = graphStat.numNodes[0]\n",
567 " if(size <= 87 and size >= 67):\n", 595 "# if size >= 30 and size <= 500 and not ('EAnnotation' in graphStat.nodeTypeStat.keys() and 'EStringToStringMapEntry' in graphStat.nodeTypeStat.keys()):\n",
568 " copyfile(filename, '../input/human_models_75/{}.csv'.format(count))\n", 596 "# copyfile(filename, filename.replace('human', 'human_30_500_no_xml'))\n",
569 " count+=1\n",
570 " \n",
571 " \n", 597 " \n",
572 " \n", 598 " \n",
573 "# for g in graphStats:\n", 599 "for g in graphStats:\n",
574 "# size = g.numNodes[0]\n", 600 " size = g.numNodes[0]\n",
575 " \n", 601 " if size >= 30 and size <= 500 and not ('EAnnotation' in g.nodeTypeStat.keys() and 'EStringToStringMapEntry' in g.nodeTypeStat.keys()):\n",
576 "# print(min(sizes))\n", 602 " sizes.append(g.numNodes[0])\n",
577 "# print(len(sizes))\n", 603 "print(max(sizes))\n",
578 "# plt.hist(sizes, bins=10)\n" 604 "print(min(sizes))\n",
605 "print(statistics.mean(sizes))\n",
606 "print(len(sizes))\n",
607 "plt.hist(sizes, bins=10)\n"
579 ] 608 ]
580 }, 609 },
581 { 610 {
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py
index feb9a0a9..0a9a95c5 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py
+++ b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py
@@ -30,3 +30,6 @@ class GraphStat:
30 self.id = (contents[constants.STATE_ID])[0] 30 self.id = (contents[constants.STATE_ID])[0]
31 if constants.Node_TYPE_KEY in contents: 31 if constants.Node_TYPE_KEY in contents:
32 self.nodeTypeStat = contents[constants.Node_TYPE_KEY] 32 self.nodeTypeStat = contents[constants.Node_TYPE_KEY]
33 if constants.VIOLATION in contents:
34 self.violations = int(contents[constants.VIOLATION][0])
35
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py b/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py
index 51e538f8..be115a05 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py
+++ b/Metrics/Metrics-Calculation/metrics_plot/utils/constants.py
@@ -28,3 +28,5 @@ HUMAN_MPC_REP = '../input/humanOutput/R_2016324_run_1.csv'
28 28
29HUMAN_NA_REP = '../input/humanOutput/R_2017419_run_1.csv' 29HUMAN_NA_REP = '../input/humanOutput/R_2017419_run_1.csv'
30 30
31VIOLATION = 'violations'
32
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py b/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py
index 1cec2f0c..394168d8 100644
--- a/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py
+++ b/Metrics/Metrics-Calculation/metrics_plot/utils/readCSV.py
@@ -30,6 +30,8 @@ def readcsvfile(filename):
30 elif(arr[0] == constants.NODE_TYPE): 30 elif(arr[0] == constants.NODE_TYPE):
31 types = data[i+1].replace('\n', '').split(',') 31 types = data[i+1].replace('\n', '').split(',')
32 numbers = data[i+2].replace('\n', '').split(',') 32 numbers = data[i+2].replace('\n', '').split(',')
33 #convert number to floats
34 numbers = [float(n) for n in numbers]
33 contents[constants.Node_TYPE_KEY] = {t : n for t, n in zip(types, numbers)} 35 contents[constants.Node_TYPE_KEY] = {t : n for t, n in zip(types, numbers)}
34 # NA and OD are integers, and store other information as string 36 # NA and OD are integers, and store other information as string
35 else: 37 else: