diff options
author | 20001LastOrder <boqi.chen@mail.mcgill.ca> | 2019-08-13 18:10:02 -0400 |
---|---|---|
committer | 20001LastOrder <boqi.chen@mail.mcgill.ca> | 2019-08-13 18:10:02 -0400 |
commit | a882ad00515e730bad5e52fa29b74f461a5b9cd6 (patch) | |
tree | 5c892f1dc5b501aa3f7355e97f24cca277a473db /Metrics | |
parent | Configurations for generation and new domain for generation ecore model (diff) | |
download | VIATRA-Generator-a882ad00515e730bad5e52fa29b74f461a5b9cd6.tar.gz VIATRA-Generator-a882ad00515e730bad5e52fa29b74f461a5b9cd6.tar.zst VIATRA-Generator-a882ad00515e730bad5e52fa29b74f461a5b9cd6.zip |
change exploration value function
Diffstat (limited to 'Metrics')
82 files changed, 5817 insertions, 1334 deletions
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF index a3f5076e..833b6fd8 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/META-INF/MANIFEST.MF | |||
@@ -8,6 +8,8 @@ Bundle-Vendor: %providerName | |||
8 | Bundle-Localization: plugin | 8 | Bundle-Localization: plugin |
9 | Export-Package: ca.mcgill.ecse.socialnetwork.plugin, | 9 | Export-Package: ca.mcgill.ecse.socialnetwork.plugin, |
10 | ca.mcgill.ecse.socialnetwork.runner, | 10 | ca.mcgill.ecse.socialnetwork.runner, |
11 | constraints.ecore, | ||
12 | ecore, | ||
11 | queries, | 13 | queries, |
12 | socialnetwork, | 14 | socialnetwork, |
13 | socialnetwork.impl, | 15 | socialnetwork.impl, |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore index 8b962bcf..464c03f5 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/bin/.gitignore | |||
@@ -1,5 +1,7 @@ | |||
1 | /ca/ | 1 | /ca/ |
2 | /constraints/ | ||
2 | /ecore.ecore | 3 | /ecore.ecore |
4 | /ecore/ | ||
3 | /queries/ | 5 | /queries/ |
4 | /socialnetwork.aird | 6 | /socialnetwork.aird |
5 | /socialnetwork.ecore | 7 | /socialnetwork.ecore |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore deleted file mode 100644 index 57088b0c..00000000 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/San.ecore +++ /dev/null | |||
@@ -1,104 +0,0 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
3 | xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="San" nsURI="http://San/1.0" nsPrefix="San"> | ||
4 | <eClassifiers xsi:type="ecore:EClass" name="Network" eSuperTypes="#//NamedElement"> | ||
5 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> | ||
6 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="port" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> | ||
7 | <eStructuralFeatures xsi:type="ecore:EReference" name="processes" upperBound="-1" | ||
8 | eType="#//Process" containment="true"/> | ||
9 | <eStructuralFeatures xsi:type="ecore:EReference" name="devices" upperBound="-1" | ||
10 | eType="#//Device" containment="true"/> | ||
11 | <eStructuralFeatures xsi:type="ecore:EReference" name="instruments" upperBound="-1" | ||
12 | eType="#//Instrument" containment="true"/> | ||
13 | <eStructuralFeatures xsi:type="ecore:EReference" name="measurands" upperBound="-1" | ||
14 | eType="#//Measurand" containment="true"/> | ||
15 | <eStructuralFeatures xsi:type="ecore:EReference" name="measures" upperBound="-1" | ||
16 | eType="#//Measure" containment="true"/> | ||
17 | <eStructuralFeatures xsi:type="ecore:EReference" name="bindings" upperBound="-1" | ||
18 | eType="#//Binding" containment="true"/> | ||
19 | <eStructuralFeatures xsi:type="ecore:EReference" name="triggers" upperBound="-1" | ||
20 | eType="#//Trigger" containment="true"/> | ||
21 | </eClassifiers> | ||
22 | <eClassifiers xsi:type="ecore:EClass" name="NamedElement"> | ||
23 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> | ||
24 | </eClassifiers> | ||
25 | <eClassifiers xsi:type="ecore:EClass" name="Device" eSuperTypes="#//NamedElement"> | ||
26 | <eStructuralFeatures xsi:type="ecore:EReference" name="instrument" lowerBound="1" | ||
27 | eType="#//Instrument"/> | ||
28 | <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1" | ||
29 | eType="#//Argument" containment="true"/> | ||
30 | </eClassifiers> | ||
31 | <eClassifiers xsi:type="ecore:EClass" name="Instrument" eSuperTypes="#//NamedElement"> | ||
32 | <eStructuralFeatures xsi:type="ecore:EReference" name="features" ordered="false" | ||
33 | upperBound="-1" eType="#//Feature" changeable="false" containment="true"/> | ||
34 | <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1" | ||
35 | eType="#//Parameter" containment="true"/> | ||
36 | </eClassifiers> | ||
37 | <eClassifiers xsi:type="ecore:EClass" name="Measurand" eSuperTypes="#//NamedElement"> | ||
38 | <eStructuralFeatures xsi:type="ecore:EReference" name="measurand" eType="#//Measurand"/> | ||
39 | </eClassifiers> | ||
40 | <eClassifiers xsi:type="ecore:EClass" name="Binding" eSuperTypes="#//NamedElement"> | ||
41 | <eStructuralFeatures xsi:type="ecore:EReference" name="device" lowerBound="1" | ||
42 | eType="#//Device"/> | ||
43 | <eStructuralFeatures xsi:type="ecore:EReference" name="measurand" lowerBound="1" | ||
44 | eType="#//Measurand"/> | ||
45 | <eStructuralFeatures xsi:type="ecore:EReference" name="feature" lowerBound="1" | ||
46 | eType="#//Feature"/> | ||
47 | </eClassifiers> | ||
48 | <eClassifiers xsi:type="ecore:EClass" name="Measure" eSuperTypes="#//NamedElement"> | ||
49 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="unit" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/> | ||
50 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" eType="#//Datatype"/> | ||
51 | </eClassifiers> | ||
52 | <eClassifiers xsi:type="ecore:EClass" name="Parameter" eSuperTypes="#//NamedElement"> | ||
53 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" lowerBound="1" eType="#//Datatype"/> | ||
54 | </eClassifiers> | ||
55 | <eClassifiers xsi:type="ecore:EClass" name="Argument" eSuperTypes="#//NamedElement"> | ||
56 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/> | ||
57 | <eStructuralFeatures xsi:type="ecore:EReference" name="parameter" eType="#//Parameter"/> | ||
58 | </eClassifiers> | ||
59 | <eClassifiers xsi:type="ecore:EClass" name="Feature" eSuperTypes="#//NamedElement"> | ||
60 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="factor" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt" | ||
61 | defaultValueLiteral="0"/> | ||
62 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="mode" eType="#//Mode" defaultValueLiteral="Input"/> | ||
63 | <eStructuralFeatures xsi:type="ecore:EReference" name="measure" eType="#//Measure"/> | ||
64 | </eClassifiers> | ||
65 | <eClassifiers xsi:type="ecore:EEnum" name="Datatype"> | ||
66 | <eLiterals name="Boolean"/> | ||
67 | <eLiterals name="Date" value="1"/> | ||
68 | <eLiterals name="Double" value="2"/> | ||
69 | <eLiterals name="Float" value="3"/> | ||
70 | <eLiterals name="Integer" value="4"/> | ||
71 | <eLiterals name="Long" value="5"/> | ||
72 | <eLiterals name="String" value="6"/> | ||
73 | <eLiterals name="Time" value="7"/> | ||
74 | <eLiterals name="TimeStamp" value="8"/> | ||
75 | <eLiterals name="Uri" value="9"/> | ||
76 | <eLiterals name="Uuid" value="10"/> | ||
77 | </eClassifiers> | ||
78 | <eClassifiers xsi:type="ecore:EEnum" name="Mode"> | ||
79 | <eLiterals name="Input"/> | ||
80 | <eLiterals name="Output" value="1"/> | ||
81 | </eClassifiers> | ||
82 | <eClassifiers xsi:type="ecore:EClass" name="Process" eSuperTypes="#//NamedElement"> | ||
83 | <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1" | ||
84 | eType="#//Parameter" containment="true"/> | ||
85 | </eClassifiers> | ||
86 | <eClassifiers xsi:type="ecore:EClass" name="Trigger"> | ||
87 | <eStructuralFeatures xsi:type="ecore:EReference" name="process" lowerBound="1" | ||
88 | eType="#//Process"/> | ||
89 | <eStructuralFeatures xsi:type="ecore:EReference" name="arguments" upperBound="-1" | ||
90 | eType="#//Argument" containment="true"/> | ||
91 | </eClassifiers> | ||
92 | <eClassifiers xsi:type="ecore:EClass" name="Event" eSuperTypes="#//Trigger"> | ||
93 | <eStructuralFeatures xsi:type="ecore:EReference" name="binding" lowerBound="1" | ||
94 | eType="#//Binding"/> | ||
95 | </eClassifiers> | ||
96 | <eClassifiers xsi:type="ecore:EClass" name="Task" eSuperTypes="#//Trigger"> | ||
97 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="period" lowerBound="1" | ||
98 | eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"/> | ||
99 | </eClassifiers> | ||
100 | <eClassifiers xsi:type="ecore:EClass" name="Thing" eSuperTypes="#//Trigger"> | ||
101 | <eStructuralFeatures xsi:type="ecore:EReference" name="instrument" lowerBound="1" | ||
102 | eType="#//Instrument"/> | ||
103 | </eClassifiers> | ||
104 | </ecore:EPackage> | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/Sql.ecore index 65d72135..65d72135 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/Sql.ecore +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/mpc_rep/Sql.ecore | |||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore new file mode 100644 index 00000000..5c01ab01 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/data/Ecore/out_d_rep/rdm.ecore | |||
@@ -0,0 +1,178 @@ | |||
1 | <?xml version="1.0" encoding="ISO-8859-1"?> | ||
2 | <xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"> | ||
3 | <ecore:EPackage name="PrimitiveTypes"> | ||
4 | <eClassifiers xsi:type="ecore:EDataType" name="Integer"/> | ||
5 | <eClassifiers xsi:type="ecore:EDataType" name="Long"/> | ||
6 | <eClassifiers xsi:type="ecore:EDataType" name="Float"/> | ||
7 | <eClassifiers xsi:type="ecore:EDataType" name="Double"/> | ||
8 | <eClassifiers xsi:type="ecore:EDataType" name="Boolean"/> | ||
9 | <eClassifiers xsi:type="ecore:EDataType" name="String"/> | ||
10 | </ecore:EPackage> | ||
11 | <ecore:EPackage name="RDM"> | ||
12 | <eClassifiers xsi:type="ecore:EClass" name="DifferentFrom" eSuperTypes="/1/PredicateSymbol"/> | ||
13 | <eClassifiers xsi:type="ecore:EClass" name="SameAs" eSuperTypes="/1/PredicateSymbol"/> | ||
14 | <eClassifiers xsi:type="ecore:EClass" name="IndividualVariable" eSuperTypes="/1/Variable"> | ||
15 | <eStructuralFeatures xsi:type="ecore:EReference" name="classRef" ordered="false" eType="/1/ODM/Class"/> | ||
16 | </eClassifiers> | ||
17 | <eClassifiers xsi:type="ecore:EClass" name="DataVariable" eSuperTypes="/1/Variable"/> | ||
18 | <eClassifiers xsi:type="ecore:EClass" name="Constant" eSuperTypes="/1/Term"/> | ||
19 | <eClassifiers xsi:type="ecore:EClass" name="Variable" eSuperTypes="/1/Term"> | ||
20 | <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" eType="/1/ODM/Datatype"/> | ||
21 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
22 | </eClassifiers> | ||
23 | <eClassifiers xsi:type="ecore:EClass" name="Term" abstract="true"/> | ||
24 | <eClassifiers xsi:type="ecore:EClass" name="BuiltIn" eSuperTypes="/1/PredicateSymbol"> | ||
25 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="buildInID" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
26 | </eClassifiers> | ||
27 | <eClassifiers xsi:type="ecore:EClass" name="PredicateSymbol"/> | ||
28 | <eClassifiers xsi:type="ecore:EClass" name="Atom"> | ||
29 | <eStructuralFeatures xsi:type="ecore:EReference" name="hasPredicateSymbol" ordered="false" lowerBound="1" eType="/1/PredicateSymbol"/> | ||
30 | <eStructuralFeatures xsi:type="ecore:EReference" name="terms" upperBound="-1" eType="/1/Term"/> | ||
31 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
32 | </eClassifiers> | ||
33 | <eClassifiers xsi:type="ecore:EClass" name="Consequent"> | ||
34 | <eStructuralFeatures xsi:type="ecore:EReference" name="containsAtom" ordered="false" upperBound="-1" eType="/1/Atom"/> | ||
35 | </eClassifiers> | ||
36 | <eClassifiers xsi:type="ecore:EClass" name="Antecedent"> | ||
37 | <eStructuralFeatures xsi:type="ecore:EReference" name="containsAtom" ordered="false" upperBound="-1" eType="/1/Atom"/> | ||
38 | </eClassifiers> | ||
39 | <eClassifiers xsi:type="ecore:EClass" name="Rule" eSuperTypes="/1/ODM/OntologyElement"> | ||
40 | <eStructuralFeatures xsi:type="ecore:EReference" name="hasAntecedent" ordered="false" lowerBound="1" eType="/1/Antecedent"/> | ||
41 | <eStructuralFeatures xsi:type="ecore:EReference" name="hasConsequent" ordered="false" lowerBound="1" eType="/1/Consequent"/> | ||
42 | </eClassifiers> | ||
43 | <eSubpackages name="ODM"> | ||
44 | <eClassifiers xsi:type="ecore:EClass" name="MinCardinalityRestriction" eSuperTypes="/1/ODM/Restriction"> | ||
45 | <eStructuralFeatures xsi:type="ecore:EReference" name="minCardinality" ordered="false" lowerBound="1" eType="/1/ODM/TypedLiteral"/> | ||
46 | </eClassifiers> | ||
47 | <eClassifiers xsi:type="ecore:EClass" name="MaxCardinalityRestriction" eSuperTypes="/1/ODM/Restriction"> | ||
48 | <eStructuralFeatures xsi:type="ecore:EReference" name="maxCardinality" ordered="false" lowerBound="1" eType="/1/ODM/TypedLiteral"/> | ||
49 | </eClassifiers> | ||
50 | <eClassifiers xsi:type="ecore:EClass" name="CardinalityRestriction" eSuperTypes="/1/ODM/Restriction"> | ||
51 | <eStructuralFeatures xsi:type="ecore:EReference" name="cardinality" ordered="false" lowerBound="1" eType="/1/ODM/TypedLiteral"/> | ||
52 | </eClassifiers> | ||
53 | <eClassifiers xsi:type="ecore:EClass" name="TransitiveProperty" eSuperTypes="/1/ODM/ObjectProperty"/> | ||
54 | <eClassifiers xsi:type="ecore:EClass" name="SymmetricProperty" eSuperTypes="/1/ODM/ObjectProperty"/> | ||
55 | <eClassifiers xsi:type="ecore:EClass" name="InverseFunctionalProperty" eSuperTypes="/1/ODM/ObjectProperty"/> | ||
56 | <eClassifiers xsi:type="ecore:EClass" name="FunctionalProperty" eSuperTypes="/1/ODM/Property"/> | ||
57 | <eClassifiers xsi:type="ecore:EClass" name="PlainLiteral" eSuperTypes="/1/ODM/Literal"> | ||
58 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="language" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
59 | </eClassifiers> | ||
60 | <eClassifiers xsi:type="ecore:EClass" name="TypedLiteral" eSuperTypes="/1/ODM/Literal"> | ||
61 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="theType" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
62 | </eClassifiers> | ||
63 | <eClassifiers xsi:type="ecore:EClass" name="Literal" abstract="true" eSuperTypes="/1/ODM/Datatype"> | ||
64 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="lexicalForm" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
65 | </eClassifiers> | ||
66 | <eClassifiers xsi:type="ecore:EClass" name="Datatype" abstract="true" eSuperTypes="/1/ODM/OntologyElement"/> | ||
67 | <eClassifiers xsi:type="ecore:EClass" name="DataRange" eSuperTypes="/1/ODM/Class"> | ||
68 | <eStructuralFeatures xsi:type="ecore:EReference" name="datatype" ordered="false" eType="/1/ODM/Datatype"/> | ||
69 | <eStructuralFeatures xsi:type="ecore:EReference" name="oneOf" ordered="false" upperBound="-1" eType="/1/ODM/Literal"/> | ||
70 | </eClassifiers> | ||
71 | <eClassifiers xsi:type="ecore:EClass" name="AllValuesFromRestriction" eSuperTypes="/1/ODM/Restriction"> | ||
72 | <eStructuralFeatures xsi:type="ecore:EReference" name="allValuesFromRange" ordered="false" eType="/1/ODM/DataRange"/> | ||
73 | <eStructuralFeatures xsi:type="ecore:EReference" name="allValuesFromClass" ordered="false" eType="/1/ODM/Class"/> | ||
74 | </eClassifiers> | ||
75 | <eClassifiers xsi:type="ecore:EClass" name="SomeValuesFromRestriction" eSuperTypes="/1/ODM/Restriction"> | ||
76 | <eStructuralFeatures xsi:type="ecore:EReference" name="someValuesFromClass" ordered="false" eType="/1/ODM/Class"/> | ||
77 | <eStructuralFeatures xsi:type="ecore:EReference" name="someValuesFromRange" ordered="false" eType="/1/ODM/DataRange"/> | ||
78 | </eClassifiers> | ||
79 | <eClassifiers xsi:type="ecore:EClass" name="OntologyPropertyValue" eSuperTypes="/1/ODM/OntologyProperty"/> | ||
80 | <eClassifiers xsi:type="ecore:EClass" name="URI" eSuperTypes="/1/ODM/Annotation"/> | ||
81 | <eClassifiers xsi:type="ecore:EClass" name="Annotation" abstract="true"/> | ||
82 | <eClassifiers xsi:type="ecore:EClass" name="AnnotationPropertyValue"> | ||
83 | <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false" lowerBound="1" eType="/1/ODM/Annotation"/> | ||
84 | <eStructuralFeatures xsi:type="ecore:EReference" name="subject" ordered="false" lowerBound="1" eType="/1/ODM/AnnotatableElement"/> | ||
85 | <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/1/ODM/AnnotationProperty"/> | ||
86 | </eClassifiers> | ||
87 | <eClassifiers xsi:type="ecore:EClass" name="EnumeratedDatatype" eSuperTypes="/1/ODM/Datatype"> | ||
88 | <eStructuralFeatures xsi:type="ecore:EReference" name="collectionOf" ordered="false" upperBound="-1" eType="/1/ODM/DataValue"/> | ||
89 | </eClassifiers> | ||
90 | <eClassifiers xsi:type="ecore:EClass" name="PrimitiveType" eSuperTypes="/1/ODM/Datatype"/> | ||
91 | <eClassifiers xsi:type="ecore:EClass" name="HasValueRestriction" eSuperTypes="/1/ODM/Restriction"> | ||
92 | <eStructuralFeatures xsi:type="ecore:EReference" name="hasLiteralValue" ordered="false" eType="/1/ODM/Literal"/> | ||
93 | <eStructuralFeatures xsi:type="ecore:EReference" name="hasValue" ordered="false" eType="/1/ODM/Individual"/> | ||
94 | </eClassifiers> | ||
95 | <eClassifiers xsi:type="ecore:EClass" name="Restriction" abstract="true" eSuperTypes="/1/ODM/Class"> | ||
96 | <eStructuralFeatures xsi:type="ecore:EReference" name="onProperty" ordered="false" upperBound="-1" eType="/1/ODM/Property"/> | ||
97 | <eStructuralFeatures xsi:type="ecore:EReference" name="toDatatype" ordered="false" eType="/1/ODM/Datatype"/> | ||
98 | </eClassifiers> | ||
99 | <eClassifiers xsi:type="ecore:EClass" name="AllDiferent" eSuperTypes="/1/ODM/Class"> | ||
100 | <eStructuralFeatures xsi:type="ecore:EReference" name="distinctMembers" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/> | ||
101 | </eClassifiers> | ||
102 | <eClassifiers xsi:type="ecore:EClass" name="DataValue" eSuperTypes="/1/Constant /1/ODM/Annotation"> | ||
103 | <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/1/ODM/Datatype"/> | ||
104 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
105 | </eClassifiers> | ||
106 | <eClassifiers xsi:type="ecore:EClass" name="DatatypePropertyValue" eSuperTypes="/1/ODM/PropertyValue"> | ||
107 | <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false" lowerBound="1" eType="/1/ODM/DataValue"/> | ||
108 | </eClassifiers> | ||
109 | <eClassifiers xsi:type="ecore:EClass" name="ObjectPropertyValue" eSuperTypes="/1/ODM/PropertyValue"> | ||
110 | <eStructuralFeatures xsi:type="ecore:EReference" name="object" ordered="false" lowerBound="1" eType="/1/ODM/Individual"/> | ||
111 | </eClassifiers> | ||
112 | <eClassifiers xsi:type="ecore:EClass" name="PropertyValue" abstract="true"> | ||
113 | <eStructuralFeatures xsi:type="ecore:EReference" name="subject" ordered="false" lowerBound="1" eType="/1/ODM/Individual"/> | ||
114 | </eClassifiers> | ||
115 | <eClassifiers xsi:type="ecore:EClass" name="UnionClass" eSuperTypes="/1/ODM/Class"> | ||
116 | <eStructuralFeatures xsi:type="ecore:EReference" name="unionOf" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
117 | </eClassifiers> | ||
118 | <eClassifiers xsi:type="ecore:EClass" name="IntersectionClass" eSuperTypes="/1/ODM/Class"> | ||
119 | <eStructuralFeatures xsi:type="ecore:EReference" name="intersectionOf" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
120 | </eClassifiers> | ||
121 | <eClassifiers xsi:type="ecore:EClass" name="ComplementClass" eSuperTypes="/1/ODM/Class"> | ||
122 | <eStructuralFeatures xsi:type="ecore:EReference" name="complementOf" ordered="false" lowerBound="1" eType="/1/ODM/Class"/> | ||
123 | </eClassifiers> | ||
124 | <eClassifiers xsi:type="ecore:EClass" name="EnumeratedClass" eSuperTypes="/1/ODM/Class"> | ||
125 | <eStructuralFeatures xsi:type="ecore:EReference" name="oneOf" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/> | ||
126 | </eClassifiers> | ||
127 | <eClassifiers xsi:type="ecore:EClass" name="Namespace"> | ||
128 | <eStructuralFeatures xsi:type="ecore:EReference" name="members" ordered="false" upperBound="-1" eType="/1/ODM/NamedElement" containment="true"/> | ||
129 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
130 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
131 | </eClassifiers> | ||
132 | <eClassifiers xsi:type="ecore:EClass" name="DatatypeProperty" eSuperTypes="/1/ODM/Property"> | ||
133 | <eStructuralFeatures xsi:type="ecore:EReference" name="range" ordered="false" upperBound="-1" eType="/1/ODM/DataRange"/> | ||
134 | </eClassifiers> | ||
135 | <eClassifiers xsi:type="ecore:EClass" name="ObjectProperty" eSuperTypes="/1/ODM/Property"> | ||
136 | <eStructuralFeatures xsi:type="ecore:EReference" name="range" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
137 | <eStructuralFeatures xsi:type="ecore:EReference" name="inverseOf" ordered="false" upperBound="-1" eType="/1/ODM/ObjectProperty"/> | ||
138 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="transitive" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/> | ||
139 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="symmetric" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/> | ||
140 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="inverseFunctional" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/> | ||
141 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="complex" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/> | ||
142 | </eClassifiers> | ||
143 | <eClassifiers xsi:type="ecore:EClass" name="Individual" eSuperTypes="/1/Constant /1/ODM/Annotation /1/ODM/Class"> | ||
144 | <eStructuralFeatures xsi:type="ecore:EReference" name="sameAs" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/> | ||
145 | <eStructuralFeatures xsi:type="ecore:EReference" name="differentFrom" ordered="false" upperBound="-1" eType="/1/ODM/Individual"/> | ||
146 | <eStructuralFeatures xsi:type="ecore:EReference" name="type" ordered="false" lowerBound="1" eType="/1/ODM/Class"/> | ||
147 | </eClassifiers> | ||
148 | <eClassifiers xsi:type="ecore:EClass" name="Class" eSuperTypes="/1/PredicateSymbol /1/ODM/OntologyElement"> | ||
149 | <eStructuralFeatures xsi:type="ecore:EReference" name="disjointWith" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
150 | <eStructuralFeatures xsi:type="ecore:EReference" name="subClassOf" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
151 | <eStructuralFeatures xsi:type="ecore:EReference" name="equivalentClass" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
152 | </eClassifiers> | ||
153 | <eClassifiers xsi:type="ecore:EClass" name="Property" abstract="true" eSuperTypes="/1/PredicateSymbol /1/ODM/OntologyElement"> | ||
154 | <eStructuralFeatures xsi:type="ecore:EReference" name="domain" ordered="false" upperBound="-1" eType="/1/ODM/Class"/> | ||
155 | <eStructuralFeatures xsi:type="ecore:EReference" name="equivalentProperty" ordered="false" upperBound="-1" eType="/1/ODM/Property"/> | ||
156 | <eStructuralFeatures xsi:type="ecore:EReference" name="subPropertyOf" ordered="false" upperBound="-1" eType="/1/ODM/Property"/> | ||
157 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="deprecated" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/> | ||
158 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="functional" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/> | ||
159 | </eClassifiers> | ||
160 | <eClassifiers xsi:type="ecore:EClass" name="AnnotationProperty" eSuperTypes="/1/ODM/OntologyElement"/> | ||
161 | <eClassifiers xsi:type="ecore:EClass" name="OntologyProperty" abstract="true" eSuperTypes="/1/ODM/OntologyElement"/> | ||
162 | <eClassifiers xsi:type="ecore:EClass" name="OntologyElement" eSuperTypes="/1/ODM/NamedElement /1/ODM/AnnotatableElement"/> | ||
163 | <eClassifiers xsi:type="ecore:EClass" name="Ontology" eSuperTypes="/1/ODM/AnnotatableElement"> | ||
164 | <eStructuralFeatures xsi:type="ecore:EReference" name="imports" ordered="false" upperBound="-1" eType="/1/ODM/Ontology"/> | ||
165 | <eStructuralFeatures xsi:type="ecore:EReference" name="priorVersion" ordered="false" eType="/1/ODM/Ontology"/> | ||
166 | <eStructuralFeatures xsi:type="ecore:EReference" name="elements" ordered="false" upperBound="-1" eType="/1/ODM/NamedElement" containment="true"/> | ||
167 | <eStructuralFeatures xsi:type="ecore:EReference" name="incompatibleWith" ordered="false" upperBound="-1" eType="/1/ODM/Ontology"/> | ||
168 | <eStructuralFeatures xsi:type="ecore:EReference" name="reference" ordered="false" upperBound="-1" eType="/1/ODM/OntologyPropertyValue"/> | ||
169 | </eClassifiers> | ||
170 | <eClassifiers xsi:type="ecore:EClass" name="AnnotatableElement" abstract="true"/> | ||
171 | <eClassifiers xsi:type="ecore:EClass" name="NamedElement"> | ||
172 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="uri" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
173 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
174 | <eStructuralFeatures xsi:type="ecore:EAttribute" name="qualifiedName" ordered="false" unique="false" lowerBound="1" eType="/0/String"/> | ||
175 | </eClassifiers> | ||
176 | </eSubpackages> | ||
177 | </ecore:EPackage> | ||
178 | </xmi:XMI> | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt index e4925b3c..fb05996a 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/debug/errors.txt | |||
@@ -1,10 +1,12 @@ | |||
1 | Error occured (IllegalArgumentException): Class EObject is not translated to logic! | 1 | Error occured (NullPointerException): |
2 | hu.bme.mit.inf.dslreasoner.ecore2logic.EClassMapper_AllElementAsObject.TypeofEClass(EClassMapper_AllElementAsObject.java:63) | 2 | hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder.toTypeReference(LogicProblemBuilder.java:302) |
3 | hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes.createIndicatorDeclarations(EReferenceMapper_RelationsOverTypes.java:88) | 3 | hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder.lambda$11(LogicProblemBuilder.java:313) |
4 | hu.bme.mit.inf.dslreasoner.ecore2logic.EReferenceMapper_RelationsOverTypes.transformEReferences(EReferenceMapper_RelationsOverTypes.java:67) | 4 | org.eclipse.xtext.xbase.lib.ObjectExtensions.operator_doubleArrow(ObjectExtensions.java:139) |
5 | hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic.transformEReferences(Ecore2Logic.java:120) | 5 | hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicProblemBuilder.createVar(LogicProblemBuilder.java:315) |
6 | hu.bme.mit.inf.dslreasoner.ecore2logic.Ecore2Logic.transformMetamodel(Ecore2Logic.java:81) | 6 | hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic.transformBody(Viatra2Logic.java:335) |
7 | hu.bme.mit.inf.dslreasoner.application.execution.GenerationTaskExecutor.executeGenerationTask(GenerationTaskExecutor.java:189) | 7 | hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic.transformQuerySpecification(Viatra2Logic.java:237) |
8 | hu.bme.mit.inf.dslreasoner.viatra2logic.Viatra2Logic.transformQueries(Viatra2Logic.java:149) | ||
9 | hu.bme.mit.inf.dslreasoner.application.execution.GenerationTaskExecutor.executeGenerationTask(GenerationTaskExecutor.java:196) | ||
8 | hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor._execute(ScriptExecutor.java:129) | 10 | hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor._execute(ScriptExecutor.java:129) |
9 | hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.execute(ScriptExecutor.java:338) | 11 | hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.execute(ScriptExecutor.java:338) |
10 | hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.executeScript(ScriptExecutor.java:110) | 12 | hu.bme.mit.inf.dslreasoner.application.execution.ScriptExecutor.executeScript(ScriptExecutor.java:110) |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig index 7da4f563..ff9155a4 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/ecore.vsconfig | |||
@@ -32,7 +32,7 @@ generate { | |||
32 | } | 32 | } |
33 | 33 | ||
34 | number = 1 | 34 | number = 1 |
35 | runs = 1 | 35 | runs = 30 |
36 | config = { | 36 | config = { |
37 | log-level = none, | 37 | log-level = none, |
38 | "optional-wf" = "true", | 38 | "optional-wf" = "true", |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml index 975fd574..269d4b7b 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/plugin.xml | |||
@@ -4,14 +4,6 @@ | |||
4 | <!-- @generated socialnetwork --> | 4 | <!-- @generated socialnetwork --> |
5 | <package class="socialnetwork.SocialnetworkPackage" genModel="model/socialnetwork.genmodel" uri="http://ecse.mcgill.ca/socialnetwork"/> | 5 | <package class="socialnetwork.SocialnetworkPackage" genModel="model/socialnetwork.genmodel" uri="http://ecse.mcgill.ca/socialnetwork"/> |
6 | </extension> | 6 | </extension> |
7 | <extension id="ca.mcgill.ecse.socialnetwork.plugin.Queries" point="org.eclipse.viatra.query.runtime.queryspecification"> | ||
8 | <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:ca.mcgill.ecse.socialnetwork.plugin.Queries" id="ca.mcgill.ecse.socialnetwork.plugin.Queries"> | ||
9 | <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.singleFriendship"/> | ||
10 | <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.noFriend"/> | ||
11 | <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.selfFriend"/> | ||
12 | <query-specification fqn="ca.mcgill.ecse.socialnetwork.plugin.friendship"/> | ||
13 | </group> | ||
14 | </extension> | ||
15 | <extension id="queries.Ecore" point="org.eclipse.viatra.query.runtime.queryspecification"> | 7 | <extension id="queries.Ecore" point="org.eclipse.viatra.query.runtime.queryspecification"> |
16 | <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore" id="queries.Ecore"> | 8 | <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore" id="queries.Ecore"> |
17 | <query-specification fqn="queries.directSupertype"/> | 9 | <query-specification fqn="queries.directSupertype"/> |
@@ -19,11 +11,8 @@ | |||
19 | <query-specification fqn="queries.opposite"/> | 11 | <query-specification fqn="queries.opposite"/> |
20 | <query-specification fqn="queries.oppositeDifferentClass"/> | 12 | <query-specification fqn="queries.oppositeDifferentClass"/> |
21 | <query-specification fqn="queries.nonSymmetricOpposite"/> | 13 | <query-specification fqn="queries.nonSymmetricOpposite"/> |
22 | </group> | 14 | <query-specification fqn="queries.superTypes"/> |
23 | </extension> | 15 | <query-specification fqn="queries.moreThenFiveSuperTypes"/> |
24 | <extension id="queries.Ecore_pattern" point="org.eclipse.viatra.query.runtime.queryspecification"> | ||
25 | <group group="org.eclipse.viatra.query.runtime.extensibility.SingletonExtensionFactory:queries.Ecore_pattern" id="queries.Ecore_pattern"> | ||
26 | <query-specification fqn="queries.sameSuperClass"/> | ||
27 | </group> | 16 | </group> |
28 | </extension> | 17 | </extension> |
29 | </plugin> | 18 | </plugin> |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql index 3b0e7fd9..315e7d34 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/Ecore.vql | |||
@@ -26,4 +26,28 @@ pattern oppositeDifferentClass(a:EReference) { | |||
26 | pattern nonSymmetricOpposite(a:EReference, b:EReference) { | 26 | pattern nonSymmetricOpposite(a:EReference, b:EReference) { |
27 | find opposite(a,b); | 27 | find opposite(a,b); |
28 | neg find opposite(b,a); | 28 | neg find opposite(b,a); |
29 | } \ No newline at end of file | 29 | } |
30 | |||
31 | pattern superTypes(c1:EClass, c2:EClass){ | ||
32 | EClass.eSuperTypes(c1,c2); | ||
33 | } | ||
34 | |||
35 | @Constraint(severity="error", message="error", key = {c}) | ||
36 | pattern moreThenFiveSuperTypes(c: EClass){ | ||
37 | find superTypes(c1, s1); | ||
38 | find superTypes(c1, s2); | ||
39 | find superTypes(c1, s3); | ||
40 | find superTypes(c1, s4); | ||
41 | find superTypes(c1, s5); | ||
42 | s1 != s2; | ||
43 | s1 != s3; | ||
44 | s1 != s4; | ||
45 | s1 != s5; | ||
46 | s2 != s3; | ||
47 | s2 != s4; | ||
48 | s2 != s5; | ||
49 | s3 != s4; | ||
50 | s3 != s5; | ||
51 | s4 != s5; | ||
52 | } | ||
53 | |||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql index a6f384d9..7e51dc69 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | |||
@@ -1,9 +1,9 @@ | |||
1 | package queries | 1 | package queries |
2 | import epackage "http://www.eclipse.org/emf/2002/Ecore" | 2 | import epackage "http://www.eclipse.org/emf/2002/Ecore" |
3 | 3 | ||
4 | |||
4 | @Constraint(severity="error", message="error", key = {c}) | 5 | @Constraint(severity="error", message="error", key = {c}) |
5 | pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { | 6 | pattern moreThenFiveSuperTypes(c: EClass){ |
6 | EClass.eSuperTypes(c, s1); | 7 | m == count EClass.eSuperTypes(c,_); |
7 | EClass.eSuperTypes(c, s2); | 8 | check(m >= 5); |
8 | s1 == s2; | ||
9 | } \ No newline at end of file | 9 | } \ No newline at end of file |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore new file mode 100644 index 00000000..c42ca056 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/constraints/ecore/.gitignore | |||
@@ -0,0 +1,8 @@ | |||
1 | /.Ecore_pattern.java._trace | ||
2 | /.MoreThenFiveSuperTypes.java._trace | ||
3 | /.DirectSupertype.java._trace | ||
4 | /.Ecore.java._trace | ||
5 | /.LoopInInheritence.java._trace | ||
6 | /.NonSymmetricOpposite.java._trace | ||
7 | /.Opposite.java._trace | ||
8 | /.OppositeDifferentClass.java._trace | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore new file mode 100644 index 00000000..c42ca056 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/ecore/.gitignore | |||
@@ -0,0 +1,8 @@ | |||
1 | /.Ecore_pattern.java._trace | ||
2 | /.MoreThenFiveSuperTypes.java._trace | ||
3 | /.DirectSupertype.java._trace | ||
4 | /.Ecore.java._trace | ||
5 | /.LoopInInheritence.java._trace | ||
6 | /.NonSymmetricOpposite.java._trace | ||
7 | /.Opposite.java._trace | ||
8 | /.OppositeDifferentClass.java._trace | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore index 9ceca817..e9d711d4 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/.gitignore | |||
@@ -1,9 +1,9 @@ | |||
1 | /.Ecore_pattern.java._trace | 1 | /.Ecore_pattern.java._trace |
2 | /.MultipleTransitionFromEntry.java._trace | 2 | /.MoreThenFiveSuperTypes.java._trace |
3 | /.SameSuperClass.java._trace | ||
4 | /.DirectSupertype.java._trace | 3 | /.DirectSupertype.java._trace |
5 | /.Ecore.java._trace | 4 | /.Ecore.java._trace |
6 | /.LoopInInheritence.java._trace | 5 | /.LoopInInheritence.java._trace |
7 | /.NonSymmetricOpposite.java._trace | 6 | /.NonSymmetricOpposite.java._trace |
8 | /.Opposite.java._trace | 7 | /.Opposite.java._trace |
9 | /.OppositeDifferentClass.java._trace | 8 | /.OppositeDifferentClass.java._trace |
9 | /.SuperTypes.java._trace | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java index e4f254d3..ebafb74b 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore.java | |||
@@ -7,9 +7,11 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | |||
7 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; | 7 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; |
8 | import queries.DirectSupertype; | 8 | import queries.DirectSupertype; |
9 | import queries.LoopInInheritence; | 9 | import queries.LoopInInheritence; |
10 | import queries.MoreThenFiveSuperTypes; | ||
10 | import queries.NonSymmetricOpposite; | 11 | import queries.NonSymmetricOpposite; |
11 | import queries.Opposite; | 12 | import queries.Opposite; |
12 | import queries.OppositeDifferentClass; | 13 | import queries.OppositeDifferentClass; |
14 | import queries.SuperTypes; | ||
13 | 15 | ||
14 | /** | 16 | /** |
15 | * A pattern group formed of all public patterns defined in Ecore.vql. | 17 | * A pattern group formed of all public patterns defined in Ecore.vql. |
@@ -24,6 +26,8 @@ import queries.OppositeDifferentClass; | |||
24 | * <li>opposite</li> | 26 | * <li>opposite</li> |
25 | * <li>oppositeDifferentClass</li> | 27 | * <li>oppositeDifferentClass</li> |
26 | * <li>nonSymmetricOpposite</li> | 28 | * <li>nonSymmetricOpposite</li> |
29 | * <li>superTypes</li> | ||
30 | * <li>moreThenFiveSuperTypes</li> | ||
27 | * </ul> | 31 | * </ul> |
28 | * | 32 | * |
29 | * @see IQueryGroup | 33 | * @see IQueryGroup |
@@ -53,6 +57,8 @@ public final class Ecore extends BaseGeneratedPatternGroup { | |||
53 | querySpecifications.add(Opposite.instance()); | 57 | querySpecifications.add(Opposite.instance()); |
54 | querySpecifications.add(OppositeDifferentClass.instance()); | 58 | querySpecifications.add(OppositeDifferentClass.instance()); |
55 | querySpecifications.add(NonSymmetricOpposite.instance()); | 59 | querySpecifications.add(NonSymmetricOpposite.instance()); |
60 | querySpecifications.add(SuperTypes.instance()); | ||
61 | querySpecifications.add(MoreThenFiveSuperTypes.instance()); | ||
56 | } | 62 | } |
57 | 63 | ||
58 | public DirectSupertype getDirectSupertype() { | 64 | public DirectSupertype getDirectSupertype() { |
@@ -94,4 +100,20 @@ public final class Ecore extends BaseGeneratedPatternGroup { | |||
94 | public NonSymmetricOpposite.Matcher getNonSymmetricOpposite(final ViatraQueryEngine engine) { | 100 | public NonSymmetricOpposite.Matcher getNonSymmetricOpposite(final ViatraQueryEngine engine) { |
95 | return NonSymmetricOpposite.Matcher.on(engine); | 101 | return NonSymmetricOpposite.Matcher.on(engine); |
96 | } | 102 | } |
103 | |||
104 | public SuperTypes getSuperTypes() { | ||
105 | return SuperTypes.instance(); | ||
106 | } | ||
107 | |||
108 | public SuperTypes.Matcher getSuperTypes(final ViatraQueryEngine engine) { | ||
109 | return SuperTypes.Matcher.on(engine); | ||
110 | } | ||
111 | |||
112 | public MoreThenFiveSuperTypes getMoreThenFiveSuperTypes() { | ||
113 | return MoreThenFiveSuperTypes.instance(); | ||
114 | } | ||
115 | |||
116 | public MoreThenFiveSuperTypes.Matcher getMoreThenFiveSuperTypes(final ViatraQueryEngine engine) { | ||
117 | return MoreThenFiveSuperTypes.Matcher.on(engine); | ||
118 | } | ||
97 | } | 119 | } |
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java new file mode 100644 index 00000000..867ffd01 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/MoreThenFiveSuperTypes.java | |||
@@ -0,0 +1,611 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/Ecore.vql | ||
3 | */ | ||
4 | package queries; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
19 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
20 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
21 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
25 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
26 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
27 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
40 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
41 | import queries.SuperTypes; | ||
42 | |||
43 | /** | ||
44 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
45 | * | ||
46 | * <p>Original source: | ||
47 | * <code><pre> | ||
48 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
49 | * pattern moreThenFiveSuperTypes(c: EClass){ | ||
50 | * find superTypes(c1, s1); | ||
51 | * find superTypes(c1, s2); | ||
52 | * find superTypes(c1, s3); | ||
53 | * find superTypes(c1, s4); | ||
54 | * find superTypes(c1, s5); | ||
55 | * s1 != s2; | ||
56 | * s1 != s3; | ||
57 | * s1 != s4; | ||
58 | * s1 != s5; | ||
59 | * s2 != s3; | ||
60 | * s2 != s4; | ||
61 | * s2 != s5; | ||
62 | * s3 != s4; | ||
63 | * s3 != s5; | ||
64 | * s4 != s5; | ||
65 | * } | ||
66 | * </pre></code> | ||
67 | * | ||
68 | * @see Matcher | ||
69 | * @see Match | ||
70 | * | ||
71 | */ | ||
72 | @SuppressWarnings("all") | ||
73 | public final class MoreThenFiveSuperTypes extends BaseGeneratedEMFQuerySpecification<MoreThenFiveSuperTypes.Matcher> { | ||
74 | /** | ||
75 | * Pattern-specific match representation of the queries.moreThenFiveSuperTypes pattern, | ||
76 | * to be used in conjunction with {@link Matcher}. | ||
77 | * | ||
78 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
79 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
80 | * usable to represent a match of the pattern in the result of a query, | ||
81 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
82 | * | ||
83 | * @see Matcher | ||
84 | * | ||
85 | */ | ||
86 | public static abstract class Match extends BasePatternMatch { | ||
87 | private EClass fC; | ||
88 | |||
89 | private static List<String> parameterNames = makeImmutableList("c"); | ||
90 | |||
91 | private Match(final EClass pC) { | ||
92 | this.fC = pC; | ||
93 | } | ||
94 | |||
95 | @Override | ||
96 | public Object get(final String parameterName) { | ||
97 | if ("c".equals(parameterName)) return this.fC; | ||
98 | return null; | ||
99 | } | ||
100 | |||
101 | public EClass getC() { | ||
102 | return this.fC; | ||
103 | } | ||
104 | |||
105 | @Override | ||
106 | public boolean set(final String parameterName, final Object newValue) { | ||
107 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
108 | if ("c".equals(parameterName) ) { | ||
109 | this.fC = (EClass) newValue; | ||
110 | return true; | ||
111 | } | ||
112 | return false; | ||
113 | } | ||
114 | |||
115 | public void setC(final EClass pC) { | ||
116 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
117 | this.fC = pC; | ||
118 | } | ||
119 | |||
120 | @Override | ||
121 | public String patternName() { | ||
122 | return "queries.moreThenFiveSuperTypes"; | ||
123 | } | ||
124 | |||
125 | @Override | ||
126 | public List<String> parameterNames() { | ||
127 | return MoreThenFiveSuperTypes.Match.parameterNames; | ||
128 | } | ||
129 | |||
130 | @Override | ||
131 | public Object[] toArray() { | ||
132 | return new Object[]{fC}; | ||
133 | } | ||
134 | |||
135 | @Override | ||
136 | public MoreThenFiveSuperTypes.Match toImmutable() { | ||
137 | return isMutable() ? newMatch(fC) : this; | ||
138 | } | ||
139 | |||
140 | @Override | ||
141 | public String prettyPrint() { | ||
142 | StringBuilder result = new StringBuilder(); | ||
143 | result.append("\"c\"=" + prettyPrintValue(fC)); | ||
144 | return result.toString(); | ||
145 | } | ||
146 | |||
147 | @Override | ||
148 | public int hashCode() { | ||
149 | return Objects.hash(fC); | ||
150 | } | ||
151 | |||
152 | @Override | ||
153 | public boolean equals(final Object obj) { | ||
154 | if (this == obj) | ||
155 | return true; | ||
156 | if (obj == null) { | ||
157 | return false; | ||
158 | } | ||
159 | if ((obj instanceof MoreThenFiveSuperTypes.Match)) { | ||
160 | MoreThenFiveSuperTypes.Match other = (MoreThenFiveSuperTypes.Match) obj; | ||
161 | return Objects.equals(fC, other.fC); | ||
162 | } else { | ||
163 | // this should be infrequent | ||
164 | if (!(obj instanceof IPatternMatch)) { | ||
165 | return false; | ||
166 | } | ||
167 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
168 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | @Override | ||
173 | public MoreThenFiveSuperTypes specification() { | ||
174 | return MoreThenFiveSuperTypes.instance(); | ||
175 | } | ||
176 | |||
177 | /** | ||
178 | * Returns an empty, mutable match. | ||
179 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
180 | * | ||
181 | * @return the empty match. | ||
182 | * | ||
183 | */ | ||
184 | public static MoreThenFiveSuperTypes.Match newEmptyMatch() { | ||
185 | return new Mutable(null); | ||
186 | } | ||
187 | |||
188 | /** | ||
189 | * Returns a mutable (partial) match. | ||
190 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
191 | * | ||
192 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
193 | * @return the new, mutable (partial) match object. | ||
194 | * | ||
195 | */ | ||
196 | public static MoreThenFiveSuperTypes.Match newMutableMatch(final EClass pC) { | ||
197 | return new Mutable(pC); | ||
198 | } | ||
199 | |||
200 | /** | ||
201 | * Returns a new (partial) match. | ||
202 | * This can be used e.g. to call the matcher with a partial match. | ||
203 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
204 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
205 | * @return the (partial) match object. | ||
206 | * | ||
207 | */ | ||
208 | public static MoreThenFiveSuperTypes.Match newMatch(final EClass pC) { | ||
209 | return new Immutable(pC); | ||
210 | } | ||
211 | |||
212 | private static final class Mutable extends MoreThenFiveSuperTypes.Match { | ||
213 | Mutable(final EClass pC) { | ||
214 | super(pC); | ||
215 | } | ||
216 | |||
217 | @Override | ||
218 | public boolean isMutable() { | ||
219 | return true; | ||
220 | } | ||
221 | } | ||
222 | |||
223 | private static final class Immutable extends MoreThenFiveSuperTypes.Match { | ||
224 | Immutable(final EClass pC) { | ||
225 | super(pC); | ||
226 | } | ||
227 | |||
228 | @Override | ||
229 | public boolean isMutable() { | ||
230 | return false; | ||
231 | } | ||
232 | } | ||
233 | } | ||
234 | |||
235 | /** | ||
236 | * Generated pattern matcher API of the queries.moreThenFiveSuperTypes pattern, | ||
237 | * providing pattern-specific query methods. | ||
238 | * | ||
239 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
240 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
241 | * | ||
242 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
243 | * | ||
244 | * <p>Original source: | ||
245 | * <code><pre> | ||
246 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
247 | * pattern moreThenFiveSuperTypes(c: EClass){ | ||
248 | * find superTypes(c1, s1); | ||
249 | * find superTypes(c1, s2); | ||
250 | * find superTypes(c1, s3); | ||
251 | * find superTypes(c1, s4); | ||
252 | * find superTypes(c1, s5); | ||
253 | * s1 != s2; | ||
254 | * s1 != s3; | ||
255 | * s1 != s4; | ||
256 | * s1 != s5; | ||
257 | * s2 != s3; | ||
258 | * s2 != s4; | ||
259 | * s2 != s5; | ||
260 | * s3 != s4; | ||
261 | * s3 != s5; | ||
262 | * s4 != s5; | ||
263 | * } | ||
264 | * </pre></code> | ||
265 | * | ||
266 | * @see Match | ||
267 | * @see MoreThenFiveSuperTypes | ||
268 | * | ||
269 | */ | ||
270 | public static class Matcher extends BaseMatcher<MoreThenFiveSuperTypes.Match> { | ||
271 | /** | ||
272 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
273 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
274 | * | ||
275 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
276 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
277 | * | ||
278 | */ | ||
279 | public static MoreThenFiveSuperTypes.Matcher on(final ViatraQueryEngine engine) { | ||
280 | // check if matcher already exists | ||
281 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
282 | if (matcher == null) { | ||
283 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
284 | } | ||
285 | return matcher; | ||
286 | } | ||
287 | |||
288 | /** | ||
289 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
290 | * @return an initialized matcher | ||
291 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
292 | * | ||
293 | */ | ||
294 | public static MoreThenFiveSuperTypes.Matcher create() { | ||
295 | return new Matcher(); | ||
296 | } | ||
297 | |||
298 | private static final int POSITION_C = 0; | ||
299 | |||
300 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(MoreThenFiveSuperTypes.Matcher.class); | ||
301 | |||
302 | /** | ||
303 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
304 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
305 | * | ||
306 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
307 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
308 | * | ||
309 | */ | ||
310 | private Matcher() { | ||
311 | super(querySpecification()); | ||
312 | } | ||
313 | |||
314 | /** | ||
315 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
316 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
317 | * @return matches represented as a Match object. | ||
318 | * | ||
319 | */ | ||
320 | public Collection<MoreThenFiveSuperTypes.Match> getAllMatches(final EClass pC) { | ||
321 | return rawStreamAllMatches(new Object[]{pC}).collect(Collectors.toSet()); | ||
322 | } | ||
323 | |||
324 | /** | ||
325 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
326 | * </p> | ||
327 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
328 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
329 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
330 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
331 | * @return a stream of matches represented as a Match object. | ||
332 | * | ||
333 | */ | ||
334 | public Stream<MoreThenFiveSuperTypes.Match> streamAllMatches(final EClass pC) { | ||
335 | return rawStreamAllMatches(new Object[]{pC}); | ||
336 | } | ||
337 | |||
338 | /** | ||
339 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
340 | * Neither determinism nor randomness of selection is guaranteed. | ||
341 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
342 | * @return a match represented as a Match object, or null if no match is found. | ||
343 | * | ||
344 | */ | ||
345 | public Optional<MoreThenFiveSuperTypes.Match> getOneArbitraryMatch(final EClass pC) { | ||
346 | return rawGetOneArbitraryMatch(new Object[]{pC}); | ||
347 | } | ||
348 | |||
349 | /** | ||
350 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
351 | * under any possible substitution of the unspecified parameters (if any). | ||
352 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
353 | * @return true if the input is a valid (partial) match of the pattern. | ||
354 | * | ||
355 | */ | ||
356 | public boolean hasMatch(final EClass pC) { | ||
357 | return rawHasMatch(new Object[]{pC}); | ||
358 | } | ||
359 | |||
360 | /** | ||
361 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
362 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
363 | * @return the number of pattern matches found. | ||
364 | * | ||
365 | */ | ||
366 | public int countMatches(final EClass pC) { | ||
367 | return rawCountMatches(new Object[]{pC}); | ||
368 | } | ||
369 | |||
370 | /** | ||
371 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
372 | * Neither determinism nor randomness of selection is guaranteed. | ||
373 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
374 | * @param processor the action that will process the selected match. | ||
375 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
376 | * | ||
377 | */ | ||
378 | public boolean forOneArbitraryMatch(final EClass pC, final Consumer<? super MoreThenFiveSuperTypes.Match> processor) { | ||
379 | return rawForOneArbitraryMatch(new Object[]{pC}, processor); | ||
380 | } | ||
381 | |||
382 | /** | ||
383 | * Returns a new (partial) match. | ||
384 | * This can be used e.g. to call the matcher with a partial match. | ||
385 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
386 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
387 | * @return the (partial) match object. | ||
388 | * | ||
389 | */ | ||
390 | public MoreThenFiveSuperTypes.Match newMatch(final EClass pC) { | ||
391 | return MoreThenFiveSuperTypes.Match.newMatch(pC); | ||
392 | } | ||
393 | |||
394 | /** | ||
395 | * Retrieve the set of values that occur in matches for c. | ||
396 | * @return the Set of all values or empty set if there are no matches | ||
397 | * | ||
398 | */ | ||
399 | protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) { | ||
400 | return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast); | ||
401 | } | ||
402 | |||
403 | /** | ||
404 | * Retrieve the set of values that occur in matches for c. | ||
405 | * @return the Set of all values or empty set if there are no matches | ||
406 | * | ||
407 | */ | ||
408 | public Set<EClass> getAllValuesOfc() { | ||
409 | return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet()); | ||
410 | } | ||
411 | |||
412 | /** | ||
413 | * Retrieve the set of values that occur in matches for c. | ||
414 | * @return the Set of all values or empty set if there are no matches | ||
415 | * | ||
416 | */ | ||
417 | public Stream<EClass> streamAllValuesOfc() { | ||
418 | return rawStreamAllValuesOfc(emptyArray()); | ||
419 | } | ||
420 | |||
421 | @Override | ||
422 | protected MoreThenFiveSuperTypes.Match tupleToMatch(final Tuple t) { | ||
423 | try { | ||
424 | return MoreThenFiveSuperTypes.Match.newMatch((EClass) t.get(POSITION_C)); | ||
425 | } catch(ClassCastException e) { | ||
426 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
427 | return null; | ||
428 | } | ||
429 | } | ||
430 | |||
431 | @Override | ||
432 | protected MoreThenFiveSuperTypes.Match arrayToMatch(final Object[] match) { | ||
433 | try { | ||
434 | return MoreThenFiveSuperTypes.Match.newMatch((EClass) match[POSITION_C]); | ||
435 | } catch(ClassCastException e) { | ||
436 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
437 | return null; | ||
438 | } | ||
439 | } | ||
440 | |||
441 | @Override | ||
442 | protected MoreThenFiveSuperTypes.Match arrayToMatchMutable(final Object[] match) { | ||
443 | try { | ||
444 | return MoreThenFiveSuperTypes.Match.newMutableMatch((EClass) match[POSITION_C]); | ||
445 | } catch(ClassCastException e) { | ||
446 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
447 | return null; | ||
448 | } | ||
449 | } | ||
450 | |||
451 | /** | ||
452 | * @return the singleton instance of the query specification of this pattern | ||
453 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
454 | * | ||
455 | */ | ||
456 | public static IQuerySpecification<MoreThenFiveSuperTypes.Matcher> querySpecification() { | ||
457 | return MoreThenFiveSuperTypes.instance(); | ||
458 | } | ||
459 | } | ||
460 | |||
461 | private MoreThenFiveSuperTypes() { | ||
462 | super(GeneratedPQuery.INSTANCE); | ||
463 | } | ||
464 | |||
465 | /** | ||
466 | * @return the singleton instance of the query specification | ||
467 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
468 | * | ||
469 | */ | ||
470 | public static MoreThenFiveSuperTypes instance() { | ||
471 | try{ | ||
472 | return LazyHolder.INSTANCE; | ||
473 | } catch (ExceptionInInitializerError err) { | ||
474 | throw processInitializerError(err); | ||
475 | } | ||
476 | } | ||
477 | |||
478 | @Override | ||
479 | protected MoreThenFiveSuperTypes.Matcher instantiate(final ViatraQueryEngine engine) { | ||
480 | return MoreThenFiveSuperTypes.Matcher.on(engine); | ||
481 | } | ||
482 | |||
483 | @Override | ||
484 | public MoreThenFiveSuperTypes.Matcher instantiate() { | ||
485 | return MoreThenFiveSuperTypes.Matcher.create(); | ||
486 | } | ||
487 | |||
488 | @Override | ||
489 | public MoreThenFiveSuperTypes.Match newEmptyMatch() { | ||
490 | return MoreThenFiveSuperTypes.Match.newEmptyMatch(); | ||
491 | } | ||
492 | |||
493 | @Override | ||
494 | public MoreThenFiveSuperTypes.Match newMatch(final Object... parameters) { | ||
495 | return MoreThenFiveSuperTypes.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0]); | ||
496 | } | ||
497 | |||
498 | /** | ||
499 | * Inner class allowing the singleton instance of {@link JvmGenericType: queries.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: queries.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
500 | * <b>not</b> at the class load time of the outer class, | ||
501 | * but rather at the first call to {@link JvmGenericType: queries.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: queries.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
502 | * | ||
503 | * <p> This workaround is required e.g. to support recursion. | ||
504 | * | ||
505 | */ | ||
506 | private static class LazyHolder { | ||
507 | private static final MoreThenFiveSuperTypes INSTANCE = new MoreThenFiveSuperTypes(); | ||
508 | |||
509 | /** | ||
510 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
511 | * This initialization order is required to support indirect recursion. | ||
512 | * | ||
513 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
514 | * | ||
515 | */ | ||
516 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
517 | |||
518 | public static Object ensureInitialized() { | ||
519 | INSTANCE.ensureInitializedInternal(); | ||
520 | return null; | ||
521 | } | ||
522 | } | ||
523 | |||
524 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
525 | private static final MoreThenFiveSuperTypes.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
526 | |||
527 | private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
528 | |||
529 | private final List<PParameter> parameters = Arrays.asList(parameter_c); | ||
530 | |||
531 | private GeneratedPQuery() { | ||
532 | super(PVisibility.PUBLIC); | ||
533 | } | ||
534 | |||
535 | @Override | ||
536 | public String getFullyQualifiedName() { | ||
537 | return "queries.moreThenFiveSuperTypes"; | ||
538 | } | ||
539 | |||
540 | @Override | ||
541 | public List<String> getParameterNames() { | ||
542 | return Arrays.asList("c"); | ||
543 | } | ||
544 | |||
545 | @Override | ||
546 | public List<PParameter> getParameters() { | ||
547 | return parameters; | ||
548 | } | ||
549 | |||
550 | @Override | ||
551 | public Set<PBody> doGetContainedBodies() { | ||
552 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
553 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
554 | { | ||
555 | PBody body = new PBody(this); | ||
556 | PVariable var_c = body.getOrCreateVariableByName("c"); | ||
557 | PVariable var_c1 = body.getOrCreateVariableByName("c1"); | ||
558 | PVariable var_s1 = body.getOrCreateVariableByName("s1"); | ||
559 | PVariable var_s2 = body.getOrCreateVariableByName("s2"); | ||
560 | PVariable var_s3 = body.getOrCreateVariableByName("s3"); | ||
561 | PVariable var_s4 = body.getOrCreateVariableByName("s4"); | ||
562 | PVariable var_s5 = body.getOrCreateVariableByName("s5"); | ||
563 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
564 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
565 | new ExportedParameter(body, var_c, parameter_c) | ||
566 | )); | ||
567 | // find superTypes(c1, s1) | ||
568 | new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s1), SuperTypes.instance().getInternalQueryRepresentation()); | ||
569 | // find superTypes(c1, s2) | ||
570 | new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s2), SuperTypes.instance().getInternalQueryRepresentation()); | ||
571 | // find superTypes(c1, s3) | ||
572 | new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s3), SuperTypes.instance().getInternalQueryRepresentation()); | ||
573 | // find superTypes(c1, s4) | ||
574 | new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s4), SuperTypes.instance().getInternalQueryRepresentation()); | ||
575 | // find superTypes(c1, s5) | ||
576 | new PositivePatternCall(body, Tuples.flatTupleOf(var_c1, var_s5), SuperTypes.instance().getInternalQueryRepresentation()); | ||
577 | // s1 != s2 | ||
578 | new Inequality(body, var_s1, var_s2); | ||
579 | // s1 != s3 | ||
580 | new Inequality(body, var_s1, var_s3); | ||
581 | // s1 != s4 | ||
582 | new Inequality(body, var_s1, var_s4); | ||
583 | // s1 != s5 | ||
584 | new Inequality(body, var_s1, var_s5); | ||
585 | // s2 != s3 | ||
586 | new Inequality(body, var_s2, var_s3); | ||
587 | // s2 != s4 | ||
588 | new Inequality(body, var_s2, var_s4); | ||
589 | // s2 != s5 | ||
590 | new Inequality(body, var_s2, var_s5); | ||
591 | // s3 != s4 | ||
592 | new Inequality(body, var_s3, var_s4); | ||
593 | // s3 != s5 | ||
594 | new Inequality(body, var_s3, var_s5); | ||
595 | // s4 != s5 | ||
596 | new Inequality(body, var_s4, var_s5); | ||
597 | bodies.add(body); | ||
598 | } | ||
599 | { | ||
600 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
601 | annotation.addAttribute("severity", "error"); | ||
602 | annotation.addAttribute("message", "error"); | ||
603 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
604 | new ParameterReference("c") | ||
605 | })); | ||
606 | addAnnotation(annotation); | ||
607 | } | ||
608 | return bodies; | ||
609 | } | ||
610 | } | ||
611 | } | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java deleted file mode 100644 index 2e8a19d8..00000000 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SameSuperClass.java +++ /dev/null | |||
@@ -1,824 +0,0 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | ||
3 | */ | ||
4 | package queries; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
19 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
20 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
21 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
25 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
40 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
41 | |||
42 | /** | ||
43 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
44 | * | ||
45 | * <p>Original source: | ||
46 | * <code><pre> | ||
47 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
48 | * pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { | ||
49 | * EClass.eSuperTypes(c, s1); | ||
50 | * EClass.eSuperTypes(c, s2); | ||
51 | * s1 == s2; | ||
52 | * } | ||
53 | * </pre></code> | ||
54 | * | ||
55 | * @see Matcher | ||
56 | * @see Match | ||
57 | * | ||
58 | */ | ||
59 | @SuppressWarnings("all") | ||
60 | public final class SameSuperClass extends BaseGeneratedEMFQuerySpecification<SameSuperClass.Matcher> { | ||
61 | /** | ||
62 | * Pattern-specific match representation of the queries.sameSuperClass pattern, | ||
63 | * to be used in conjunction with {@link Matcher}. | ||
64 | * | ||
65 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
66 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
67 | * usable to represent a match of the pattern in the result of a query, | ||
68 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
69 | * | ||
70 | * @see Matcher | ||
71 | * | ||
72 | */ | ||
73 | public static abstract class Match extends BasePatternMatch { | ||
74 | private EClass fC; | ||
75 | |||
76 | private EClass fS1; | ||
77 | |||
78 | private EClass fS2; | ||
79 | |||
80 | private static List<String> parameterNames = makeImmutableList("c", "s1", "s2"); | ||
81 | |||
82 | private Match(final EClass pC, final EClass pS1, final EClass pS2) { | ||
83 | this.fC = pC; | ||
84 | this.fS1 = pS1; | ||
85 | this.fS2 = pS2; | ||
86 | } | ||
87 | |||
88 | @Override | ||
89 | public Object get(final String parameterName) { | ||
90 | if ("c".equals(parameterName)) return this.fC; | ||
91 | if ("s1".equals(parameterName)) return this.fS1; | ||
92 | if ("s2".equals(parameterName)) return this.fS2; | ||
93 | return null; | ||
94 | } | ||
95 | |||
96 | public EClass getC() { | ||
97 | return this.fC; | ||
98 | } | ||
99 | |||
100 | public EClass getS1() { | ||
101 | return this.fS1; | ||
102 | } | ||
103 | |||
104 | public EClass getS2() { | ||
105 | return this.fS2; | ||
106 | } | ||
107 | |||
108 | @Override | ||
109 | public boolean set(final String parameterName, final Object newValue) { | ||
110 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
111 | if ("c".equals(parameterName) ) { | ||
112 | this.fC = (EClass) newValue; | ||
113 | return true; | ||
114 | } | ||
115 | if ("s1".equals(parameterName) ) { | ||
116 | this.fS1 = (EClass) newValue; | ||
117 | return true; | ||
118 | } | ||
119 | if ("s2".equals(parameterName) ) { | ||
120 | this.fS2 = (EClass) newValue; | ||
121 | return true; | ||
122 | } | ||
123 | return false; | ||
124 | } | ||
125 | |||
126 | public void setC(final EClass pC) { | ||
127 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
128 | this.fC = pC; | ||
129 | } | ||
130 | |||
131 | public void setS1(final EClass pS1) { | ||
132 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
133 | this.fS1 = pS1; | ||
134 | } | ||
135 | |||
136 | public void setS2(final EClass pS2) { | ||
137 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
138 | this.fS2 = pS2; | ||
139 | } | ||
140 | |||
141 | @Override | ||
142 | public String patternName() { | ||
143 | return "queries.sameSuperClass"; | ||
144 | } | ||
145 | |||
146 | @Override | ||
147 | public List<String> parameterNames() { | ||
148 | return SameSuperClass.Match.parameterNames; | ||
149 | } | ||
150 | |||
151 | @Override | ||
152 | public Object[] toArray() { | ||
153 | return new Object[]{fC, fS1, fS2}; | ||
154 | } | ||
155 | |||
156 | @Override | ||
157 | public SameSuperClass.Match toImmutable() { | ||
158 | return isMutable() ? newMatch(fC, fS1, fS2) : this; | ||
159 | } | ||
160 | |||
161 | @Override | ||
162 | public String prettyPrint() { | ||
163 | StringBuilder result = new StringBuilder(); | ||
164 | result.append("\"c\"=" + prettyPrintValue(fC) + ", "); | ||
165 | result.append("\"s1\"=" + prettyPrintValue(fS1) + ", "); | ||
166 | result.append("\"s2\"=" + prettyPrintValue(fS2)); | ||
167 | return result.toString(); | ||
168 | } | ||
169 | |||
170 | @Override | ||
171 | public int hashCode() { | ||
172 | return Objects.hash(fC, fS1, fS2); | ||
173 | } | ||
174 | |||
175 | @Override | ||
176 | public boolean equals(final Object obj) { | ||
177 | if (this == obj) | ||
178 | return true; | ||
179 | if (obj == null) { | ||
180 | return false; | ||
181 | } | ||
182 | if ((obj instanceof SameSuperClass.Match)) { | ||
183 | SameSuperClass.Match other = (SameSuperClass.Match) obj; | ||
184 | return Objects.equals(fC, other.fC) && Objects.equals(fS1, other.fS1) && Objects.equals(fS2, other.fS2); | ||
185 | } else { | ||
186 | // this should be infrequent | ||
187 | if (!(obj instanceof IPatternMatch)) { | ||
188 | return false; | ||
189 | } | ||
190 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
191 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
192 | } | ||
193 | } | ||
194 | |||
195 | @Override | ||
196 | public SameSuperClass specification() { | ||
197 | return SameSuperClass.instance(); | ||
198 | } | ||
199 | |||
200 | /** | ||
201 | * Returns an empty, mutable match. | ||
202 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
203 | * | ||
204 | * @return the empty match. | ||
205 | * | ||
206 | */ | ||
207 | public static SameSuperClass.Match newEmptyMatch() { | ||
208 | return new Mutable(null, null, null); | ||
209 | } | ||
210 | |||
211 | /** | ||
212 | * Returns a mutable (partial) match. | ||
213 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
214 | * | ||
215 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
216 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
217 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
218 | * @return the new, mutable (partial) match object. | ||
219 | * | ||
220 | */ | ||
221 | public static SameSuperClass.Match newMutableMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
222 | return new Mutable(pC, pS1, pS2); | ||
223 | } | ||
224 | |||
225 | /** | ||
226 | * Returns a new (partial) match. | ||
227 | * This can be used e.g. to call the matcher with a partial match. | ||
228 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
229 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
230 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
231 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
232 | * @return the (partial) match object. | ||
233 | * | ||
234 | */ | ||
235 | public static SameSuperClass.Match newMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
236 | return new Immutable(pC, pS1, pS2); | ||
237 | } | ||
238 | |||
239 | private static final class Mutable extends SameSuperClass.Match { | ||
240 | Mutable(final EClass pC, final EClass pS1, final EClass pS2) { | ||
241 | super(pC, pS1, pS2); | ||
242 | } | ||
243 | |||
244 | @Override | ||
245 | public boolean isMutable() { | ||
246 | return true; | ||
247 | } | ||
248 | } | ||
249 | |||
250 | private static final class Immutable extends SameSuperClass.Match { | ||
251 | Immutable(final EClass pC, final EClass pS1, final EClass pS2) { | ||
252 | super(pC, pS1, pS2); | ||
253 | } | ||
254 | |||
255 | @Override | ||
256 | public boolean isMutable() { | ||
257 | return false; | ||
258 | } | ||
259 | } | ||
260 | } | ||
261 | |||
262 | /** | ||
263 | * Generated pattern matcher API of the queries.sameSuperClass pattern, | ||
264 | * providing pattern-specific query methods. | ||
265 | * | ||
266 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
267 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
268 | * | ||
269 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
270 | * | ||
271 | * <p>Original source: | ||
272 | * <code><pre> | ||
273 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
274 | * pattern sameSuperClass(c : EClass, s1 : EClass, s2: EClass) { | ||
275 | * EClass.eSuperTypes(c, s1); | ||
276 | * EClass.eSuperTypes(c, s2); | ||
277 | * s1 == s2; | ||
278 | * } | ||
279 | * </pre></code> | ||
280 | * | ||
281 | * @see Match | ||
282 | * @see SameSuperClass | ||
283 | * | ||
284 | */ | ||
285 | public static class Matcher extends BaseMatcher<SameSuperClass.Match> { | ||
286 | /** | ||
287 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
288 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
289 | * | ||
290 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
291 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
292 | * | ||
293 | */ | ||
294 | public static SameSuperClass.Matcher on(final ViatraQueryEngine engine) { | ||
295 | // check if matcher already exists | ||
296 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
297 | if (matcher == null) { | ||
298 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
299 | } | ||
300 | return matcher; | ||
301 | } | ||
302 | |||
303 | /** | ||
304 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
305 | * @return an initialized matcher | ||
306 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
307 | * | ||
308 | */ | ||
309 | public static SameSuperClass.Matcher create() { | ||
310 | return new Matcher(); | ||
311 | } | ||
312 | |||
313 | private static final int POSITION_C = 0; | ||
314 | |||
315 | private static final int POSITION_S1 = 1; | ||
316 | |||
317 | private static final int POSITION_S2 = 2; | ||
318 | |||
319 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(SameSuperClass.Matcher.class); | ||
320 | |||
321 | /** | ||
322 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
323 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
324 | * | ||
325 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
326 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
327 | * | ||
328 | */ | ||
329 | private Matcher() { | ||
330 | super(querySpecification()); | ||
331 | } | ||
332 | |||
333 | /** | ||
334 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
335 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
336 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
337 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
338 | * @return matches represented as a Match object. | ||
339 | * | ||
340 | */ | ||
341 | public Collection<SameSuperClass.Match> getAllMatches(final EClass pC, final EClass pS1, final EClass pS2) { | ||
342 | return rawStreamAllMatches(new Object[]{pC, pS1, pS2}).collect(Collectors.toSet()); | ||
343 | } | ||
344 | |||
345 | /** | ||
346 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
347 | * </p> | ||
348 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
349 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
350 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
351 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
352 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
353 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
354 | * @return a stream of matches represented as a Match object. | ||
355 | * | ||
356 | */ | ||
357 | public Stream<SameSuperClass.Match> streamAllMatches(final EClass pC, final EClass pS1, final EClass pS2) { | ||
358 | return rawStreamAllMatches(new Object[]{pC, pS1, pS2}); | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
363 | * Neither determinism nor randomness of selection is guaranteed. | ||
364 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
365 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
366 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
367 | * @return a match represented as a Match object, or null if no match is found. | ||
368 | * | ||
369 | */ | ||
370 | public Optional<SameSuperClass.Match> getOneArbitraryMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
371 | return rawGetOneArbitraryMatch(new Object[]{pC, pS1, pS2}); | ||
372 | } | ||
373 | |||
374 | /** | ||
375 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
376 | * under any possible substitution of the unspecified parameters (if any). | ||
377 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
378 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
379 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
380 | * @return true if the input is a valid (partial) match of the pattern. | ||
381 | * | ||
382 | */ | ||
383 | public boolean hasMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
384 | return rawHasMatch(new Object[]{pC, pS1, pS2}); | ||
385 | } | ||
386 | |||
387 | /** | ||
388 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
389 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
390 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
391 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
392 | * @return the number of pattern matches found. | ||
393 | * | ||
394 | */ | ||
395 | public int countMatches(final EClass pC, final EClass pS1, final EClass pS2) { | ||
396 | return rawCountMatches(new Object[]{pC, pS1, pS2}); | ||
397 | } | ||
398 | |||
399 | /** | ||
400 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
401 | * Neither determinism nor randomness of selection is guaranteed. | ||
402 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
403 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
404 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
405 | * @param processor the action that will process the selected match. | ||
406 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
407 | * | ||
408 | */ | ||
409 | public boolean forOneArbitraryMatch(final EClass pC, final EClass pS1, final EClass pS2, final Consumer<? super SameSuperClass.Match> processor) { | ||
410 | return rawForOneArbitraryMatch(new Object[]{pC, pS1, pS2}, processor); | ||
411 | } | ||
412 | |||
413 | /** | ||
414 | * Returns a new (partial) match. | ||
415 | * This can be used e.g. to call the matcher with a partial match. | ||
416 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
417 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
418 | * @param pS1 the fixed value of pattern parameter s1, or null if not bound. | ||
419 | * @param pS2 the fixed value of pattern parameter s2, or null if not bound. | ||
420 | * @return the (partial) match object. | ||
421 | * | ||
422 | */ | ||
423 | public SameSuperClass.Match newMatch(final EClass pC, final EClass pS1, final EClass pS2) { | ||
424 | return SameSuperClass.Match.newMatch(pC, pS1, pS2); | ||
425 | } | ||
426 | |||
427 | /** | ||
428 | * Retrieve the set of values that occur in matches for c. | ||
429 | * @return the Set of all values or empty set if there are no matches | ||
430 | * | ||
431 | */ | ||
432 | protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) { | ||
433 | return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast); | ||
434 | } | ||
435 | |||
436 | /** | ||
437 | * Retrieve the set of values that occur in matches for c. | ||
438 | * @return the Set of all values or empty set if there are no matches | ||
439 | * | ||
440 | */ | ||
441 | public Set<EClass> getAllValuesOfc() { | ||
442 | return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet()); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * Retrieve the set of values that occur in matches for c. | ||
447 | * @return the Set of all values or empty set if there are no matches | ||
448 | * | ||
449 | */ | ||
450 | public Stream<EClass> streamAllValuesOfc() { | ||
451 | return rawStreamAllValuesOfc(emptyArray()); | ||
452 | } | ||
453 | |||
454 | /** | ||
455 | * Retrieve the set of values that occur in matches for c. | ||
456 | * </p> | ||
457 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
458 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
459 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
460 | * | ||
461 | * @return the Stream of all values or empty set if there are no matches | ||
462 | * | ||
463 | */ | ||
464 | public Stream<EClass> streamAllValuesOfc(final SameSuperClass.Match partialMatch) { | ||
465 | return rawStreamAllValuesOfc(partialMatch.toArray()); | ||
466 | } | ||
467 | |||
468 | /** | ||
469 | * Retrieve the set of values that occur in matches for c. | ||
470 | * </p> | ||
471 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
472 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
473 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
474 | * | ||
475 | * @return the Stream of all values or empty set if there are no matches | ||
476 | * | ||
477 | */ | ||
478 | public Stream<EClass> streamAllValuesOfc(final EClass pS1, final EClass pS2) { | ||
479 | return rawStreamAllValuesOfc(new Object[]{null, pS1, pS2}); | ||
480 | } | ||
481 | |||
482 | /** | ||
483 | * Retrieve the set of values that occur in matches for c. | ||
484 | * @return the Set of all values or empty set if there are no matches | ||
485 | * | ||
486 | */ | ||
487 | public Set<EClass> getAllValuesOfc(final SameSuperClass.Match partialMatch) { | ||
488 | return rawStreamAllValuesOfc(partialMatch.toArray()).collect(Collectors.toSet()); | ||
489 | } | ||
490 | |||
491 | /** | ||
492 | * Retrieve the set of values that occur in matches for c. | ||
493 | * @return the Set of all values or empty set if there are no matches | ||
494 | * | ||
495 | */ | ||
496 | public Set<EClass> getAllValuesOfc(final EClass pS1, final EClass pS2) { | ||
497 | return rawStreamAllValuesOfc(new Object[]{null, pS1, pS2}).collect(Collectors.toSet()); | ||
498 | } | ||
499 | |||
500 | /** | ||
501 | * Retrieve the set of values that occur in matches for s1. | ||
502 | * @return the Set of all values or empty set if there are no matches | ||
503 | * | ||
504 | */ | ||
505 | protected Stream<EClass> rawStreamAllValuesOfs1(final Object[] parameters) { | ||
506 | return rawStreamAllValues(POSITION_S1, parameters).map(EClass.class::cast); | ||
507 | } | ||
508 | |||
509 | /** | ||
510 | * Retrieve the set of values that occur in matches for s1. | ||
511 | * @return the Set of all values or empty set if there are no matches | ||
512 | * | ||
513 | */ | ||
514 | public Set<EClass> getAllValuesOfs1() { | ||
515 | return rawStreamAllValuesOfs1(emptyArray()).collect(Collectors.toSet()); | ||
516 | } | ||
517 | |||
518 | /** | ||
519 | * Retrieve the set of values that occur in matches for s1. | ||
520 | * @return the Set of all values or empty set if there are no matches | ||
521 | * | ||
522 | */ | ||
523 | public Stream<EClass> streamAllValuesOfs1() { | ||
524 | return rawStreamAllValuesOfs1(emptyArray()); | ||
525 | } | ||
526 | |||
527 | /** | ||
528 | * Retrieve the set of values that occur in matches for s1. | ||
529 | * </p> | ||
530 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
531 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
532 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
533 | * | ||
534 | * @return the Stream of all values or empty set if there are no matches | ||
535 | * | ||
536 | */ | ||
537 | public Stream<EClass> streamAllValuesOfs1(final SameSuperClass.Match partialMatch) { | ||
538 | return rawStreamAllValuesOfs1(partialMatch.toArray()); | ||
539 | } | ||
540 | |||
541 | /** | ||
542 | * Retrieve the set of values that occur in matches for s1. | ||
543 | * </p> | ||
544 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
545 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
546 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
547 | * | ||
548 | * @return the Stream of all values or empty set if there are no matches | ||
549 | * | ||
550 | */ | ||
551 | public Stream<EClass> streamAllValuesOfs1(final EClass pC, final EClass pS2) { | ||
552 | return rawStreamAllValuesOfs1(new Object[]{pC, null, pS2}); | ||
553 | } | ||
554 | |||
555 | /** | ||
556 | * Retrieve the set of values that occur in matches for s1. | ||
557 | * @return the Set of all values or empty set if there are no matches | ||
558 | * | ||
559 | */ | ||
560 | public Set<EClass> getAllValuesOfs1(final SameSuperClass.Match partialMatch) { | ||
561 | return rawStreamAllValuesOfs1(partialMatch.toArray()).collect(Collectors.toSet()); | ||
562 | } | ||
563 | |||
564 | /** | ||
565 | * Retrieve the set of values that occur in matches for s1. | ||
566 | * @return the Set of all values or empty set if there are no matches | ||
567 | * | ||
568 | */ | ||
569 | public Set<EClass> getAllValuesOfs1(final EClass pC, final EClass pS2) { | ||
570 | return rawStreamAllValuesOfs1(new Object[]{pC, null, pS2}).collect(Collectors.toSet()); | ||
571 | } | ||
572 | |||
573 | /** | ||
574 | * Retrieve the set of values that occur in matches for s2. | ||
575 | * @return the Set of all values or empty set if there are no matches | ||
576 | * | ||
577 | */ | ||
578 | protected Stream<EClass> rawStreamAllValuesOfs2(final Object[] parameters) { | ||
579 | return rawStreamAllValues(POSITION_S2, parameters).map(EClass.class::cast); | ||
580 | } | ||
581 | |||
582 | /** | ||
583 | * Retrieve the set of values that occur in matches for s2. | ||
584 | * @return the Set of all values or empty set if there are no matches | ||
585 | * | ||
586 | */ | ||
587 | public Set<EClass> getAllValuesOfs2() { | ||
588 | return rawStreamAllValuesOfs2(emptyArray()).collect(Collectors.toSet()); | ||
589 | } | ||
590 | |||
591 | /** | ||
592 | * Retrieve the set of values that occur in matches for s2. | ||
593 | * @return the Set of all values or empty set if there are no matches | ||
594 | * | ||
595 | */ | ||
596 | public Stream<EClass> streamAllValuesOfs2() { | ||
597 | return rawStreamAllValuesOfs2(emptyArray()); | ||
598 | } | ||
599 | |||
600 | /** | ||
601 | * Retrieve the set of values that occur in matches for s2. | ||
602 | * </p> | ||
603 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
604 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
605 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
606 | * | ||
607 | * @return the Stream of all values or empty set if there are no matches | ||
608 | * | ||
609 | */ | ||
610 | public Stream<EClass> streamAllValuesOfs2(final SameSuperClass.Match partialMatch) { | ||
611 | return rawStreamAllValuesOfs2(partialMatch.toArray()); | ||
612 | } | ||
613 | |||
614 | /** | ||
615 | * Retrieve the set of values that occur in matches for s2. | ||
616 | * </p> | ||
617 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
618 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
619 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
620 | * | ||
621 | * @return the Stream of all values or empty set if there are no matches | ||
622 | * | ||
623 | */ | ||
624 | public Stream<EClass> streamAllValuesOfs2(final EClass pC, final EClass pS1) { | ||
625 | return rawStreamAllValuesOfs2(new Object[]{pC, pS1, null}); | ||
626 | } | ||
627 | |||
628 | /** | ||
629 | * Retrieve the set of values that occur in matches for s2. | ||
630 | * @return the Set of all values or empty set if there are no matches | ||
631 | * | ||
632 | */ | ||
633 | public Set<EClass> getAllValuesOfs2(final SameSuperClass.Match partialMatch) { | ||
634 | return rawStreamAllValuesOfs2(partialMatch.toArray()).collect(Collectors.toSet()); | ||
635 | } | ||
636 | |||
637 | /** | ||
638 | * Retrieve the set of values that occur in matches for s2. | ||
639 | * @return the Set of all values or empty set if there are no matches | ||
640 | * | ||
641 | */ | ||
642 | public Set<EClass> getAllValuesOfs2(final EClass pC, final EClass pS1) { | ||
643 | return rawStreamAllValuesOfs2(new Object[]{pC, pS1, null}).collect(Collectors.toSet()); | ||
644 | } | ||
645 | |||
646 | @Override | ||
647 | protected SameSuperClass.Match tupleToMatch(final Tuple t) { | ||
648 | try { | ||
649 | return SameSuperClass.Match.newMatch((EClass) t.get(POSITION_C), (EClass) t.get(POSITION_S1), (EClass) t.get(POSITION_S2)); | ||
650 | } catch(ClassCastException e) { | ||
651 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
652 | return null; | ||
653 | } | ||
654 | } | ||
655 | |||
656 | @Override | ||
657 | protected SameSuperClass.Match arrayToMatch(final Object[] match) { | ||
658 | try { | ||
659 | return SameSuperClass.Match.newMatch((EClass) match[POSITION_C], (EClass) match[POSITION_S1], (EClass) match[POSITION_S2]); | ||
660 | } catch(ClassCastException e) { | ||
661 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
662 | return null; | ||
663 | } | ||
664 | } | ||
665 | |||
666 | @Override | ||
667 | protected SameSuperClass.Match arrayToMatchMutable(final Object[] match) { | ||
668 | try { | ||
669 | return SameSuperClass.Match.newMutableMatch((EClass) match[POSITION_C], (EClass) match[POSITION_S1], (EClass) match[POSITION_S2]); | ||
670 | } catch(ClassCastException e) { | ||
671 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
672 | return null; | ||
673 | } | ||
674 | } | ||
675 | |||
676 | /** | ||
677 | * @return the singleton instance of the query specification of this pattern | ||
678 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
679 | * | ||
680 | */ | ||
681 | public static IQuerySpecification<SameSuperClass.Matcher> querySpecification() { | ||
682 | return SameSuperClass.instance(); | ||
683 | } | ||
684 | } | ||
685 | |||
686 | private SameSuperClass() { | ||
687 | super(GeneratedPQuery.INSTANCE); | ||
688 | } | ||
689 | |||
690 | /** | ||
691 | * @return the singleton instance of the query specification | ||
692 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
693 | * | ||
694 | */ | ||
695 | public static SameSuperClass instance() { | ||
696 | try{ | ||
697 | return LazyHolder.INSTANCE; | ||
698 | } catch (ExceptionInInitializerError err) { | ||
699 | throw processInitializerError(err); | ||
700 | } | ||
701 | } | ||
702 | |||
703 | @Override | ||
704 | protected SameSuperClass.Matcher instantiate(final ViatraQueryEngine engine) { | ||
705 | return SameSuperClass.Matcher.on(engine); | ||
706 | } | ||
707 | |||
708 | @Override | ||
709 | public SameSuperClass.Matcher instantiate() { | ||
710 | return SameSuperClass.Matcher.create(); | ||
711 | } | ||
712 | |||
713 | @Override | ||
714 | public SameSuperClass.Match newEmptyMatch() { | ||
715 | return SameSuperClass.Match.newEmptyMatch(); | ||
716 | } | ||
717 | |||
718 | @Override | ||
719 | public SameSuperClass.Match newMatch(final Object... parameters) { | ||
720 | return SameSuperClass.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1], (org.eclipse.emf.ecore.EClass) parameters[2]); | ||
721 | } | ||
722 | |||
723 | /** | ||
724 | * Inner class allowing the singleton instance of {@link JvmGenericType: queries.SameSuperClass (visibility: PUBLIC, simpleName: SameSuperClass, identifier: queries.SameSuperClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
725 | * <b>not</b> at the class load time of the outer class, | ||
726 | * but rather at the first call to {@link JvmGenericType: queries.SameSuperClass (visibility: PUBLIC, simpleName: SameSuperClass, identifier: queries.SameSuperClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
727 | * | ||
728 | * <p> This workaround is required e.g. to support recursion. | ||
729 | * | ||
730 | */ | ||
731 | private static class LazyHolder { | ||
732 | private static final SameSuperClass INSTANCE = new SameSuperClass(); | ||
733 | |||
734 | /** | ||
735 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
736 | * This initialization order is required to support indirect recursion. | ||
737 | * | ||
738 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
739 | * | ||
740 | */ | ||
741 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
742 | |||
743 | public static Object ensureInitialized() { | ||
744 | INSTANCE.ensureInitializedInternal(); | ||
745 | return null; | ||
746 | } | ||
747 | } | ||
748 | |||
749 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
750 | private static final SameSuperClass.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
751 | |||
752 | private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
753 | |||
754 | private final PParameter parameter_s1 = new PParameter("s1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
755 | |||
756 | private final PParameter parameter_s2 = new PParameter("s2", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
757 | |||
758 | private final List<PParameter> parameters = Arrays.asList(parameter_c, parameter_s1, parameter_s2); | ||
759 | |||
760 | private GeneratedPQuery() { | ||
761 | super(PVisibility.PUBLIC); | ||
762 | } | ||
763 | |||
764 | @Override | ||
765 | public String getFullyQualifiedName() { | ||
766 | return "queries.sameSuperClass"; | ||
767 | } | ||
768 | |||
769 | @Override | ||
770 | public List<String> getParameterNames() { | ||
771 | return Arrays.asList("c","s1","s2"); | ||
772 | } | ||
773 | |||
774 | @Override | ||
775 | public List<PParameter> getParameters() { | ||
776 | return parameters; | ||
777 | } | ||
778 | |||
779 | @Override | ||
780 | public Set<PBody> doGetContainedBodies() { | ||
781 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
782 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
783 | { | ||
784 | PBody body = new PBody(this); | ||
785 | PVariable var_c = body.getOrCreateVariableByName("c"); | ||
786 | PVariable var_s1 = body.getOrCreateVariableByName("s1"); | ||
787 | PVariable var_s2 = body.getOrCreateVariableByName("s2"); | ||
788 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
789 | new TypeConstraint(body, Tuples.flatTupleOf(var_s1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
790 | new TypeConstraint(body, Tuples.flatTupleOf(var_s2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
791 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
792 | new ExportedParameter(body, var_c, parameter_c), | ||
793 | new ExportedParameter(body, var_s1, parameter_s1), | ||
794 | new ExportedParameter(body, var_s2, parameter_s2) | ||
795 | )); | ||
796 | // EClass.eSuperTypes(c, s1) | ||
797 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
798 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
799 | new TypeConstraint(body, Tuples.flatTupleOf(var_c, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
800 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
801 | new Equality(body, var__virtual_0_, var_s1); | ||
802 | // EClass.eSuperTypes(c, s2) | ||
803 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
804 | PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); | ||
805 | new TypeConstraint(body, Tuples.flatTupleOf(var_c, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
806 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
807 | new Equality(body, var__virtual_1_, var_s2); | ||
808 | // s1 == s2 | ||
809 | new Equality(body, var_s1, var_s2); | ||
810 | bodies.add(body); | ||
811 | } | ||
812 | { | ||
813 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
814 | annotation.addAttribute("severity", "error"); | ||
815 | annotation.addAttribute("message", "error"); | ||
816 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
817 | new ParameterReference("c") | ||
818 | })); | ||
819 | addAnnotation(annotation); | ||
820 | } | ||
821 | return bodies; | ||
822 | } | ||
823 | } | ||
824 | } | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java new file mode 100644 index 00000000..823e55da --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/SuperTypes.java | |||
@@ -0,0 +1,692 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/Ecore.vql | ||
3 | */ | ||
4 | package queries; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
19 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
20 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
21 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
25 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
38 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
39 | |||
40 | /** | ||
41 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
42 | * | ||
43 | * <p>Original source: | ||
44 | * <code><pre> | ||
45 | * pattern superTypes(c1:EClass, c2:EClass){ | ||
46 | * EClass.eSuperTypes(c1,c2); | ||
47 | * } | ||
48 | * </pre></code> | ||
49 | * | ||
50 | * @see Matcher | ||
51 | * @see Match | ||
52 | * | ||
53 | */ | ||
54 | @SuppressWarnings("all") | ||
55 | public final class SuperTypes extends BaseGeneratedEMFQuerySpecification<SuperTypes.Matcher> { | ||
56 | /** | ||
57 | * Pattern-specific match representation of the queries.superTypes pattern, | ||
58 | * to be used in conjunction with {@link Matcher}. | ||
59 | * | ||
60 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
61 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
62 | * usable to represent a match of the pattern in the result of a query, | ||
63 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
64 | * | ||
65 | * @see Matcher | ||
66 | * | ||
67 | */ | ||
68 | public static abstract class Match extends BasePatternMatch { | ||
69 | private EClass fC1; | ||
70 | |||
71 | private EClass fC2; | ||
72 | |||
73 | private static List<String> parameterNames = makeImmutableList("c1", "c2"); | ||
74 | |||
75 | private Match(final EClass pC1, final EClass pC2) { | ||
76 | this.fC1 = pC1; | ||
77 | this.fC2 = pC2; | ||
78 | } | ||
79 | |||
80 | @Override | ||
81 | public Object get(final String parameterName) { | ||
82 | if ("c1".equals(parameterName)) return this.fC1; | ||
83 | if ("c2".equals(parameterName)) return this.fC2; | ||
84 | return null; | ||
85 | } | ||
86 | |||
87 | public EClass getC1() { | ||
88 | return this.fC1; | ||
89 | } | ||
90 | |||
91 | public EClass getC2() { | ||
92 | return this.fC2; | ||
93 | } | ||
94 | |||
95 | @Override | ||
96 | public boolean set(final String parameterName, final Object newValue) { | ||
97 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
98 | if ("c1".equals(parameterName) ) { | ||
99 | this.fC1 = (EClass) newValue; | ||
100 | return true; | ||
101 | } | ||
102 | if ("c2".equals(parameterName) ) { | ||
103 | this.fC2 = (EClass) newValue; | ||
104 | return true; | ||
105 | } | ||
106 | return false; | ||
107 | } | ||
108 | |||
109 | public void setC1(final EClass pC1) { | ||
110 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
111 | this.fC1 = pC1; | ||
112 | } | ||
113 | |||
114 | public void setC2(final EClass pC2) { | ||
115 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
116 | this.fC2 = pC2; | ||
117 | } | ||
118 | |||
119 | @Override | ||
120 | public String patternName() { | ||
121 | return "queries.superTypes"; | ||
122 | } | ||
123 | |||
124 | @Override | ||
125 | public List<String> parameterNames() { | ||
126 | return SuperTypes.Match.parameterNames; | ||
127 | } | ||
128 | |||
129 | @Override | ||
130 | public Object[] toArray() { | ||
131 | return new Object[]{fC1, fC2}; | ||
132 | } | ||
133 | |||
134 | @Override | ||
135 | public SuperTypes.Match toImmutable() { | ||
136 | return isMutable() ? newMatch(fC1, fC2) : this; | ||
137 | } | ||
138 | |||
139 | @Override | ||
140 | public String prettyPrint() { | ||
141 | StringBuilder result = new StringBuilder(); | ||
142 | result.append("\"c1\"=" + prettyPrintValue(fC1) + ", "); | ||
143 | result.append("\"c2\"=" + prettyPrintValue(fC2)); | ||
144 | return result.toString(); | ||
145 | } | ||
146 | |||
147 | @Override | ||
148 | public int hashCode() { | ||
149 | return Objects.hash(fC1, fC2); | ||
150 | } | ||
151 | |||
152 | @Override | ||
153 | public boolean equals(final Object obj) { | ||
154 | if (this == obj) | ||
155 | return true; | ||
156 | if (obj == null) { | ||
157 | return false; | ||
158 | } | ||
159 | if ((obj instanceof SuperTypes.Match)) { | ||
160 | SuperTypes.Match other = (SuperTypes.Match) obj; | ||
161 | return Objects.equals(fC1, other.fC1) && Objects.equals(fC2, other.fC2); | ||
162 | } else { | ||
163 | // this should be infrequent | ||
164 | if (!(obj instanceof IPatternMatch)) { | ||
165 | return false; | ||
166 | } | ||
167 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
168 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | @Override | ||
173 | public SuperTypes specification() { | ||
174 | return SuperTypes.instance(); | ||
175 | } | ||
176 | |||
177 | /** | ||
178 | * Returns an empty, mutable match. | ||
179 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
180 | * | ||
181 | * @return the empty match. | ||
182 | * | ||
183 | */ | ||
184 | public static SuperTypes.Match newEmptyMatch() { | ||
185 | return new Mutable(null, null); | ||
186 | } | ||
187 | |||
188 | /** | ||
189 | * Returns a mutable (partial) match. | ||
190 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
191 | * | ||
192 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
193 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
194 | * @return the new, mutable (partial) match object. | ||
195 | * | ||
196 | */ | ||
197 | public static SuperTypes.Match newMutableMatch(final EClass pC1, final EClass pC2) { | ||
198 | return new Mutable(pC1, pC2); | ||
199 | } | ||
200 | |||
201 | /** | ||
202 | * Returns a new (partial) match. | ||
203 | * This can be used e.g. to call the matcher with a partial match. | ||
204 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
205 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
206 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
207 | * @return the (partial) match object. | ||
208 | * | ||
209 | */ | ||
210 | public static SuperTypes.Match newMatch(final EClass pC1, final EClass pC2) { | ||
211 | return new Immutable(pC1, pC2); | ||
212 | } | ||
213 | |||
214 | private static final class Mutable extends SuperTypes.Match { | ||
215 | Mutable(final EClass pC1, final EClass pC2) { | ||
216 | super(pC1, pC2); | ||
217 | } | ||
218 | |||
219 | @Override | ||
220 | public boolean isMutable() { | ||
221 | return true; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | private static final class Immutable extends SuperTypes.Match { | ||
226 | Immutable(final EClass pC1, final EClass pC2) { | ||
227 | super(pC1, pC2); | ||
228 | } | ||
229 | |||
230 | @Override | ||
231 | public boolean isMutable() { | ||
232 | return false; | ||
233 | } | ||
234 | } | ||
235 | } | ||
236 | |||
237 | /** | ||
238 | * Generated pattern matcher API of the queries.superTypes pattern, | ||
239 | * providing pattern-specific query methods. | ||
240 | * | ||
241 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
242 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
243 | * | ||
244 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
245 | * | ||
246 | * <p>Original source: | ||
247 | * <code><pre> | ||
248 | * pattern superTypes(c1:EClass, c2:EClass){ | ||
249 | * EClass.eSuperTypes(c1,c2); | ||
250 | * } | ||
251 | * </pre></code> | ||
252 | * | ||
253 | * @see Match | ||
254 | * @see SuperTypes | ||
255 | * | ||
256 | */ | ||
257 | public static class Matcher extends BaseMatcher<SuperTypes.Match> { | ||
258 | /** | ||
259 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
260 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
261 | * | ||
262 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
263 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
264 | * | ||
265 | */ | ||
266 | public static SuperTypes.Matcher on(final ViatraQueryEngine engine) { | ||
267 | // check if matcher already exists | ||
268 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
269 | if (matcher == null) { | ||
270 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
271 | } | ||
272 | return matcher; | ||
273 | } | ||
274 | |||
275 | /** | ||
276 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
277 | * @return an initialized matcher | ||
278 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
279 | * | ||
280 | */ | ||
281 | public static SuperTypes.Matcher create() { | ||
282 | return new Matcher(); | ||
283 | } | ||
284 | |||
285 | private static final int POSITION_C1 = 0; | ||
286 | |||
287 | private static final int POSITION_C2 = 1; | ||
288 | |||
289 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(SuperTypes.Matcher.class); | ||
290 | |||
291 | /** | ||
292 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
293 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
294 | * | ||
295 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
296 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
297 | * | ||
298 | */ | ||
299 | private Matcher() { | ||
300 | super(querySpecification()); | ||
301 | } | ||
302 | |||
303 | /** | ||
304 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
305 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
306 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
307 | * @return matches represented as a Match object. | ||
308 | * | ||
309 | */ | ||
310 | public Collection<SuperTypes.Match> getAllMatches(final EClass pC1, final EClass pC2) { | ||
311 | return rawStreamAllMatches(new Object[]{pC1, pC2}).collect(Collectors.toSet()); | ||
312 | } | ||
313 | |||
314 | /** | ||
315 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
316 | * </p> | ||
317 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
318 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
319 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
320 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
321 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
322 | * @return a stream of matches represented as a Match object. | ||
323 | * | ||
324 | */ | ||
325 | public Stream<SuperTypes.Match> streamAllMatches(final EClass pC1, final EClass pC2) { | ||
326 | return rawStreamAllMatches(new Object[]{pC1, pC2}); | ||
327 | } | ||
328 | |||
329 | /** | ||
330 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
331 | * Neither determinism nor randomness of selection is guaranteed. | ||
332 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
333 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
334 | * @return a match represented as a Match object, or null if no match is found. | ||
335 | * | ||
336 | */ | ||
337 | public Optional<SuperTypes.Match> getOneArbitraryMatch(final EClass pC1, final EClass pC2) { | ||
338 | return rawGetOneArbitraryMatch(new Object[]{pC1, pC2}); | ||
339 | } | ||
340 | |||
341 | /** | ||
342 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
343 | * under any possible substitution of the unspecified parameters (if any). | ||
344 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
345 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
346 | * @return true if the input is a valid (partial) match of the pattern. | ||
347 | * | ||
348 | */ | ||
349 | public boolean hasMatch(final EClass pC1, final EClass pC2) { | ||
350 | return rawHasMatch(new Object[]{pC1, pC2}); | ||
351 | } | ||
352 | |||
353 | /** | ||
354 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
355 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
356 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
357 | * @return the number of pattern matches found. | ||
358 | * | ||
359 | */ | ||
360 | public int countMatches(final EClass pC1, final EClass pC2) { | ||
361 | return rawCountMatches(new Object[]{pC1, pC2}); | ||
362 | } | ||
363 | |||
364 | /** | ||
365 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
366 | * Neither determinism nor randomness of selection is guaranteed. | ||
367 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
368 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
369 | * @param processor the action that will process the selected match. | ||
370 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
371 | * | ||
372 | */ | ||
373 | public boolean forOneArbitraryMatch(final EClass pC1, final EClass pC2, final Consumer<? super SuperTypes.Match> processor) { | ||
374 | return rawForOneArbitraryMatch(new Object[]{pC1, pC2}, processor); | ||
375 | } | ||
376 | |||
377 | /** | ||
378 | * Returns a new (partial) match. | ||
379 | * This can be used e.g. to call the matcher with a partial match. | ||
380 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
381 | * @param pC1 the fixed value of pattern parameter c1, or null if not bound. | ||
382 | * @param pC2 the fixed value of pattern parameter c2, or null if not bound. | ||
383 | * @return the (partial) match object. | ||
384 | * | ||
385 | */ | ||
386 | public SuperTypes.Match newMatch(final EClass pC1, final EClass pC2) { | ||
387 | return SuperTypes.Match.newMatch(pC1, pC2); | ||
388 | } | ||
389 | |||
390 | /** | ||
391 | * Retrieve the set of values that occur in matches for c1. | ||
392 | * @return the Set of all values or empty set if there are no matches | ||
393 | * | ||
394 | */ | ||
395 | protected Stream<EClass> rawStreamAllValuesOfc1(final Object[] parameters) { | ||
396 | return rawStreamAllValues(POSITION_C1, parameters).map(EClass.class::cast); | ||
397 | } | ||
398 | |||
399 | /** | ||
400 | * Retrieve the set of values that occur in matches for c1. | ||
401 | * @return the Set of all values or empty set if there are no matches | ||
402 | * | ||
403 | */ | ||
404 | public Set<EClass> getAllValuesOfc1() { | ||
405 | return rawStreamAllValuesOfc1(emptyArray()).collect(Collectors.toSet()); | ||
406 | } | ||
407 | |||
408 | /** | ||
409 | * Retrieve the set of values that occur in matches for c1. | ||
410 | * @return the Set of all values or empty set if there are no matches | ||
411 | * | ||
412 | */ | ||
413 | public Stream<EClass> streamAllValuesOfc1() { | ||
414 | return rawStreamAllValuesOfc1(emptyArray()); | ||
415 | } | ||
416 | |||
417 | /** | ||
418 | * Retrieve the set of values that occur in matches for c1. | ||
419 | * </p> | ||
420 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
421 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
422 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
423 | * | ||
424 | * @return the Stream of all values or empty set if there are no matches | ||
425 | * | ||
426 | */ | ||
427 | public Stream<EClass> streamAllValuesOfc1(final SuperTypes.Match partialMatch) { | ||
428 | return rawStreamAllValuesOfc1(partialMatch.toArray()); | ||
429 | } | ||
430 | |||
431 | /** | ||
432 | * Retrieve the set of values that occur in matches for c1. | ||
433 | * </p> | ||
434 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
435 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
436 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
437 | * | ||
438 | * @return the Stream of all values or empty set if there are no matches | ||
439 | * | ||
440 | */ | ||
441 | public Stream<EClass> streamAllValuesOfc1(final EClass pC2) { | ||
442 | return rawStreamAllValuesOfc1(new Object[]{null, pC2}); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * Retrieve the set of values that occur in matches for c1. | ||
447 | * @return the Set of all values or empty set if there are no matches | ||
448 | * | ||
449 | */ | ||
450 | public Set<EClass> getAllValuesOfc1(final SuperTypes.Match partialMatch) { | ||
451 | return rawStreamAllValuesOfc1(partialMatch.toArray()).collect(Collectors.toSet()); | ||
452 | } | ||
453 | |||
454 | /** | ||
455 | * Retrieve the set of values that occur in matches for c1. | ||
456 | * @return the Set of all values or empty set if there are no matches | ||
457 | * | ||
458 | */ | ||
459 | public Set<EClass> getAllValuesOfc1(final EClass pC2) { | ||
460 | return rawStreamAllValuesOfc1(new Object[]{null, pC2}).collect(Collectors.toSet()); | ||
461 | } | ||
462 | |||
463 | /** | ||
464 | * Retrieve the set of values that occur in matches for c2. | ||
465 | * @return the Set of all values or empty set if there are no matches | ||
466 | * | ||
467 | */ | ||
468 | protected Stream<EClass> rawStreamAllValuesOfc2(final Object[] parameters) { | ||
469 | return rawStreamAllValues(POSITION_C2, parameters).map(EClass.class::cast); | ||
470 | } | ||
471 | |||
472 | /** | ||
473 | * Retrieve the set of values that occur in matches for c2. | ||
474 | * @return the Set of all values or empty set if there are no matches | ||
475 | * | ||
476 | */ | ||
477 | public Set<EClass> getAllValuesOfc2() { | ||
478 | return rawStreamAllValuesOfc2(emptyArray()).collect(Collectors.toSet()); | ||
479 | } | ||
480 | |||
481 | /** | ||
482 | * Retrieve the set of values that occur in matches for c2. | ||
483 | * @return the Set of all values or empty set if there are no matches | ||
484 | * | ||
485 | */ | ||
486 | public Stream<EClass> streamAllValuesOfc2() { | ||
487 | return rawStreamAllValuesOfc2(emptyArray()); | ||
488 | } | ||
489 | |||
490 | /** | ||
491 | * Retrieve the set of values that occur in matches for c2. | ||
492 | * </p> | ||
493 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
494 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
495 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
496 | * | ||
497 | * @return the Stream of all values or empty set if there are no matches | ||
498 | * | ||
499 | */ | ||
500 | public Stream<EClass> streamAllValuesOfc2(final SuperTypes.Match partialMatch) { | ||
501 | return rawStreamAllValuesOfc2(partialMatch.toArray()); | ||
502 | } | ||
503 | |||
504 | /** | ||
505 | * Retrieve the set of values that occur in matches for c2. | ||
506 | * </p> | ||
507 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
508 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
509 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
510 | * | ||
511 | * @return the Stream of all values or empty set if there are no matches | ||
512 | * | ||
513 | */ | ||
514 | public Stream<EClass> streamAllValuesOfc2(final EClass pC1) { | ||
515 | return rawStreamAllValuesOfc2(new Object[]{pC1, null}); | ||
516 | } | ||
517 | |||
518 | /** | ||
519 | * Retrieve the set of values that occur in matches for c2. | ||
520 | * @return the Set of all values or empty set if there are no matches | ||
521 | * | ||
522 | */ | ||
523 | public Set<EClass> getAllValuesOfc2(final SuperTypes.Match partialMatch) { | ||
524 | return rawStreamAllValuesOfc2(partialMatch.toArray()).collect(Collectors.toSet()); | ||
525 | } | ||
526 | |||
527 | /** | ||
528 | * Retrieve the set of values that occur in matches for c2. | ||
529 | * @return the Set of all values or empty set if there are no matches | ||
530 | * | ||
531 | */ | ||
532 | public Set<EClass> getAllValuesOfc2(final EClass pC1) { | ||
533 | return rawStreamAllValuesOfc2(new Object[]{pC1, null}).collect(Collectors.toSet()); | ||
534 | } | ||
535 | |||
536 | @Override | ||
537 | protected SuperTypes.Match tupleToMatch(final Tuple t) { | ||
538 | try { | ||
539 | return SuperTypes.Match.newMatch((EClass) t.get(POSITION_C1), (EClass) t.get(POSITION_C2)); | ||
540 | } catch(ClassCastException e) { | ||
541 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
542 | return null; | ||
543 | } | ||
544 | } | ||
545 | |||
546 | @Override | ||
547 | protected SuperTypes.Match arrayToMatch(final Object[] match) { | ||
548 | try { | ||
549 | return SuperTypes.Match.newMatch((EClass) match[POSITION_C1], (EClass) match[POSITION_C2]); | ||
550 | } catch(ClassCastException e) { | ||
551 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
552 | return null; | ||
553 | } | ||
554 | } | ||
555 | |||
556 | @Override | ||
557 | protected SuperTypes.Match arrayToMatchMutable(final Object[] match) { | ||
558 | try { | ||
559 | return SuperTypes.Match.newMutableMatch((EClass) match[POSITION_C1], (EClass) match[POSITION_C2]); | ||
560 | } catch(ClassCastException e) { | ||
561 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
562 | return null; | ||
563 | } | ||
564 | } | ||
565 | |||
566 | /** | ||
567 | * @return the singleton instance of the query specification of this pattern | ||
568 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
569 | * | ||
570 | */ | ||
571 | public static IQuerySpecification<SuperTypes.Matcher> querySpecification() { | ||
572 | return SuperTypes.instance(); | ||
573 | } | ||
574 | } | ||
575 | |||
576 | private SuperTypes() { | ||
577 | super(GeneratedPQuery.INSTANCE); | ||
578 | } | ||
579 | |||
580 | /** | ||
581 | * @return the singleton instance of the query specification | ||
582 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
583 | * | ||
584 | */ | ||
585 | public static SuperTypes instance() { | ||
586 | try{ | ||
587 | return LazyHolder.INSTANCE; | ||
588 | } catch (ExceptionInInitializerError err) { | ||
589 | throw processInitializerError(err); | ||
590 | } | ||
591 | } | ||
592 | |||
593 | @Override | ||
594 | protected SuperTypes.Matcher instantiate(final ViatraQueryEngine engine) { | ||
595 | return SuperTypes.Matcher.on(engine); | ||
596 | } | ||
597 | |||
598 | @Override | ||
599 | public SuperTypes.Matcher instantiate() { | ||
600 | return SuperTypes.Matcher.create(); | ||
601 | } | ||
602 | |||
603 | @Override | ||
604 | public SuperTypes.Match newEmptyMatch() { | ||
605 | return SuperTypes.Match.newEmptyMatch(); | ||
606 | } | ||
607 | |||
608 | @Override | ||
609 | public SuperTypes.Match newMatch(final Object... parameters) { | ||
610 | return SuperTypes.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1]); | ||
611 | } | ||
612 | |||
613 | /** | ||
614 | * Inner class allowing the singleton instance of {@link JvmGenericType: queries.SuperTypes (visibility: PUBLIC, simpleName: SuperTypes, identifier: queries.SuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
615 | * <b>not</b> at the class load time of the outer class, | ||
616 | * but rather at the first call to {@link JvmGenericType: queries.SuperTypes (visibility: PUBLIC, simpleName: SuperTypes, identifier: queries.SuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: queries) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
617 | * | ||
618 | * <p> This workaround is required e.g. to support recursion. | ||
619 | * | ||
620 | */ | ||
621 | private static class LazyHolder { | ||
622 | private static final SuperTypes INSTANCE = new SuperTypes(); | ||
623 | |||
624 | /** | ||
625 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
626 | * This initialization order is required to support indirect recursion. | ||
627 | * | ||
628 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
629 | * | ||
630 | */ | ||
631 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
632 | |||
633 | public static Object ensureInitialized() { | ||
634 | INSTANCE.ensureInitializedInternal(); | ||
635 | return null; | ||
636 | } | ||
637 | } | ||
638 | |||
639 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
640 | private static final SuperTypes.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
641 | |||
642 | private final PParameter parameter_c1 = new PParameter("c1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
643 | |||
644 | private final PParameter parameter_c2 = new PParameter("c2", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
645 | |||
646 | private final List<PParameter> parameters = Arrays.asList(parameter_c1, parameter_c2); | ||
647 | |||
648 | private GeneratedPQuery() { | ||
649 | super(PVisibility.PUBLIC); | ||
650 | } | ||
651 | |||
652 | @Override | ||
653 | public String getFullyQualifiedName() { | ||
654 | return "queries.superTypes"; | ||
655 | } | ||
656 | |||
657 | @Override | ||
658 | public List<String> getParameterNames() { | ||
659 | return Arrays.asList("c1","c2"); | ||
660 | } | ||
661 | |||
662 | @Override | ||
663 | public List<PParameter> getParameters() { | ||
664 | return parameters; | ||
665 | } | ||
666 | |||
667 | @Override | ||
668 | public Set<PBody> doGetContainedBodies() { | ||
669 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
670 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
671 | { | ||
672 | PBody body = new PBody(this); | ||
673 | PVariable var_c1 = body.getOrCreateVariableByName("c1"); | ||
674 | PVariable var_c2 = body.getOrCreateVariableByName("c2"); | ||
675 | new TypeConstraint(body, Tuples.flatTupleOf(var_c1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
676 | new TypeConstraint(body, Tuples.flatTupleOf(var_c2), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
677 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
678 | new ExportedParameter(body, var_c1, parameter_c1), | ||
679 | new ExportedParameter(body, var_c2, parameter_c2) | ||
680 | )); | ||
681 | // EClass.eSuperTypes(c1,c2) | ||
682 | new TypeConstraint(body, Tuples.flatTupleOf(var_c1), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
683 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
684 | new TypeConstraint(body, Tuples.flatTupleOf(var_c1, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
685 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
686 | new Equality(body, var__virtual_0_, var_c2); | ||
687 | bodies.add(body); | ||
688 | } | ||
689 | return bodies; | ||
690 | } | ||
691 | } | ||
692 | } | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig index 4ce9da27..04351a6e 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/yakinduGeneration.vsconfig | |||
@@ -9,19 +9,19 @@ generate { | |||
9 | solver = ViatraSolver | 9 | solver = ViatraSolver |
10 | 10 | ||
11 | scope = { | 11 | scope = { |
12 | #node = 98 | 12 | #node = 30 |
13 | } | 13 | } |
14 | 14 | ||
15 | number = 1 | 15 | number = 1 |
16 | runs = 1 | 16 | runs = 100 |
17 | config = { | 17 | config = { |
18 | log-level = none, | 18 | log-level = none, |
19 | "optional-wf" = "true", | 19 | "optional-wf" = "false", |
20 | "realistic-guidance" = "Composite", | 20 | "realistic-guidance" = "Composite", |
21 | "allow-must-violations" = "true", | 21 | "allow-must-violations" = "false", |
22 | "domain" = "Yakindumm" | 22 | "domain" = "Yakindumm" |
23 | } | 23 | } |
24 | 24 | ||
25 | debug = "debug" | 25 | debug = "debug" |
26 | output = "output/Viatra_100/" | 26 | output = "output/real_30+v/" |
27 | } \ No newline at end of file | 27 | } \ No newline at end of file |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF index 138f034a..71eeb2c4 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/META-INF/MANIFEST.MF | |||
@@ -18,7 +18,8 @@ Require-Bundle: com.google.guava, | |||
18 | org.eclipse.viatra.query.runtime.rete;bundle-version="2.1.2", | 18 | org.eclipse.viatra.query.runtime.rete;bundle-version="2.1.2", |
19 | org.eclipse.viatra.addon.validation.core;bundle-version="2.1.2", | 19 | org.eclipse.viatra.addon.validation.core;bundle-version="2.1.2", |
20 | org.eclipse.collections;bundle-version="9.2.0", | 20 | org.eclipse.collections;bundle-version="9.2.0", |
21 | org.eclipse.viatra.query.runtime.localsearch;bundle-version="2.1.2" | 21 | org.eclipse.viatra.query.runtime.localsearch;bundle-version="2.1.2", |
22 | org.apache.log4j;bundle-version="1.2.15" | ||
22 | Export-Package: ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app, | 23 | Export-Package: ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app, |
23 | ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance, | 24 | ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance, |
24 | ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph, | 25 | ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph, |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java new file mode 100644 index 00000000..5243b104 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/constraints/ecore/MoreThenFiveSuperTypesConstraint0.java | |||
@@ -0,0 +1,79 @@ | |||
1 | /** | ||
2 | Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | ||
3 | */ | ||
4 | package constraints.ecore; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.HashMap; | ||
8 | import java.util.HashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Map; | ||
11 | import java.util.Set; | ||
12 | |||
13 | import org.eclipse.viatra.addon.validation.core.api.IConstraintSpecification; | ||
14 | import org.eclipse.viatra.addon.validation.core.api.Severity; | ||
15 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
16 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
17 | import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher; | ||
18 | |||
19 | import ecore.MoreThenFiveSuperTypes; | ||
20 | |||
21 | public class MoreThenFiveSuperTypesConstraint0 implements IConstraintSpecification { | ||
22 | |||
23 | private MoreThenFiveSuperTypes querySpecification; | ||
24 | |||
25 | public MoreThenFiveSuperTypesConstraint0() { | ||
26 | querySpecification = MoreThenFiveSuperTypes.instance(); | ||
27 | } | ||
28 | |||
29 | @Override | ||
30 | public String getMessageFormat() { | ||
31 | return "error"; | ||
32 | } | ||
33 | |||
34 | |||
35 | @Override | ||
36 | public Map<String,Object> getKeyObjects(IPatternMatch signature) { | ||
37 | Map<String,Object> map = new HashMap<>(); | ||
38 | map.put("c",signature.get("c")); | ||
39 | return map; | ||
40 | } | ||
41 | |||
42 | @Override | ||
43 | public List<String> getKeyNames() { | ||
44 | List<String> keyNames = Arrays.asList( | ||
45 | "c" | ||
46 | ); | ||
47 | return keyNames; | ||
48 | } | ||
49 | |||
50 | @Override | ||
51 | public List<String> getPropertyNames() { | ||
52 | List<String> propertyNames = Arrays.asList( | ||
53 | ); | ||
54 | return propertyNames; | ||
55 | } | ||
56 | |||
57 | @Override | ||
58 | public Set<List<String>> getSymmetricPropertyNames() { | ||
59 | Set<List<String>> symmetricPropertyNamesSet = new HashSet<>(); | ||
60 | return symmetricPropertyNamesSet; | ||
61 | } | ||
62 | |||
63 | @Override | ||
64 | public Set<List<String>> getSymmetricKeyNames() { | ||
65 | Set<List<String>> symmetricKeyNamesSet = new HashSet<>(); | ||
66 | return symmetricKeyNamesSet; | ||
67 | } | ||
68 | |||
69 | @Override | ||
70 | public Severity getSeverity() { | ||
71 | return Severity.ERROR; | ||
72 | } | ||
73 | |||
74 | @Override | ||
75 | public IQuerySpecification<? extends ViatraQueryMatcher<? extends IPatternMatch>> getQuerySpecification() { | ||
76 | return querySpecification; | ||
77 | } | ||
78 | |||
79 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore new file mode 100644 index 00000000..c42ca056 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/.gitignore | |||
@@ -0,0 +1,8 @@ | |||
1 | /.Ecore_pattern.java._trace | ||
2 | /.MoreThenFiveSuperTypes.java._trace | ||
3 | /.DirectSupertype.java._trace | ||
4 | /.Ecore.java._trace | ||
5 | /.LoopInInheritence.java._trace | ||
6 | /.NonSymmetricOpposite.java._trace | ||
7 | /.Opposite.java._trace | ||
8 | /.OppositeDifferentClass.java._trace | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java new file mode 100644 index 00000000..a6ffad45 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/DirectSupertype.java | |||
@@ -0,0 +1,692 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
19 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
20 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
21 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
25 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
38 | import 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") | ||
55 | public final class DirectSupertype extends BaseGeneratedEMFQuerySpecification<DirectSupertype.Matcher> { | ||
56 | /** | ||
57 | * Pattern-specific match representation of the ecore.directSupertype pattern, | ||
58 | * to be used in conjunction with {@link Matcher}. | ||
59 | * | ||
60 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
61 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
62 | * usable to represent a match of the pattern in the result of a query, | ||
63 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
64 | * | ||
65 | * @see Matcher | ||
66 | * | ||
67 | */ | ||
68 | public static abstract class Match extends BasePatternMatch { | ||
69 | private EClass fA; | ||
70 | |||
71 | private EClass fB; | ||
72 | |||
73 | private static List<String> parameterNames = makeImmutableList("a", "b"); | ||
74 | |||
75 | private Match(final EClass pA, final EClass pB) { | ||
76 | this.fA = pA; | ||
77 | this.fB = pB; | ||
78 | } | ||
79 | |||
80 | @Override | ||
81 | public Object get(final String parameterName) { | ||
82 | if ("a".equals(parameterName)) return this.fA; | ||
83 | if ("b".equals(parameterName)) return this.fB; | ||
84 | return null; | ||
85 | } | ||
86 | |||
87 | public EClass getA() { | ||
88 | return this.fA; | ||
89 | } | ||
90 | |||
91 | public EClass getB() { | ||
92 | return this.fB; | ||
93 | } | ||
94 | |||
95 | @Override | ||
96 | public boolean set(final String parameterName, final Object newValue) { | ||
97 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
98 | if ("a".equals(parameterName) ) { | ||
99 | this.fA = (EClass) newValue; | ||
100 | return true; | ||
101 | } | ||
102 | if ("b".equals(parameterName) ) { | ||
103 | this.fB = (EClass) newValue; | ||
104 | return true; | ||
105 | } | ||
106 | return false; | ||
107 | } | ||
108 | |||
109 | public void setA(final EClass pA) { | ||
110 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
111 | this.fA = pA; | ||
112 | } | ||
113 | |||
114 | public void setB(final EClass pB) { | ||
115 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
116 | this.fB = pB; | ||
117 | } | ||
118 | |||
119 | @Override | ||
120 | public String patternName() { | ||
121 | return "ecore.directSupertype"; | ||
122 | } | ||
123 | |||
124 | @Override | ||
125 | public List<String> parameterNames() { | ||
126 | return DirectSupertype.Match.parameterNames; | ||
127 | } | ||
128 | |||
129 | @Override | ||
130 | public Object[] toArray() { | ||
131 | return new Object[]{fA, fB}; | ||
132 | } | ||
133 | |||
134 | @Override | ||
135 | public DirectSupertype.Match toImmutable() { | ||
136 | return isMutable() ? newMatch(fA, fB) : this; | ||
137 | } | ||
138 | |||
139 | @Override | ||
140 | public String prettyPrint() { | ||
141 | StringBuilder result = new StringBuilder(); | ||
142 | result.append("\"a\"=" + prettyPrintValue(fA) + ", "); | ||
143 | result.append("\"b\"=" + prettyPrintValue(fB)); | ||
144 | return result.toString(); | ||
145 | } | ||
146 | |||
147 | @Override | ||
148 | public int hashCode() { | ||
149 | return Objects.hash(fA, fB); | ||
150 | } | ||
151 | |||
152 | @Override | ||
153 | public boolean equals(final Object obj) { | ||
154 | if (this == obj) | ||
155 | return true; | ||
156 | if (obj == null) { | ||
157 | return false; | ||
158 | } | ||
159 | if ((obj instanceof DirectSupertype.Match)) { | ||
160 | DirectSupertype.Match other = (DirectSupertype.Match) obj; | ||
161 | return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB); | ||
162 | } else { | ||
163 | // this should be infrequent | ||
164 | if (!(obj instanceof IPatternMatch)) { | ||
165 | return false; | ||
166 | } | ||
167 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
168 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | @Override | ||
173 | public DirectSupertype specification() { | ||
174 | return DirectSupertype.instance(); | ||
175 | } | ||
176 | |||
177 | /** | ||
178 | * Returns an empty, mutable match. | ||
179 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
180 | * | ||
181 | * @return the empty match. | ||
182 | * | ||
183 | */ | ||
184 | public static DirectSupertype.Match newEmptyMatch() { | ||
185 | return new Mutable(null, null); | ||
186 | } | ||
187 | |||
188 | /** | ||
189 | * Returns a mutable (partial) match. | ||
190 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
191 | * | ||
192 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
193 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
194 | * @return the new, mutable (partial) match object. | ||
195 | * | ||
196 | */ | ||
197 | public static DirectSupertype.Match newMutableMatch(final EClass pA, final EClass pB) { | ||
198 | return new Mutable(pA, pB); | ||
199 | } | ||
200 | |||
201 | /** | ||
202 | * Returns a new (partial) match. | ||
203 | * This can be used e.g. to call the matcher with a partial match. | ||
204 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
205 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
206 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
207 | * @return the (partial) match object. | ||
208 | * | ||
209 | */ | ||
210 | public static DirectSupertype.Match newMatch(final EClass pA, final EClass pB) { | ||
211 | return new Immutable(pA, pB); | ||
212 | } | ||
213 | |||
214 | private static final class Mutable extends DirectSupertype.Match { | ||
215 | Mutable(final EClass pA, final EClass pB) { | ||
216 | super(pA, pB); | ||
217 | } | ||
218 | |||
219 | @Override | ||
220 | public boolean isMutable() { | ||
221 | return true; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | private static final class Immutable extends DirectSupertype.Match { | ||
226 | Immutable(final EClass pA, final EClass pB) { | ||
227 | super(pA, pB); | ||
228 | } | ||
229 | |||
230 | @Override | ||
231 | public boolean isMutable() { | ||
232 | return false; | ||
233 | } | ||
234 | } | ||
235 | } | ||
236 | |||
237 | /** | ||
238 | * Generated pattern matcher API of the ecore.directSupertype pattern, | ||
239 | * providing pattern-specific query methods. | ||
240 | * | ||
241 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
242 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
243 | * | ||
244 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
245 | * | ||
246 | * <p>Original source: | ||
247 | * <code><pre> | ||
248 | * pattern directSupertype(a: EClass, b:EClass) { | ||
249 | * EClass.eSuperTypes(a,b); | ||
250 | * } | ||
251 | * </pre></code> | ||
252 | * | ||
253 | * @see Match | ||
254 | * @see DirectSupertype | ||
255 | * | ||
256 | */ | ||
257 | public static class Matcher extends BaseMatcher<DirectSupertype.Match> { | ||
258 | /** | ||
259 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
260 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
261 | * | ||
262 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
263 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
264 | * | ||
265 | */ | ||
266 | public static DirectSupertype.Matcher on(final ViatraQueryEngine engine) { | ||
267 | // check if matcher already exists | ||
268 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
269 | if (matcher == null) { | ||
270 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
271 | } | ||
272 | return matcher; | ||
273 | } | ||
274 | |||
275 | /** | ||
276 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
277 | * @return an initialized matcher | ||
278 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
279 | * | ||
280 | */ | ||
281 | public static DirectSupertype.Matcher create() { | ||
282 | return new Matcher(); | ||
283 | } | ||
284 | |||
285 | private static final int POSITION_A = 0; | ||
286 | |||
287 | private static final int POSITION_B = 1; | ||
288 | |||
289 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(DirectSupertype.Matcher.class); | ||
290 | |||
291 | /** | ||
292 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
293 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
294 | * | ||
295 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
296 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
297 | * | ||
298 | */ | ||
299 | private Matcher() { | ||
300 | super(querySpecification()); | ||
301 | } | ||
302 | |||
303 | /** | ||
304 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
305 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
306 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
307 | * @return matches represented as a Match object. | ||
308 | * | ||
309 | */ | ||
310 | public Collection<DirectSupertype.Match> getAllMatches(final EClass pA, final EClass pB) { | ||
311 | return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet()); | ||
312 | } | ||
313 | |||
314 | /** | ||
315 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
316 | * </p> | ||
317 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
318 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
319 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
320 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
321 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
322 | * @return a stream of matches represented as a Match object. | ||
323 | * | ||
324 | */ | ||
325 | public Stream<DirectSupertype.Match> streamAllMatches(final EClass pA, final EClass pB) { | ||
326 | return rawStreamAllMatches(new Object[]{pA, pB}); | ||
327 | } | ||
328 | |||
329 | /** | ||
330 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
331 | * Neither determinism nor randomness of selection is guaranteed. | ||
332 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
333 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
334 | * @return a match represented as a Match object, or null if no match is found. | ||
335 | * | ||
336 | */ | ||
337 | public Optional<DirectSupertype.Match> getOneArbitraryMatch(final EClass pA, final EClass pB) { | ||
338 | return rawGetOneArbitraryMatch(new Object[]{pA, pB}); | ||
339 | } | ||
340 | |||
341 | /** | ||
342 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
343 | * under any possible substitution of the unspecified parameters (if any). | ||
344 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
345 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
346 | * @return true if the input is a valid (partial) match of the pattern. | ||
347 | * | ||
348 | */ | ||
349 | public boolean hasMatch(final EClass pA, final EClass pB) { | ||
350 | return rawHasMatch(new Object[]{pA, pB}); | ||
351 | } | ||
352 | |||
353 | /** | ||
354 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
355 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
356 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
357 | * @return the number of pattern matches found. | ||
358 | * | ||
359 | */ | ||
360 | public int countMatches(final EClass pA, final EClass pB) { | ||
361 | return rawCountMatches(new Object[]{pA, pB}); | ||
362 | } | ||
363 | |||
364 | /** | ||
365 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
366 | * Neither determinism nor randomness of selection is guaranteed. | ||
367 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
368 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
369 | * @param processor the action that will process the selected match. | ||
370 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
371 | * | ||
372 | */ | ||
373 | public boolean forOneArbitraryMatch(final EClass pA, final EClass pB, final Consumer<? super DirectSupertype.Match> processor) { | ||
374 | return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor); | ||
375 | } | ||
376 | |||
377 | /** | ||
378 | * Returns a new (partial) match. | ||
379 | * This can be used e.g. to call the matcher with a partial match. | ||
380 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
381 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
382 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
383 | * @return the (partial) match object. | ||
384 | * | ||
385 | */ | ||
386 | public DirectSupertype.Match newMatch(final EClass pA, final EClass pB) { | ||
387 | return DirectSupertype.Match.newMatch(pA, pB); | ||
388 | } | ||
389 | |||
390 | /** | ||
391 | * Retrieve the set of values that occur in matches for a. | ||
392 | * @return the Set of all values or empty set if there are no matches | ||
393 | * | ||
394 | */ | ||
395 | protected Stream<EClass> rawStreamAllValuesOfa(final Object[] parameters) { | ||
396 | return rawStreamAllValues(POSITION_A, parameters).map(EClass.class::cast); | ||
397 | } | ||
398 | |||
399 | /** | ||
400 | * Retrieve the set of values that occur in matches for a. | ||
401 | * @return the Set of all values or empty set if there are no matches | ||
402 | * | ||
403 | */ | ||
404 | public Set<EClass> getAllValuesOfa() { | ||
405 | return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet()); | ||
406 | } | ||
407 | |||
408 | /** | ||
409 | * Retrieve the set of values that occur in matches for a. | ||
410 | * @return the Set of all values or empty set if there are no matches | ||
411 | * | ||
412 | */ | ||
413 | public Stream<EClass> streamAllValuesOfa() { | ||
414 | return rawStreamAllValuesOfa(emptyArray()); | ||
415 | } | ||
416 | |||
417 | /** | ||
418 | * Retrieve the set of values that occur in matches for a. | ||
419 | * </p> | ||
420 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
421 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
422 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
423 | * | ||
424 | * @return the Stream of all values or empty set if there are no matches | ||
425 | * | ||
426 | */ | ||
427 | public Stream<EClass> streamAllValuesOfa(final DirectSupertype.Match partialMatch) { | ||
428 | return rawStreamAllValuesOfa(partialMatch.toArray()); | ||
429 | } | ||
430 | |||
431 | /** | ||
432 | * Retrieve the set of values that occur in matches for a. | ||
433 | * </p> | ||
434 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
435 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
436 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
437 | * | ||
438 | * @return the Stream of all values or empty set if there are no matches | ||
439 | * | ||
440 | */ | ||
441 | public Stream<EClass> streamAllValuesOfa(final EClass pB) { | ||
442 | return rawStreamAllValuesOfa(new Object[]{null, pB}); | ||
443 | } | ||
444 | |||
445 | /** | ||
446 | * Retrieve the set of values that occur in matches for a. | ||
447 | * @return the Set of all values or empty set if there are no matches | ||
448 | * | ||
449 | */ | ||
450 | public Set<EClass> getAllValuesOfa(final DirectSupertype.Match partialMatch) { | ||
451 | return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet()); | ||
452 | } | ||
453 | |||
454 | /** | ||
455 | * Retrieve the set of values that occur in matches for a. | ||
456 | * @return the Set of all values or empty set if there are no matches | ||
457 | * | ||
458 | */ | ||
459 | public Set<EClass> getAllValuesOfa(final EClass pB) { | ||
460 | return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet()); | ||
461 | } | ||
462 | |||
463 | /** | ||
464 | * Retrieve the set of values that occur in matches for b. | ||
465 | * @return the Set of all values or empty set if there are no matches | ||
466 | * | ||
467 | */ | ||
468 | protected Stream<EClass> rawStreamAllValuesOfb(final Object[] parameters) { | ||
469 | return rawStreamAllValues(POSITION_B, parameters).map(EClass.class::cast); | ||
470 | } | ||
471 | |||
472 | /** | ||
473 | * Retrieve the set of values that occur in matches for b. | ||
474 | * @return the Set of all values or empty set if there are no matches | ||
475 | * | ||
476 | */ | ||
477 | public Set<EClass> getAllValuesOfb() { | ||
478 | return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet()); | ||
479 | } | ||
480 | |||
481 | /** | ||
482 | * Retrieve the set of values that occur in matches for b. | ||
483 | * @return the Set of all values or empty set if there are no matches | ||
484 | * | ||
485 | */ | ||
486 | public Stream<EClass> streamAllValuesOfb() { | ||
487 | return rawStreamAllValuesOfb(emptyArray()); | ||
488 | } | ||
489 | |||
490 | /** | ||
491 | * Retrieve the set of values that occur in matches for b. | ||
492 | * </p> | ||
493 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
494 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
495 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
496 | * | ||
497 | * @return the Stream of all values or empty set if there are no matches | ||
498 | * | ||
499 | */ | ||
500 | public Stream<EClass> streamAllValuesOfb(final DirectSupertype.Match partialMatch) { | ||
501 | return rawStreamAllValuesOfb(partialMatch.toArray()); | ||
502 | } | ||
503 | |||
504 | /** | ||
505 | * Retrieve the set of values that occur in matches for b. | ||
506 | * </p> | ||
507 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
508 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
509 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
510 | * | ||
511 | * @return the Stream of all values or empty set if there are no matches | ||
512 | * | ||
513 | */ | ||
514 | public Stream<EClass> streamAllValuesOfb(final EClass pA) { | ||
515 | return rawStreamAllValuesOfb(new Object[]{pA, null}); | ||
516 | } | ||
517 | |||
518 | /** | ||
519 | * Retrieve the set of values that occur in matches for b. | ||
520 | * @return the Set of all values or empty set if there are no matches | ||
521 | * | ||
522 | */ | ||
523 | public Set<EClass> getAllValuesOfb(final DirectSupertype.Match partialMatch) { | ||
524 | return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet()); | ||
525 | } | ||
526 | |||
527 | /** | ||
528 | * Retrieve the set of values that occur in matches for b. | ||
529 | * @return the Set of all values or empty set if there are no matches | ||
530 | * | ||
531 | */ | ||
532 | public Set<EClass> getAllValuesOfb(final EClass pA) { | ||
533 | return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet()); | ||
534 | } | ||
535 | |||
536 | @Override | ||
537 | protected DirectSupertype.Match tupleToMatch(final Tuple t) { | ||
538 | try { | ||
539 | return DirectSupertype.Match.newMatch((EClass) t.get(POSITION_A), (EClass) t.get(POSITION_B)); | ||
540 | } catch(ClassCastException e) { | ||
541 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
542 | return null; | ||
543 | } | ||
544 | } | ||
545 | |||
546 | @Override | ||
547 | protected DirectSupertype.Match arrayToMatch(final Object[] match) { | ||
548 | try { | ||
549 | return DirectSupertype.Match.newMatch((EClass) match[POSITION_A], (EClass) match[POSITION_B]); | ||
550 | } catch(ClassCastException e) { | ||
551 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
552 | return null; | ||
553 | } | ||
554 | } | ||
555 | |||
556 | @Override | ||
557 | protected DirectSupertype.Match arrayToMatchMutable(final Object[] match) { | ||
558 | try { | ||
559 | return DirectSupertype.Match.newMutableMatch((EClass) match[POSITION_A], (EClass) match[POSITION_B]); | ||
560 | } catch(ClassCastException e) { | ||
561 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
562 | return null; | ||
563 | } | ||
564 | } | ||
565 | |||
566 | /** | ||
567 | * @return the singleton instance of the query specification of this pattern | ||
568 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
569 | * | ||
570 | */ | ||
571 | public static IQuerySpecification<DirectSupertype.Matcher> querySpecification() { | ||
572 | return DirectSupertype.instance(); | ||
573 | } | ||
574 | } | ||
575 | |||
576 | private DirectSupertype() { | ||
577 | super(GeneratedPQuery.INSTANCE); | ||
578 | } | ||
579 | |||
580 | /** | ||
581 | * @return the singleton instance of the query specification | ||
582 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
583 | * | ||
584 | */ | ||
585 | public static DirectSupertype instance() { | ||
586 | try{ | ||
587 | return LazyHolder.INSTANCE; | ||
588 | } catch (ExceptionInInitializerError err) { | ||
589 | throw processInitializerError(err); | ||
590 | } | ||
591 | } | ||
592 | |||
593 | @Override | ||
594 | protected DirectSupertype.Matcher instantiate(final ViatraQueryEngine engine) { | ||
595 | return DirectSupertype.Matcher.on(engine); | ||
596 | } | ||
597 | |||
598 | @Override | ||
599 | public DirectSupertype.Matcher instantiate() { | ||
600 | return DirectSupertype.Matcher.create(); | ||
601 | } | ||
602 | |||
603 | @Override | ||
604 | public DirectSupertype.Match newEmptyMatch() { | ||
605 | return DirectSupertype.Match.newEmptyMatch(); | ||
606 | } | ||
607 | |||
608 | @Override | ||
609 | public DirectSupertype.Match newMatch(final Object... parameters) { | ||
610 | return DirectSupertype.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0], (org.eclipse.emf.ecore.EClass) parameters[1]); | ||
611 | } | ||
612 | |||
613 | /** | ||
614 | * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.DirectSupertype (visibility: PUBLIC, simpleName: DirectSupertype, identifier: ecore.DirectSupertype, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
615 | * <b>not</b> at the class load time of the outer class, | ||
616 | * but rather at the first call to {@link JvmGenericType: ecore.DirectSupertype (visibility: PUBLIC, simpleName: DirectSupertype, identifier: ecore.DirectSupertype, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
617 | * | ||
618 | * <p> This workaround is required e.g. to support recursion. | ||
619 | * | ||
620 | */ | ||
621 | private static class LazyHolder { | ||
622 | private static final DirectSupertype INSTANCE = new DirectSupertype(); | ||
623 | |||
624 | /** | ||
625 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
626 | * This initialization order is required to support indirect recursion. | ||
627 | * | ||
628 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
629 | * | ||
630 | */ | ||
631 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
632 | |||
633 | public static Object ensureInitialized() { | ||
634 | INSTANCE.ensureInitializedInternal(); | ||
635 | return null; | ||
636 | } | ||
637 | } | ||
638 | |||
639 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
640 | private static final DirectSupertype.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
641 | |||
642 | private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
643 | |||
644 | private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
645 | |||
646 | private final List<PParameter> parameters = Arrays.asList(parameter_a, parameter_b); | ||
647 | |||
648 | private GeneratedPQuery() { | ||
649 | super(PVisibility.PUBLIC); | ||
650 | } | ||
651 | |||
652 | @Override | ||
653 | public String getFullyQualifiedName() { | ||
654 | return "ecore.directSupertype"; | ||
655 | } | ||
656 | |||
657 | @Override | ||
658 | public List<String> getParameterNames() { | ||
659 | return Arrays.asList("a","b"); | ||
660 | } | ||
661 | |||
662 | @Override | ||
663 | public List<PParameter> getParameters() { | ||
664 | return parameters; | ||
665 | } | ||
666 | |||
667 | @Override | ||
668 | public Set<PBody> doGetContainedBodies() { | ||
669 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
670 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
671 | { | ||
672 | PBody body = new PBody(this); | ||
673 | PVariable var_a = body.getOrCreateVariableByName("a"); | ||
674 | PVariable var_b = body.getOrCreateVariableByName("b"); | ||
675 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
676 | new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
677 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
678 | new ExportedParameter(body, var_a, parameter_a), | ||
679 | new ExportedParameter(body, var_b, parameter_b) | ||
680 | )); | ||
681 | // EClass.eSuperTypes(a,b) | ||
682 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
683 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
684 | new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
685 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
686 | new Equality(body, var__virtual_0_, var_b); | ||
687 | bodies.add(body); | ||
688 | } | ||
689 | return bodies; | ||
690 | } | ||
691 | } | ||
692 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java new file mode 100644 index 00000000..bca43a17 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore.java | |||
@@ -0,0 +1,97 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import ecore.DirectSupertype; | ||
7 | import ecore.LoopInInheritence; | ||
8 | import ecore.NonSymmetricOpposite; | ||
9 | import ecore.Opposite; | ||
10 | import ecore.OppositeDifferentClass; | ||
11 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
12 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; | ||
13 | |||
14 | /** | ||
15 | * A pattern group formed of all public patterns defined in Ecore.vql. | ||
16 | * | ||
17 | * <p>Use the static instance as any {@link interface org.eclipse.viatra.query.runtime.api.IQueryGroup}, to conveniently prepare | ||
18 | * a VIATRA Query engine for matching all patterns originally defined in file Ecore.vql, | ||
19 | * in order to achieve better performance than one-by-one on-demand matcher initialization. | ||
20 | * | ||
21 | * <p> From package ecore, the group contains the definition of the following patterns: <ul> | ||
22 | * <li>directSupertype</li> | ||
23 | * <li>loopInInheritence</li> | ||
24 | * <li>opposite</li> | ||
25 | * <li>oppositeDifferentClass</li> | ||
26 | * <li>nonSymmetricOpposite</li> | ||
27 | * </ul> | ||
28 | * | ||
29 | * @see IQueryGroup | ||
30 | * | ||
31 | */ | ||
32 | @SuppressWarnings("all") | ||
33 | public final class Ecore extends BaseGeneratedPatternGroup { | ||
34 | /** | ||
35 | * Access the pattern group. | ||
36 | * | ||
37 | * @return the singleton instance of the group | ||
38 | * @throws ViatraQueryRuntimeException if there was an error loading the generated code of pattern specifications | ||
39 | * | ||
40 | */ | ||
41 | public static Ecore instance() { | ||
42 | if (INSTANCE == null) { | ||
43 | INSTANCE = new Ecore(); | ||
44 | } | ||
45 | return INSTANCE; | ||
46 | } | ||
47 | |||
48 | private static Ecore INSTANCE; | ||
49 | |||
50 | private Ecore() { | ||
51 | querySpecifications.add(DirectSupertype.instance()); | ||
52 | querySpecifications.add(LoopInInheritence.instance()); | ||
53 | querySpecifications.add(Opposite.instance()); | ||
54 | querySpecifications.add(OppositeDifferentClass.instance()); | ||
55 | querySpecifications.add(NonSymmetricOpposite.instance()); | ||
56 | } | ||
57 | |||
58 | public DirectSupertype getDirectSupertype() { | ||
59 | return DirectSupertype.instance(); | ||
60 | } | ||
61 | |||
62 | public DirectSupertype.Matcher getDirectSupertype(final ViatraQueryEngine engine) { | ||
63 | return DirectSupertype.Matcher.on(engine); | ||
64 | } | ||
65 | |||
66 | public LoopInInheritence getLoopInInheritence() { | ||
67 | return LoopInInheritence.instance(); | ||
68 | } | ||
69 | |||
70 | public LoopInInheritence.Matcher getLoopInInheritence(final ViatraQueryEngine engine) { | ||
71 | return LoopInInheritence.Matcher.on(engine); | ||
72 | } | ||
73 | |||
74 | public Opposite getOpposite() { | ||
75 | return Opposite.instance(); | ||
76 | } | ||
77 | |||
78 | public Opposite.Matcher getOpposite(final ViatraQueryEngine engine) { | ||
79 | return Opposite.Matcher.on(engine); | ||
80 | } | ||
81 | |||
82 | public OppositeDifferentClass getOppositeDifferentClass() { | ||
83 | return OppositeDifferentClass.instance(); | ||
84 | } | ||
85 | |||
86 | public OppositeDifferentClass.Matcher getOppositeDifferentClass(final ViatraQueryEngine engine) { | ||
87 | return OppositeDifferentClass.Matcher.on(engine); | ||
88 | } | ||
89 | |||
90 | public NonSymmetricOpposite getNonSymmetricOpposite() { | ||
91 | return NonSymmetricOpposite.instance(); | ||
92 | } | ||
93 | |||
94 | public NonSymmetricOpposite.Matcher getNonSymmetricOpposite(final ViatraQueryEngine engine) { | ||
95 | return NonSymmetricOpposite.Matcher.on(engine); | ||
96 | } | ||
97 | } | ||
diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore_pattern.java index e2627646..6da94486 100644 --- a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src-gen/queries/Ecore_pattern.java +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Ecore_pattern.java | |||
@@ -1,11 +1,11 @@ | |||
1 | /** | 1 | /** |
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/queries/ecore_pattern.vql | 2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/ecore_pattern.vql |
3 | */ | 3 | */ |
4 | package queries; | 4 | package ecore; |
5 | 5 | ||
6 | import ecore.MoreThenFiveSuperTypes; | ||
6 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | 7 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; |
7 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; | 8 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedPatternGroup; |
8 | import queries.SameSuperClass; | ||
9 | 9 | ||
10 | /** | 10 | /** |
11 | * A pattern group formed of all public patterns defined in ecore_pattern.vql. | 11 | * A pattern group formed of all public patterns defined in ecore_pattern.vql. |
@@ -14,8 +14,8 @@ import queries.SameSuperClass; | |||
14 | * a VIATRA Query engine for matching all patterns originally defined in file ecore_pattern.vql, | 14 | * a VIATRA Query engine for matching all patterns originally defined in file ecore_pattern.vql, |
15 | * in order to achieve better performance than one-by-one on-demand matcher initialization. | 15 | * in order to achieve better performance than one-by-one on-demand matcher initialization. |
16 | * | 16 | * |
17 | * <p> From package queries, the group contains the definition of the following patterns: <ul> | 17 | * <p> From package ecore, the group contains the definition of the following patterns: <ul> |
18 | * <li>sameSuperClass</li> | 18 | * <li>moreThenFiveSuperTypes</li> |
19 | * </ul> | 19 | * </ul> |
20 | * | 20 | * |
21 | * @see IQueryGroup | 21 | * @see IQueryGroup |
@@ -40,14 +40,14 @@ public final class Ecore_pattern extends BaseGeneratedPatternGroup { | |||
40 | private static Ecore_pattern INSTANCE; | 40 | private static Ecore_pattern INSTANCE; |
41 | 41 | ||
42 | private Ecore_pattern() { | 42 | private Ecore_pattern() { |
43 | querySpecifications.add(SameSuperClass.instance()); | 43 | querySpecifications.add(MoreThenFiveSuperTypes.instance()); |
44 | } | 44 | } |
45 | 45 | ||
46 | public SameSuperClass getSameSuperClass() { | 46 | public MoreThenFiveSuperTypes getMoreThenFiveSuperTypes() { |
47 | return SameSuperClass.instance(); | 47 | return MoreThenFiveSuperTypes.instance(); |
48 | } | 48 | } |
49 | 49 | ||
50 | public SameSuperClass.Matcher getSameSuperClass(final ViatraQueryEngine engine) { | 50 | public MoreThenFiveSuperTypes.Matcher getMoreThenFiveSuperTypes(final ViatraQueryEngine engine) { |
51 | return SameSuperClass.Matcher.on(engine); | 51 | return MoreThenFiveSuperTypes.Matcher.on(engine); |
52 | } | 52 | } |
53 | } | 53 | } |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java new file mode 100644 index 00000000..fb14941f --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/LoopInInheritence.java | |||
@@ -0,0 +1,548 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import ecore.DirectSupertype; | ||
7 | import java.util.Arrays; | ||
8 | import java.util.Collection; | ||
9 | import java.util.LinkedHashSet; | ||
10 | import java.util.List; | ||
11 | import java.util.Objects; | ||
12 | import java.util.Optional; | ||
13 | import java.util.Set; | ||
14 | import java.util.function.Consumer; | ||
15 | import java.util.stream.Collectors; | ||
16 | import java.util.stream.Stream; | ||
17 | import org.apache.log4j.Logger; | ||
18 | import org.eclipse.emf.ecore.EClass; | ||
19 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
20 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
21 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
25 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.BinaryTransitiveClosure; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
40 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
41 | |||
42 | /** | ||
43 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
44 | * | ||
45 | * <p>Original source: | ||
46 | * <code><pre> | ||
47 | * {@literal @}Constraint(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") | ||
58 | public final class LoopInInheritence extends BaseGeneratedEMFQuerySpecification<LoopInInheritence.Matcher> { | ||
59 | /** | ||
60 | * Pattern-specific match representation of the ecore.loopInInheritence pattern, | ||
61 | * to be used in conjunction with {@link Matcher}. | ||
62 | * | ||
63 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
64 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
65 | * usable to represent a match of the pattern in the result of a query, | ||
66 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
67 | * | ||
68 | * @see Matcher | ||
69 | * | ||
70 | */ | ||
71 | public static abstract class Match extends BasePatternMatch { | ||
72 | private EClass fA; | ||
73 | |||
74 | private static List<String> parameterNames = makeImmutableList("a"); | ||
75 | |||
76 | private Match(final EClass pA) { | ||
77 | this.fA = pA; | ||
78 | } | ||
79 | |||
80 | @Override | ||
81 | public Object get(final String parameterName) { | ||
82 | if ("a".equals(parameterName)) return this.fA; | ||
83 | return null; | ||
84 | } | ||
85 | |||
86 | public EClass getA() { | ||
87 | return this.fA; | ||
88 | } | ||
89 | |||
90 | @Override | ||
91 | public boolean set(final String parameterName, final Object newValue) { | ||
92 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
93 | if ("a".equals(parameterName) ) { | ||
94 | this.fA = (EClass) newValue; | ||
95 | return true; | ||
96 | } | ||
97 | return false; | ||
98 | } | ||
99 | |||
100 | public void setA(final EClass pA) { | ||
101 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
102 | this.fA = pA; | ||
103 | } | ||
104 | |||
105 | @Override | ||
106 | public String patternName() { | ||
107 | return "ecore.loopInInheritence"; | ||
108 | } | ||
109 | |||
110 | @Override | ||
111 | public List<String> parameterNames() { | ||
112 | return LoopInInheritence.Match.parameterNames; | ||
113 | } | ||
114 | |||
115 | @Override | ||
116 | public Object[] toArray() { | ||
117 | return new Object[]{fA}; | ||
118 | } | ||
119 | |||
120 | @Override | ||
121 | public LoopInInheritence.Match toImmutable() { | ||
122 | return isMutable() ? newMatch(fA) : this; | ||
123 | } | ||
124 | |||
125 | @Override | ||
126 | public String prettyPrint() { | ||
127 | StringBuilder result = new StringBuilder(); | ||
128 | result.append("\"a\"=" + prettyPrintValue(fA)); | ||
129 | return result.toString(); | ||
130 | } | ||
131 | |||
132 | @Override | ||
133 | public int hashCode() { | ||
134 | return Objects.hash(fA); | ||
135 | } | ||
136 | |||
137 | @Override | ||
138 | public boolean equals(final Object obj) { | ||
139 | if (this == obj) | ||
140 | return true; | ||
141 | if (obj == null) { | ||
142 | return false; | ||
143 | } | ||
144 | if ((obj instanceof LoopInInheritence.Match)) { | ||
145 | LoopInInheritence.Match other = (LoopInInheritence.Match) obj; | ||
146 | return Objects.equals(fA, other.fA); | ||
147 | } else { | ||
148 | // this should be infrequent | ||
149 | if (!(obj instanceof IPatternMatch)) { | ||
150 | return false; | ||
151 | } | ||
152 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
153 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
154 | } | ||
155 | } | ||
156 | |||
157 | @Override | ||
158 | public LoopInInheritence specification() { | ||
159 | return LoopInInheritence.instance(); | ||
160 | } | ||
161 | |||
162 | /** | ||
163 | * Returns an empty, mutable match. | ||
164 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
165 | * | ||
166 | * @return the empty match. | ||
167 | * | ||
168 | */ | ||
169 | public static LoopInInheritence.Match newEmptyMatch() { | ||
170 | return new Mutable(null); | ||
171 | } | ||
172 | |||
173 | /** | ||
174 | * Returns a mutable (partial) match. | ||
175 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
176 | * | ||
177 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
178 | * @return the new, mutable (partial) match object. | ||
179 | * | ||
180 | */ | ||
181 | public static LoopInInheritence.Match newMutableMatch(final EClass pA) { | ||
182 | return new Mutable(pA); | ||
183 | } | ||
184 | |||
185 | /** | ||
186 | * Returns a new (partial) match. | ||
187 | * This can be used e.g. to call the matcher with a partial match. | ||
188 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
189 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
190 | * @return the (partial) match object. | ||
191 | * | ||
192 | */ | ||
193 | public static LoopInInheritence.Match newMatch(final EClass pA) { | ||
194 | return new Immutable(pA); | ||
195 | } | ||
196 | |||
197 | private static final class Mutable extends LoopInInheritence.Match { | ||
198 | Mutable(final EClass pA) { | ||
199 | super(pA); | ||
200 | } | ||
201 | |||
202 | @Override | ||
203 | public boolean isMutable() { | ||
204 | return true; | ||
205 | } | ||
206 | } | ||
207 | |||
208 | private static final class Immutable extends LoopInInheritence.Match { | ||
209 | Immutable(final EClass pA) { | ||
210 | super(pA); | ||
211 | } | ||
212 | |||
213 | @Override | ||
214 | public boolean isMutable() { | ||
215 | return false; | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | |||
220 | /** | ||
221 | * Generated pattern matcher API of the ecore.loopInInheritence pattern, | ||
222 | * providing pattern-specific query methods. | ||
223 | * | ||
224 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
225 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
226 | * | ||
227 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
228 | * | ||
229 | * <p>Original source: | ||
230 | * <code><pre> | ||
231 | * {@literal @}Constraint(key={a}, severity="error", message="error") | ||
232 | * pattern loopInInheritence(a: EClass) { | ||
233 | * find directSupertype+(a,a); | ||
234 | * } | ||
235 | * </pre></code> | ||
236 | * | ||
237 | * @see Match | ||
238 | * @see LoopInInheritence | ||
239 | * | ||
240 | */ | ||
241 | public static class Matcher extends BaseMatcher<LoopInInheritence.Match> { | ||
242 | /** | ||
243 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
244 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
245 | * | ||
246 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
247 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
248 | * | ||
249 | */ | ||
250 | public static LoopInInheritence.Matcher on(final ViatraQueryEngine engine) { | ||
251 | // check if matcher already exists | ||
252 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
253 | if (matcher == null) { | ||
254 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
255 | } | ||
256 | return matcher; | ||
257 | } | ||
258 | |||
259 | /** | ||
260 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
261 | * @return an initialized matcher | ||
262 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
263 | * | ||
264 | */ | ||
265 | public static LoopInInheritence.Matcher create() { | ||
266 | return new Matcher(); | ||
267 | } | ||
268 | |||
269 | private static final int POSITION_A = 0; | ||
270 | |||
271 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(LoopInInheritence.Matcher.class); | ||
272 | |||
273 | /** | ||
274 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
275 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
276 | * | ||
277 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
278 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
279 | * | ||
280 | */ | ||
281 | private Matcher() { | ||
282 | super(querySpecification()); | ||
283 | } | ||
284 | |||
285 | /** | ||
286 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
287 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
288 | * @return matches represented as a Match object. | ||
289 | * | ||
290 | */ | ||
291 | public Collection<LoopInInheritence.Match> getAllMatches(final EClass pA) { | ||
292 | return rawStreamAllMatches(new Object[]{pA}).collect(Collectors.toSet()); | ||
293 | } | ||
294 | |||
295 | /** | ||
296 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
297 | * </p> | ||
298 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
299 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
300 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
301 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
302 | * @return a stream of matches represented as a Match object. | ||
303 | * | ||
304 | */ | ||
305 | public Stream<LoopInInheritence.Match> streamAllMatches(final EClass pA) { | ||
306 | return rawStreamAllMatches(new Object[]{pA}); | ||
307 | } | ||
308 | |||
309 | /** | ||
310 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
311 | * Neither determinism nor randomness of selection is guaranteed. | ||
312 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
313 | * @return a match represented as a Match object, or null if no match is found. | ||
314 | * | ||
315 | */ | ||
316 | public Optional<LoopInInheritence.Match> getOneArbitraryMatch(final EClass pA) { | ||
317 | return rawGetOneArbitraryMatch(new Object[]{pA}); | ||
318 | } | ||
319 | |||
320 | /** | ||
321 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
322 | * under any possible substitution of the unspecified parameters (if any). | ||
323 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
324 | * @return true if the input is a valid (partial) match of the pattern. | ||
325 | * | ||
326 | */ | ||
327 | public boolean hasMatch(final EClass pA) { | ||
328 | return rawHasMatch(new Object[]{pA}); | ||
329 | } | ||
330 | |||
331 | /** | ||
332 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
333 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
334 | * @return the number of pattern matches found. | ||
335 | * | ||
336 | */ | ||
337 | public int countMatches(final EClass pA) { | ||
338 | return rawCountMatches(new Object[]{pA}); | ||
339 | } | ||
340 | |||
341 | /** | ||
342 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
343 | * Neither determinism nor randomness of selection is guaranteed. | ||
344 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
345 | * @param processor the action that will process the selected match. | ||
346 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
347 | * | ||
348 | */ | ||
349 | public boolean forOneArbitraryMatch(final EClass pA, final Consumer<? super LoopInInheritence.Match> processor) { | ||
350 | return rawForOneArbitraryMatch(new Object[]{pA}, processor); | ||
351 | } | ||
352 | |||
353 | /** | ||
354 | * Returns a new (partial) match. | ||
355 | * This can be used e.g. to call the matcher with a partial match. | ||
356 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
357 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
358 | * @return the (partial) match object. | ||
359 | * | ||
360 | */ | ||
361 | public LoopInInheritence.Match newMatch(final EClass pA) { | ||
362 | return LoopInInheritence.Match.newMatch(pA); | ||
363 | } | ||
364 | |||
365 | /** | ||
366 | * Retrieve the set of values that occur in matches for a. | ||
367 | * @return the Set of all values or empty set if there are no matches | ||
368 | * | ||
369 | */ | ||
370 | protected Stream<EClass> rawStreamAllValuesOfa(final Object[] parameters) { | ||
371 | return rawStreamAllValues(POSITION_A, parameters).map(EClass.class::cast); | ||
372 | } | ||
373 | |||
374 | /** | ||
375 | * Retrieve the set of values that occur in matches for a. | ||
376 | * @return the Set of all values or empty set if there are no matches | ||
377 | * | ||
378 | */ | ||
379 | public Set<EClass> getAllValuesOfa() { | ||
380 | return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet()); | ||
381 | } | ||
382 | |||
383 | /** | ||
384 | * Retrieve the set of values that occur in matches for a. | ||
385 | * @return the Set of all values or empty set if there are no matches | ||
386 | * | ||
387 | */ | ||
388 | public Stream<EClass> streamAllValuesOfa() { | ||
389 | return rawStreamAllValuesOfa(emptyArray()); | ||
390 | } | ||
391 | |||
392 | @Override | ||
393 | protected LoopInInheritence.Match tupleToMatch(final Tuple t) { | ||
394 | try { | ||
395 | return LoopInInheritence.Match.newMatch((EClass) t.get(POSITION_A)); | ||
396 | } catch(ClassCastException e) { | ||
397 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
398 | return null; | ||
399 | } | ||
400 | } | ||
401 | |||
402 | @Override | ||
403 | protected LoopInInheritence.Match arrayToMatch(final Object[] match) { | ||
404 | try { | ||
405 | return LoopInInheritence.Match.newMatch((EClass) match[POSITION_A]); | ||
406 | } catch(ClassCastException e) { | ||
407 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
408 | return null; | ||
409 | } | ||
410 | } | ||
411 | |||
412 | @Override | ||
413 | protected LoopInInheritence.Match arrayToMatchMutable(final Object[] match) { | ||
414 | try { | ||
415 | return LoopInInheritence.Match.newMutableMatch((EClass) match[POSITION_A]); | ||
416 | } catch(ClassCastException e) { | ||
417 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
418 | return null; | ||
419 | } | ||
420 | } | ||
421 | |||
422 | /** | ||
423 | * @return the singleton instance of the query specification of this pattern | ||
424 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
425 | * | ||
426 | */ | ||
427 | public static IQuerySpecification<LoopInInheritence.Matcher> querySpecification() { | ||
428 | return LoopInInheritence.instance(); | ||
429 | } | ||
430 | } | ||
431 | |||
432 | private LoopInInheritence() { | ||
433 | super(GeneratedPQuery.INSTANCE); | ||
434 | } | ||
435 | |||
436 | /** | ||
437 | * @return the singleton instance of the query specification | ||
438 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
439 | * | ||
440 | */ | ||
441 | public static LoopInInheritence instance() { | ||
442 | try{ | ||
443 | return LazyHolder.INSTANCE; | ||
444 | } catch (ExceptionInInitializerError err) { | ||
445 | throw processInitializerError(err); | ||
446 | } | ||
447 | } | ||
448 | |||
449 | @Override | ||
450 | protected LoopInInheritence.Matcher instantiate(final ViatraQueryEngine engine) { | ||
451 | return LoopInInheritence.Matcher.on(engine); | ||
452 | } | ||
453 | |||
454 | @Override | ||
455 | public LoopInInheritence.Matcher instantiate() { | ||
456 | return LoopInInheritence.Matcher.create(); | ||
457 | } | ||
458 | |||
459 | @Override | ||
460 | public LoopInInheritence.Match newEmptyMatch() { | ||
461 | return LoopInInheritence.Match.newEmptyMatch(); | ||
462 | } | ||
463 | |||
464 | @Override | ||
465 | public LoopInInheritence.Match newMatch(final Object... parameters) { | ||
466 | return LoopInInheritence.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0]); | ||
467 | } | ||
468 | |||
469 | /** | ||
470 | * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.LoopInInheritence (visibility: PUBLIC, simpleName: LoopInInheritence, identifier: ecore.LoopInInheritence, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
471 | * <b>not</b> at the class load time of the outer class, | ||
472 | * but rather at the first call to {@link JvmGenericType: ecore.LoopInInheritence (visibility: PUBLIC, simpleName: LoopInInheritence, identifier: ecore.LoopInInheritence, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
473 | * | ||
474 | * <p> This workaround is required e.g. to support recursion. | ||
475 | * | ||
476 | */ | ||
477 | private static class LazyHolder { | ||
478 | private static final LoopInInheritence INSTANCE = new LoopInInheritence(); | ||
479 | |||
480 | /** | ||
481 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
482 | * This initialization order is required to support indirect recursion. | ||
483 | * | ||
484 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
485 | * | ||
486 | */ | ||
487 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
488 | |||
489 | public static Object ensureInitialized() { | ||
490 | INSTANCE.ensureInitializedInternal(); | ||
491 | return null; | ||
492 | } | ||
493 | } | ||
494 | |||
495 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
496 | private static final LoopInInheritence.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
497 | |||
498 | private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
499 | |||
500 | private final List<PParameter> parameters = Arrays.asList(parameter_a); | ||
501 | |||
502 | private GeneratedPQuery() { | ||
503 | super(PVisibility.PUBLIC); | ||
504 | } | ||
505 | |||
506 | @Override | ||
507 | public String getFullyQualifiedName() { | ||
508 | return "ecore.loopInInheritence"; | ||
509 | } | ||
510 | |||
511 | @Override | ||
512 | public List<String> getParameterNames() { | ||
513 | return Arrays.asList("a"); | ||
514 | } | ||
515 | |||
516 | @Override | ||
517 | public List<PParameter> getParameters() { | ||
518 | return parameters; | ||
519 | } | ||
520 | |||
521 | @Override | ||
522 | public Set<PBody> doGetContainedBodies() { | ||
523 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
524 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
525 | { | ||
526 | PBody body = new PBody(this); | ||
527 | PVariable var_a = body.getOrCreateVariableByName("a"); | ||
528 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
529 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
530 | new ExportedParameter(body, var_a, parameter_a) | ||
531 | )); | ||
532 | // find directSupertype+(a,a) | ||
533 | new BinaryTransitiveClosure(body, Tuples.flatTupleOf(var_a, var_a), DirectSupertype.instance().getInternalQueryRepresentation()); | ||
534 | bodies.add(body); | ||
535 | } | ||
536 | { | ||
537 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
538 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
539 | new ParameterReference("a") | ||
540 | })); | ||
541 | annotation.addAttribute("severity", "error"); | ||
542 | annotation.addAttribute("message", "error"); | ||
543 | addAnnotation(annotation); | ||
544 | } | ||
545 | return bodies; | ||
546 | } | ||
547 | } | ||
548 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java new file mode 100644 index 00000000..da64d899 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/MoreThenFiveSuperTypes.java | |||
@@ -0,0 +1,621 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/ecore_pattern.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.Collections; | ||
9 | import java.util.LinkedHashSet; | ||
10 | import java.util.List; | ||
11 | import java.util.Objects; | ||
12 | import java.util.Optional; | ||
13 | import java.util.Set; | ||
14 | import java.util.function.Consumer; | ||
15 | import java.util.stream.Collectors; | ||
16 | import java.util.stream.Stream; | ||
17 | import org.apache.log4j.Logger; | ||
18 | import org.eclipse.emf.ecore.EClass; | ||
19 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
20 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
21 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
25 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.IExpressionEvaluator; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.IValueProvider; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExpressionEvaluation; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.PatternMatchCounter; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
40 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
41 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
42 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
43 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
44 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
45 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
46 | |||
47 | /** | ||
48 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
49 | * | ||
50 | * <p>Original source: | ||
51 | * <code><pre> | ||
52 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
53 | * pattern moreThenFiveSuperTypes(c: EClass){ | ||
54 | * m == count EClass.eSuperTypes(c,_); | ||
55 | * check(m {@literal >}= 5); | ||
56 | * } | ||
57 | * </pre></code> | ||
58 | * | ||
59 | * @see Matcher | ||
60 | * @see Match | ||
61 | * | ||
62 | */ | ||
63 | @SuppressWarnings("all") | ||
64 | public final class MoreThenFiveSuperTypes extends BaseGeneratedEMFQuerySpecification<MoreThenFiveSuperTypes.Matcher> { | ||
65 | /** | ||
66 | * Pattern-specific match representation of the ecore.moreThenFiveSuperTypes pattern, | ||
67 | * to be used in conjunction with {@link Matcher}. | ||
68 | * | ||
69 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
70 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
71 | * usable to represent a match of the pattern in the result of a query, | ||
72 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
73 | * | ||
74 | * @see Matcher | ||
75 | * | ||
76 | */ | ||
77 | public static abstract class Match extends BasePatternMatch { | ||
78 | private EClass fC; | ||
79 | |||
80 | private static List<String> parameterNames = makeImmutableList("c"); | ||
81 | |||
82 | private Match(final EClass pC) { | ||
83 | this.fC = pC; | ||
84 | } | ||
85 | |||
86 | @Override | ||
87 | public Object get(final String parameterName) { | ||
88 | if ("c".equals(parameterName)) return this.fC; | ||
89 | return null; | ||
90 | } | ||
91 | |||
92 | public EClass getC() { | ||
93 | return this.fC; | ||
94 | } | ||
95 | |||
96 | @Override | ||
97 | public boolean set(final String parameterName, final Object newValue) { | ||
98 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
99 | if ("c".equals(parameterName) ) { | ||
100 | this.fC = (EClass) newValue; | ||
101 | return true; | ||
102 | } | ||
103 | return false; | ||
104 | } | ||
105 | |||
106 | public void setC(final EClass pC) { | ||
107 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
108 | this.fC = pC; | ||
109 | } | ||
110 | |||
111 | @Override | ||
112 | public String patternName() { | ||
113 | return "ecore.moreThenFiveSuperTypes"; | ||
114 | } | ||
115 | |||
116 | @Override | ||
117 | public List<String> parameterNames() { | ||
118 | return MoreThenFiveSuperTypes.Match.parameterNames; | ||
119 | } | ||
120 | |||
121 | @Override | ||
122 | public Object[] toArray() { | ||
123 | return new Object[]{fC}; | ||
124 | } | ||
125 | |||
126 | @Override | ||
127 | public MoreThenFiveSuperTypes.Match toImmutable() { | ||
128 | return isMutable() ? newMatch(fC) : this; | ||
129 | } | ||
130 | |||
131 | @Override | ||
132 | public String prettyPrint() { | ||
133 | StringBuilder result = new StringBuilder(); | ||
134 | result.append("\"c\"=" + prettyPrintValue(fC)); | ||
135 | return result.toString(); | ||
136 | } | ||
137 | |||
138 | @Override | ||
139 | public int hashCode() { | ||
140 | return Objects.hash(fC); | ||
141 | } | ||
142 | |||
143 | @Override | ||
144 | public boolean equals(final Object obj) { | ||
145 | if (this == obj) | ||
146 | return true; | ||
147 | if (obj == null) { | ||
148 | return false; | ||
149 | } | ||
150 | if ((obj instanceof MoreThenFiveSuperTypes.Match)) { | ||
151 | MoreThenFiveSuperTypes.Match other = (MoreThenFiveSuperTypes.Match) obj; | ||
152 | return Objects.equals(fC, other.fC); | ||
153 | } else { | ||
154 | // this should be infrequent | ||
155 | if (!(obj instanceof IPatternMatch)) { | ||
156 | return false; | ||
157 | } | ||
158 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
159 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | @Override | ||
164 | public MoreThenFiveSuperTypes specification() { | ||
165 | return MoreThenFiveSuperTypes.instance(); | ||
166 | } | ||
167 | |||
168 | /** | ||
169 | * Returns an empty, mutable match. | ||
170 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
171 | * | ||
172 | * @return the empty match. | ||
173 | * | ||
174 | */ | ||
175 | public static MoreThenFiveSuperTypes.Match newEmptyMatch() { | ||
176 | return new Mutable(null); | ||
177 | } | ||
178 | |||
179 | /** | ||
180 | * Returns a mutable (partial) match. | ||
181 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
182 | * | ||
183 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
184 | * @return the new, mutable (partial) match object. | ||
185 | * | ||
186 | */ | ||
187 | public static MoreThenFiveSuperTypes.Match newMutableMatch(final EClass pC) { | ||
188 | return new Mutable(pC); | ||
189 | } | ||
190 | |||
191 | /** | ||
192 | * Returns a new (partial) match. | ||
193 | * This can be used e.g. to call the matcher with a partial match. | ||
194 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
195 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
196 | * @return the (partial) match object. | ||
197 | * | ||
198 | */ | ||
199 | public static MoreThenFiveSuperTypes.Match newMatch(final EClass pC) { | ||
200 | return new Immutable(pC); | ||
201 | } | ||
202 | |||
203 | private static final class Mutable extends MoreThenFiveSuperTypes.Match { | ||
204 | Mutable(final EClass pC) { | ||
205 | super(pC); | ||
206 | } | ||
207 | |||
208 | @Override | ||
209 | public boolean isMutable() { | ||
210 | return true; | ||
211 | } | ||
212 | } | ||
213 | |||
214 | private static final class Immutable extends MoreThenFiveSuperTypes.Match { | ||
215 | Immutable(final EClass pC) { | ||
216 | super(pC); | ||
217 | } | ||
218 | |||
219 | @Override | ||
220 | public boolean isMutable() { | ||
221 | return false; | ||
222 | } | ||
223 | } | ||
224 | } | ||
225 | |||
226 | /** | ||
227 | * Generated pattern matcher API of the ecore.moreThenFiveSuperTypes pattern, | ||
228 | * providing pattern-specific query methods. | ||
229 | * | ||
230 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
231 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
232 | * | ||
233 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
234 | * | ||
235 | * <p>Original source: | ||
236 | * <code><pre> | ||
237 | * {@literal @}Constraint(severity="error", message="error", key = {c}) | ||
238 | * pattern moreThenFiveSuperTypes(c: EClass){ | ||
239 | * m == count EClass.eSuperTypes(c,_); | ||
240 | * check(m {@literal >}= 5); | ||
241 | * } | ||
242 | * </pre></code> | ||
243 | * | ||
244 | * @see Match | ||
245 | * @see MoreThenFiveSuperTypes | ||
246 | * | ||
247 | */ | ||
248 | public static class Matcher extends BaseMatcher<MoreThenFiveSuperTypes.Match> { | ||
249 | /** | ||
250 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
251 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
252 | * | ||
253 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
254 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
255 | * | ||
256 | */ | ||
257 | public static MoreThenFiveSuperTypes.Matcher on(final ViatraQueryEngine engine) { | ||
258 | // check if matcher already exists | ||
259 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
260 | if (matcher == null) { | ||
261 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
262 | } | ||
263 | return matcher; | ||
264 | } | ||
265 | |||
266 | /** | ||
267 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
268 | * @return an initialized matcher | ||
269 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
270 | * | ||
271 | */ | ||
272 | public static MoreThenFiveSuperTypes.Matcher create() { | ||
273 | return new Matcher(); | ||
274 | } | ||
275 | |||
276 | private static final int POSITION_C = 0; | ||
277 | |||
278 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(MoreThenFiveSuperTypes.Matcher.class); | ||
279 | |||
280 | /** | ||
281 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
282 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
283 | * | ||
284 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
285 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
286 | * | ||
287 | */ | ||
288 | private Matcher() { | ||
289 | super(querySpecification()); | ||
290 | } | ||
291 | |||
292 | /** | ||
293 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
294 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
295 | * @return matches represented as a Match object. | ||
296 | * | ||
297 | */ | ||
298 | public Collection<MoreThenFiveSuperTypes.Match> getAllMatches(final EClass pC) { | ||
299 | return rawStreamAllMatches(new Object[]{pC}).collect(Collectors.toSet()); | ||
300 | } | ||
301 | |||
302 | /** | ||
303 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
304 | * </p> | ||
305 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
306 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
307 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
308 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
309 | * @return a stream of matches represented as a Match object. | ||
310 | * | ||
311 | */ | ||
312 | public Stream<MoreThenFiveSuperTypes.Match> streamAllMatches(final EClass pC) { | ||
313 | return rawStreamAllMatches(new Object[]{pC}); | ||
314 | } | ||
315 | |||
316 | /** | ||
317 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
318 | * Neither determinism nor randomness of selection is guaranteed. | ||
319 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
320 | * @return a match represented as a Match object, or null if no match is found. | ||
321 | * | ||
322 | */ | ||
323 | public Optional<MoreThenFiveSuperTypes.Match> getOneArbitraryMatch(final EClass pC) { | ||
324 | return rawGetOneArbitraryMatch(new Object[]{pC}); | ||
325 | } | ||
326 | |||
327 | /** | ||
328 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
329 | * under any possible substitution of the unspecified parameters (if any). | ||
330 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
331 | * @return true if the input is a valid (partial) match of the pattern. | ||
332 | * | ||
333 | */ | ||
334 | public boolean hasMatch(final EClass pC) { | ||
335 | return rawHasMatch(new Object[]{pC}); | ||
336 | } | ||
337 | |||
338 | /** | ||
339 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
340 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
341 | * @return the number of pattern matches found. | ||
342 | * | ||
343 | */ | ||
344 | public int countMatches(final EClass pC) { | ||
345 | return rawCountMatches(new Object[]{pC}); | ||
346 | } | ||
347 | |||
348 | /** | ||
349 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
350 | * Neither determinism nor randomness of selection is guaranteed. | ||
351 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
352 | * @param processor the action that will process the selected match. | ||
353 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
354 | * | ||
355 | */ | ||
356 | public boolean forOneArbitraryMatch(final EClass pC, final Consumer<? super MoreThenFiveSuperTypes.Match> processor) { | ||
357 | return rawForOneArbitraryMatch(new Object[]{pC}, processor); | ||
358 | } | ||
359 | |||
360 | /** | ||
361 | * Returns a new (partial) match. | ||
362 | * This can be used e.g. to call the matcher with a partial match. | ||
363 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
364 | * @param pC the fixed value of pattern parameter c, or null if not bound. | ||
365 | * @return the (partial) match object. | ||
366 | * | ||
367 | */ | ||
368 | public MoreThenFiveSuperTypes.Match newMatch(final EClass pC) { | ||
369 | return MoreThenFiveSuperTypes.Match.newMatch(pC); | ||
370 | } | ||
371 | |||
372 | /** | ||
373 | * Retrieve the set of values that occur in matches for c. | ||
374 | * @return the Set of all values or empty set if there are no matches | ||
375 | * | ||
376 | */ | ||
377 | protected Stream<EClass> rawStreamAllValuesOfc(final Object[] parameters) { | ||
378 | return rawStreamAllValues(POSITION_C, parameters).map(EClass.class::cast); | ||
379 | } | ||
380 | |||
381 | /** | ||
382 | * Retrieve the set of values that occur in matches for c. | ||
383 | * @return the Set of all values or empty set if there are no matches | ||
384 | * | ||
385 | */ | ||
386 | public Set<EClass> getAllValuesOfc() { | ||
387 | return rawStreamAllValuesOfc(emptyArray()).collect(Collectors.toSet()); | ||
388 | } | ||
389 | |||
390 | /** | ||
391 | * Retrieve the set of values that occur in matches for c. | ||
392 | * @return the Set of all values or empty set if there are no matches | ||
393 | * | ||
394 | */ | ||
395 | public Stream<EClass> streamAllValuesOfc() { | ||
396 | return rawStreamAllValuesOfc(emptyArray()); | ||
397 | } | ||
398 | |||
399 | @Override | ||
400 | protected MoreThenFiveSuperTypes.Match tupleToMatch(final Tuple t) { | ||
401 | try { | ||
402 | return MoreThenFiveSuperTypes.Match.newMatch((EClass) t.get(POSITION_C)); | ||
403 | } catch(ClassCastException e) { | ||
404 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
405 | return null; | ||
406 | } | ||
407 | } | ||
408 | |||
409 | @Override | ||
410 | protected MoreThenFiveSuperTypes.Match arrayToMatch(final Object[] match) { | ||
411 | try { | ||
412 | return MoreThenFiveSuperTypes.Match.newMatch((EClass) match[POSITION_C]); | ||
413 | } catch(ClassCastException e) { | ||
414 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
415 | return null; | ||
416 | } | ||
417 | } | ||
418 | |||
419 | @Override | ||
420 | protected MoreThenFiveSuperTypes.Match arrayToMatchMutable(final Object[] match) { | ||
421 | try { | ||
422 | return MoreThenFiveSuperTypes.Match.newMutableMatch((EClass) match[POSITION_C]); | ||
423 | } catch(ClassCastException e) { | ||
424 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
425 | return null; | ||
426 | } | ||
427 | } | ||
428 | |||
429 | /** | ||
430 | * @return the singleton instance of the query specification of this pattern | ||
431 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
432 | * | ||
433 | */ | ||
434 | public static IQuerySpecification<MoreThenFiveSuperTypes.Matcher> querySpecification() { | ||
435 | return MoreThenFiveSuperTypes.instance(); | ||
436 | } | ||
437 | } | ||
438 | |||
439 | private MoreThenFiveSuperTypes() { | ||
440 | super(GeneratedPQuery.INSTANCE); | ||
441 | } | ||
442 | |||
443 | /** | ||
444 | * @return the singleton instance of the query specification | ||
445 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
446 | * | ||
447 | */ | ||
448 | public static MoreThenFiveSuperTypes instance() { | ||
449 | try{ | ||
450 | return LazyHolder.INSTANCE; | ||
451 | } catch (ExceptionInInitializerError err) { | ||
452 | throw processInitializerError(err); | ||
453 | } | ||
454 | } | ||
455 | |||
456 | @Override | ||
457 | protected MoreThenFiveSuperTypes.Matcher instantiate(final ViatraQueryEngine engine) { | ||
458 | return MoreThenFiveSuperTypes.Matcher.on(engine); | ||
459 | } | ||
460 | |||
461 | @Override | ||
462 | public MoreThenFiveSuperTypes.Matcher instantiate() { | ||
463 | return MoreThenFiveSuperTypes.Matcher.create(); | ||
464 | } | ||
465 | |||
466 | @Override | ||
467 | public MoreThenFiveSuperTypes.Match newEmptyMatch() { | ||
468 | return MoreThenFiveSuperTypes.Match.newEmptyMatch(); | ||
469 | } | ||
470 | |||
471 | @Override | ||
472 | public MoreThenFiveSuperTypes.Match newMatch(final Object... parameters) { | ||
473 | return MoreThenFiveSuperTypes.Match.newMatch((org.eclipse.emf.ecore.EClass) parameters[0]); | ||
474 | } | ||
475 | |||
476 | /** | ||
477 | * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: ecore.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
478 | * <b>not</b> at the class load time of the outer class, | ||
479 | * but rather at the first call to {@link JvmGenericType: ecore.MoreThenFiveSuperTypes (visibility: PUBLIC, simpleName: MoreThenFiveSuperTypes, identifier: ecore.MoreThenFiveSuperTypes, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
480 | * | ||
481 | * <p> This workaround is required e.g. to support recursion. | ||
482 | * | ||
483 | */ | ||
484 | private static class LazyHolder { | ||
485 | private static final MoreThenFiveSuperTypes INSTANCE = new MoreThenFiveSuperTypes(); | ||
486 | |||
487 | /** | ||
488 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
489 | * This initialization order is required to support indirect recursion. | ||
490 | * | ||
491 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
492 | * | ||
493 | */ | ||
494 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
495 | |||
496 | public static Object ensureInitialized() { | ||
497 | INSTANCE.ensureInitializedInternal(); | ||
498 | return null; | ||
499 | } | ||
500 | } | ||
501 | |||
502 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
503 | private static final MoreThenFiveSuperTypes.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
504 | |||
505 | private final PParameter parameter_c = new PParameter("c", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
506 | |||
507 | private final List<PParameter> parameters = Arrays.asList(parameter_c); | ||
508 | |||
509 | private class Embedded_1_EClass_eSuperTypes extends BaseGeneratedEMFPQuery { | ||
510 | private final PParameter parameter_p0 = new PParameter("p0", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
511 | |||
512 | private final PParameter parameter_p1 = new PParameter("p1", "org.eclipse.emf.ecore.EClass", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EClass")), PParameterDirection.INOUT); | ||
513 | |||
514 | private final List<PParameter> embeddedParameters = Arrays.asList(parameter_p0, parameter_p1); | ||
515 | |||
516 | public Embedded_1_EClass_eSuperTypes() { | ||
517 | super(PVisibility.EMBEDDED); | ||
518 | } | ||
519 | |||
520 | @Override | ||
521 | public String getFullyQualifiedName() { | ||
522 | return GeneratedPQuery.this.getFullyQualifiedName() + "$Embedded_1_EClass_eSuperTypes"; | ||
523 | } | ||
524 | |||
525 | @Override | ||
526 | public List<PParameter> getParameters() { | ||
527 | return embeddedParameters; | ||
528 | } | ||
529 | |||
530 | @Override | ||
531 | public Set<PBody> doGetContainedBodies() { | ||
532 | PBody body = new PBody(this); | ||
533 | PVariable var_p0 = body.getOrCreateVariableByName("p0"); | ||
534 | PVariable var_p1 = body.getOrCreateVariableByName("p1"); | ||
535 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
536 | new ExportedParameter(body, var_p0, parameter_p0), | ||
537 | new ExportedParameter(body, var_p1, parameter_p1) | ||
538 | )); | ||
539 | // EClass.eSuperTypes(c,_) | ||
540 | new TypeConstraint(body, Tuples.flatTupleOf(var_p0), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
541 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
542 | new TypeConstraint(body, Tuples.flatTupleOf(var_p0, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass", "eSuperTypes"))); | ||
543 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
544 | new Equality(body, var__virtual_0_, var_p1); | ||
545 | return Collections.singleton(body); | ||
546 | } | ||
547 | } | ||
548 | |||
549 | private GeneratedPQuery() { | ||
550 | super(PVisibility.PUBLIC); | ||
551 | } | ||
552 | |||
553 | @Override | ||
554 | public String getFullyQualifiedName() { | ||
555 | return "ecore.moreThenFiveSuperTypes"; | ||
556 | } | ||
557 | |||
558 | @Override | ||
559 | public List<String> getParameterNames() { | ||
560 | return Arrays.asList("c"); | ||
561 | } | ||
562 | |||
563 | @Override | ||
564 | public List<PParameter> getParameters() { | ||
565 | return parameters; | ||
566 | } | ||
567 | |||
568 | @Override | ||
569 | public Set<PBody> doGetContainedBodies() { | ||
570 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
571 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
572 | { | ||
573 | PBody body = new PBody(this); | ||
574 | PVariable var_c = body.getOrCreateVariableByName("c"); | ||
575 | PVariable var_m = body.getOrCreateVariableByName("m"); | ||
576 | PVariable var___0_ = body.getOrCreateVariableByName("_<0>"); | ||
577 | new TypeConstraint(body, Tuples.flatTupleOf(var_c), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
578 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
579 | new ExportedParameter(body, var_c, parameter_c) | ||
580 | )); | ||
581 | // m == count EClass.eSuperTypes(c,_) | ||
582 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
583 | new PatternMatchCounter(body, Tuples.flatTupleOf(var_c, var___0_), new MoreThenFiveSuperTypes.GeneratedPQuery.Embedded_1_EClass_eSuperTypes(), var__virtual_0_); | ||
584 | new Equality(body, var_m, var__virtual_0_); | ||
585 | // check(m >= 5) | ||
586 | new ExpressionEvaluation(body, new IExpressionEvaluator() { | ||
587 | |||
588 | @Override | ||
589 | public String getShortDescription() { | ||
590 | return "Expression evaluation from pattern moreThenFiveSuperTypes"; | ||
591 | } | ||
592 | |||
593 | @Override | ||
594 | public Iterable<String> getInputParameterNames() { | ||
595 | return Arrays.asList("m");} | ||
596 | |||
597 | @Override | ||
598 | public Object evaluateExpression(IValueProvider provider) throws Exception { | ||
599 | Integer m = (Integer) provider.getValue("m"); | ||
600 | return evaluateExpression_1_1(m); | ||
601 | } | ||
602 | }, null); | ||
603 | bodies.add(body); | ||
604 | } | ||
605 | { | ||
606 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
607 | annotation.addAttribute("severity", "error"); | ||
608 | annotation.addAttribute("message", "error"); | ||
609 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
610 | new ParameterReference("c") | ||
611 | })); | ||
612 | addAnnotation(annotation); | ||
613 | } | ||
614 | return bodies; | ||
615 | } | ||
616 | } | ||
617 | |||
618 | private static boolean evaluateExpression_1_1(final Integer m) { | ||
619 | return ((m).intValue() >= 5); | ||
620 | } | ||
621 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java new file mode 100644 index 00000000..d230e3f4 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/NonSymmetricOpposite.java | |||
@@ -0,0 +1,707 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import ecore.Opposite; | ||
7 | import java.util.Arrays; | ||
8 | import java.util.Collection; | ||
9 | import java.util.LinkedHashSet; | ||
10 | import java.util.List; | ||
11 | import java.util.Objects; | ||
12 | import java.util.Optional; | ||
13 | import java.util.Set; | ||
14 | import java.util.function.Consumer; | ||
15 | import java.util.stream.Collectors; | ||
16 | import java.util.stream.Stream; | ||
17 | import org.apache.log4j.Logger; | ||
18 | import org.eclipse.emf.ecore.EClass; | ||
19 | import org.eclipse.emf.ecore.EReference; | ||
20 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
21 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
22 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
25 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
26 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
27 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.NegativePatternCall; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.PositivePatternCall; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
40 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
41 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
42 | import org.eclipse.viatra.query.runtime.util.ViatraQueryLoggingUtil; | ||
43 | |||
44 | /** | ||
45 | * A pattern-specific query specification that can instantiate Matcher in a type-safe way. | ||
46 | * | ||
47 | * <p>Original source: | ||
48 | * <code><pre> | ||
49 | * {@literal @}Constraint(key={a}, severity="error", message="error") | ||
50 | * pattern nonSymmetricOpposite(a:EReference, b:EReference) { | ||
51 | * find opposite(a,b); | ||
52 | * neg find opposite(b,a); | ||
53 | * } | ||
54 | * </pre></code> | ||
55 | * | ||
56 | * @see Matcher | ||
57 | * @see Match | ||
58 | * | ||
59 | */ | ||
60 | @SuppressWarnings("all") | ||
61 | public final class NonSymmetricOpposite extends BaseGeneratedEMFQuerySpecification<NonSymmetricOpposite.Matcher> { | ||
62 | /** | ||
63 | * Pattern-specific match representation of the ecore.nonSymmetricOpposite pattern, | ||
64 | * to be used in conjunction with {@link Matcher}. | ||
65 | * | ||
66 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
67 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
68 | * usable to represent a match of the pattern in the result of a query, | ||
69 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
70 | * | ||
71 | * @see Matcher | ||
72 | * | ||
73 | */ | ||
74 | public static abstract class Match extends BasePatternMatch { | ||
75 | private EReference fA; | ||
76 | |||
77 | private EReference fB; | ||
78 | |||
79 | private static List<String> parameterNames = makeImmutableList("a", "b"); | ||
80 | |||
81 | private Match(final EReference pA, final EReference pB) { | ||
82 | this.fA = pA; | ||
83 | this.fB = pB; | ||
84 | } | ||
85 | |||
86 | @Override | ||
87 | public Object get(final String parameterName) { | ||
88 | if ("a".equals(parameterName)) return this.fA; | ||
89 | if ("b".equals(parameterName)) return this.fB; | ||
90 | return null; | ||
91 | } | ||
92 | |||
93 | public EReference getA() { | ||
94 | return this.fA; | ||
95 | } | ||
96 | |||
97 | public EReference getB() { | ||
98 | return this.fB; | ||
99 | } | ||
100 | |||
101 | @Override | ||
102 | public boolean set(final String parameterName, final Object newValue) { | ||
103 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
104 | if ("a".equals(parameterName) ) { | ||
105 | this.fA = (EReference) newValue; | ||
106 | return true; | ||
107 | } | ||
108 | if ("b".equals(parameterName) ) { | ||
109 | this.fB = (EReference) newValue; | ||
110 | return true; | ||
111 | } | ||
112 | return false; | ||
113 | } | ||
114 | |||
115 | public void setA(final EReference pA) { | ||
116 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
117 | this.fA = pA; | ||
118 | } | ||
119 | |||
120 | public void setB(final EReference pB) { | ||
121 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
122 | this.fB = pB; | ||
123 | } | ||
124 | |||
125 | @Override | ||
126 | public String patternName() { | ||
127 | return "ecore.nonSymmetricOpposite"; | ||
128 | } | ||
129 | |||
130 | @Override | ||
131 | public List<String> parameterNames() { | ||
132 | return NonSymmetricOpposite.Match.parameterNames; | ||
133 | } | ||
134 | |||
135 | @Override | ||
136 | public Object[] toArray() { | ||
137 | return new Object[]{fA, fB}; | ||
138 | } | ||
139 | |||
140 | @Override | ||
141 | public NonSymmetricOpposite.Match toImmutable() { | ||
142 | return isMutable() ? newMatch(fA, fB) : this; | ||
143 | } | ||
144 | |||
145 | @Override | ||
146 | public String prettyPrint() { | ||
147 | StringBuilder result = new StringBuilder(); | ||
148 | result.append("\"a\"=" + prettyPrintValue(fA) + ", "); | ||
149 | result.append("\"b\"=" + prettyPrintValue(fB)); | ||
150 | return result.toString(); | ||
151 | } | ||
152 | |||
153 | @Override | ||
154 | public int hashCode() { | ||
155 | return Objects.hash(fA, fB); | ||
156 | } | ||
157 | |||
158 | @Override | ||
159 | public boolean equals(final Object obj) { | ||
160 | if (this == obj) | ||
161 | return true; | ||
162 | if (obj == null) { | ||
163 | return false; | ||
164 | } | ||
165 | if ((obj instanceof NonSymmetricOpposite.Match)) { | ||
166 | NonSymmetricOpposite.Match other = (NonSymmetricOpposite.Match) obj; | ||
167 | return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB); | ||
168 | } else { | ||
169 | // this should be infrequent | ||
170 | if (!(obj instanceof IPatternMatch)) { | ||
171 | return false; | ||
172 | } | ||
173 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
174 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
175 | } | ||
176 | } | ||
177 | |||
178 | @Override | ||
179 | public NonSymmetricOpposite specification() { | ||
180 | return NonSymmetricOpposite.instance(); | ||
181 | } | ||
182 | |||
183 | /** | ||
184 | * Returns an empty, mutable match. | ||
185 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
186 | * | ||
187 | * @return the empty match. | ||
188 | * | ||
189 | */ | ||
190 | public static NonSymmetricOpposite.Match newEmptyMatch() { | ||
191 | return new Mutable(null, null); | ||
192 | } | ||
193 | |||
194 | /** | ||
195 | * Returns a mutable (partial) match. | ||
196 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
197 | * | ||
198 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
199 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
200 | * @return the new, mutable (partial) match object. | ||
201 | * | ||
202 | */ | ||
203 | public static NonSymmetricOpposite.Match newMutableMatch(final EReference pA, final EReference pB) { | ||
204 | return new Mutable(pA, pB); | ||
205 | } | ||
206 | |||
207 | /** | ||
208 | * Returns a new (partial) match. | ||
209 | * This can be used e.g. to call the matcher with a partial match. | ||
210 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
211 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
212 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
213 | * @return the (partial) match object. | ||
214 | * | ||
215 | */ | ||
216 | public static NonSymmetricOpposite.Match newMatch(final EReference pA, final EReference pB) { | ||
217 | return new Immutable(pA, pB); | ||
218 | } | ||
219 | |||
220 | private static final class Mutable extends NonSymmetricOpposite.Match { | ||
221 | Mutable(final EReference pA, final EReference pB) { | ||
222 | super(pA, pB); | ||
223 | } | ||
224 | |||
225 | @Override | ||
226 | public boolean isMutable() { | ||
227 | return true; | ||
228 | } | ||
229 | } | ||
230 | |||
231 | private static final class Immutable extends NonSymmetricOpposite.Match { | ||
232 | Immutable(final EReference pA, final EReference pB) { | ||
233 | super(pA, pB); | ||
234 | } | ||
235 | |||
236 | @Override | ||
237 | public boolean isMutable() { | ||
238 | return false; | ||
239 | } | ||
240 | } | ||
241 | } | ||
242 | |||
243 | /** | ||
244 | * Generated pattern matcher API of the ecore.nonSymmetricOpposite pattern, | ||
245 | * providing pattern-specific query methods. | ||
246 | * | ||
247 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
248 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
249 | * | ||
250 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
251 | * | ||
252 | * <p>Original source: | ||
253 | * <code><pre> | ||
254 | * {@literal @}Constraint(key={a}, severity="error", message="error") | ||
255 | * pattern nonSymmetricOpposite(a:EReference, b:EReference) { | ||
256 | * find opposite(a,b); | ||
257 | * neg find opposite(b,a); | ||
258 | * } | ||
259 | * </pre></code> | ||
260 | * | ||
261 | * @see Match | ||
262 | * @see NonSymmetricOpposite | ||
263 | * | ||
264 | */ | ||
265 | public static class Matcher extends BaseMatcher<NonSymmetricOpposite.Match> { | ||
266 | /** | ||
267 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
268 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
269 | * | ||
270 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
271 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
272 | * | ||
273 | */ | ||
274 | public static NonSymmetricOpposite.Matcher on(final ViatraQueryEngine engine) { | ||
275 | // check if matcher already exists | ||
276 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
277 | if (matcher == null) { | ||
278 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
279 | } | ||
280 | return matcher; | ||
281 | } | ||
282 | |||
283 | /** | ||
284 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
285 | * @return an initialized matcher | ||
286 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
287 | * | ||
288 | */ | ||
289 | public static NonSymmetricOpposite.Matcher create() { | ||
290 | return new Matcher(); | ||
291 | } | ||
292 | |||
293 | private static final int POSITION_A = 0; | ||
294 | |||
295 | private static final int POSITION_B = 1; | ||
296 | |||
297 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(NonSymmetricOpposite.Matcher.class); | ||
298 | |||
299 | /** | ||
300 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
301 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
302 | * | ||
303 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
304 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
305 | * | ||
306 | */ | ||
307 | private Matcher() { | ||
308 | super(querySpecification()); | ||
309 | } | ||
310 | |||
311 | /** | ||
312 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
313 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
314 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
315 | * @return matches represented as a Match object. | ||
316 | * | ||
317 | */ | ||
318 | public Collection<NonSymmetricOpposite.Match> getAllMatches(final EReference pA, final EReference pB) { | ||
319 | return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet()); | ||
320 | } | ||
321 | |||
322 | /** | ||
323 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
324 | * </p> | ||
325 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
326 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
327 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
328 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
329 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
330 | * @return a stream of matches represented as a Match object. | ||
331 | * | ||
332 | */ | ||
333 | public Stream<NonSymmetricOpposite.Match> streamAllMatches(final EReference pA, final EReference pB) { | ||
334 | return rawStreamAllMatches(new Object[]{pA, pB}); | ||
335 | } | ||
336 | |||
337 | /** | ||
338 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
339 | * Neither determinism nor randomness of selection is guaranteed. | ||
340 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
341 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
342 | * @return a match represented as a Match object, or null if no match is found. | ||
343 | * | ||
344 | */ | ||
345 | public Optional<NonSymmetricOpposite.Match> getOneArbitraryMatch(final EReference pA, final EReference pB) { | ||
346 | return rawGetOneArbitraryMatch(new Object[]{pA, pB}); | ||
347 | } | ||
348 | |||
349 | /** | ||
350 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
351 | * under any possible substitution of the unspecified parameters (if any). | ||
352 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
353 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
354 | * @return true if the input is a valid (partial) match of the pattern. | ||
355 | * | ||
356 | */ | ||
357 | public boolean hasMatch(final EReference pA, final EReference pB) { | ||
358 | return rawHasMatch(new Object[]{pA, pB}); | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
363 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
364 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
365 | * @return the number of pattern matches found. | ||
366 | * | ||
367 | */ | ||
368 | public int countMatches(final EReference pA, final EReference pB) { | ||
369 | return rawCountMatches(new Object[]{pA, pB}); | ||
370 | } | ||
371 | |||
372 | /** | ||
373 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
374 | * Neither determinism nor randomness of selection is guaranteed. | ||
375 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
376 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
377 | * @param processor the action that will process the selected match. | ||
378 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
379 | * | ||
380 | */ | ||
381 | public boolean forOneArbitraryMatch(final EReference pA, final EReference pB, final Consumer<? super NonSymmetricOpposite.Match> processor) { | ||
382 | return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor); | ||
383 | } | ||
384 | |||
385 | /** | ||
386 | * Returns a new (partial) match. | ||
387 | * This can be used e.g. to call the matcher with a partial match. | ||
388 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
389 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
390 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
391 | * @return the (partial) match object. | ||
392 | * | ||
393 | */ | ||
394 | public NonSymmetricOpposite.Match newMatch(final EReference pA, final EReference pB) { | ||
395 | return NonSymmetricOpposite.Match.newMatch(pA, pB); | ||
396 | } | ||
397 | |||
398 | /** | ||
399 | * Retrieve the set of values that occur in matches for a. | ||
400 | * @return the Set of all values or empty set if there are no matches | ||
401 | * | ||
402 | */ | ||
403 | protected Stream<EReference> rawStreamAllValuesOfa(final Object[] parameters) { | ||
404 | return rawStreamAllValues(POSITION_A, parameters).map(EReference.class::cast); | ||
405 | } | ||
406 | |||
407 | /** | ||
408 | * Retrieve the set of values that occur in matches for a. | ||
409 | * @return the Set of all values or empty set if there are no matches | ||
410 | * | ||
411 | */ | ||
412 | public Set<EReference> getAllValuesOfa() { | ||
413 | return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet()); | ||
414 | } | ||
415 | |||
416 | /** | ||
417 | * Retrieve the set of values that occur in matches for a. | ||
418 | * @return the Set of all values or empty set if there are no matches | ||
419 | * | ||
420 | */ | ||
421 | public Stream<EReference> streamAllValuesOfa() { | ||
422 | return rawStreamAllValuesOfa(emptyArray()); | ||
423 | } | ||
424 | |||
425 | /** | ||
426 | * Retrieve the set of values that occur in matches for a. | ||
427 | * </p> | ||
428 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
429 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
430 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
431 | * | ||
432 | * @return the Stream of all values or empty set if there are no matches | ||
433 | * | ||
434 | */ | ||
435 | public Stream<EReference> streamAllValuesOfa(final NonSymmetricOpposite.Match partialMatch) { | ||
436 | return rawStreamAllValuesOfa(partialMatch.toArray()); | ||
437 | } | ||
438 | |||
439 | /** | ||
440 | * Retrieve the set of values that occur in matches for a. | ||
441 | * </p> | ||
442 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
443 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
444 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
445 | * | ||
446 | * @return the Stream of all values or empty set if there are no matches | ||
447 | * | ||
448 | */ | ||
449 | public Stream<EReference> streamAllValuesOfa(final EReference pB) { | ||
450 | return rawStreamAllValuesOfa(new Object[]{null, pB}); | ||
451 | } | ||
452 | |||
453 | /** | ||
454 | * Retrieve the set of values that occur in matches for a. | ||
455 | * @return the Set of all values or empty set if there are no matches | ||
456 | * | ||
457 | */ | ||
458 | public Set<EReference> getAllValuesOfa(final NonSymmetricOpposite.Match partialMatch) { | ||
459 | return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet()); | ||
460 | } | ||
461 | |||
462 | /** | ||
463 | * Retrieve the set of values that occur in matches for a. | ||
464 | * @return the Set of all values or empty set if there are no matches | ||
465 | * | ||
466 | */ | ||
467 | public Set<EReference> getAllValuesOfa(final EReference pB) { | ||
468 | return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet()); | ||
469 | } | ||
470 | |||
471 | /** | ||
472 | * Retrieve the set of values that occur in matches for b. | ||
473 | * @return the Set of all values or empty set if there are no matches | ||
474 | * | ||
475 | */ | ||
476 | protected Stream<EReference> rawStreamAllValuesOfb(final Object[] parameters) { | ||
477 | return rawStreamAllValues(POSITION_B, parameters).map(EReference.class::cast); | ||
478 | } | ||
479 | |||
480 | /** | ||
481 | * Retrieve the set of values that occur in matches for b. | ||
482 | * @return the Set of all values or empty set if there are no matches | ||
483 | * | ||
484 | */ | ||
485 | public Set<EReference> getAllValuesOfb() { | ||
486 | return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet()); | ||
487 | } | ||
488 | |||
489 | /** | ||
490 | * Retrieve the set of values that occur in matches for b. | ||
491 | * @return the Set of all values or empty set if there are no matches | ||
492 | * | ||
493 | */ | ||
494 | public Stream<EReference> streamAllValuesOfb() { | ||
495 | return rawStreamAllValuesOfb(emptyArray()); | ||
496 | } | ||
497 | |||
498 | /** | ||
499 | * Retrieve the set of values that occur in matches for b. | ||
500 | * </p> | ||
501 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
502 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
503 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
504 | * | ||
505 | * @return the Stream of all values or empty set if there are no matches | ||
506 | * | ||
507 | */ | ||
508 | public Stream<EReference> streamAllValuesOfb(final NonSymmetricOpposite.Match partialMatch) { | ||
509 | return rawStreamAllValuesOfb(partialMatch.toArray()); | ||
510 | } | ||
511 | |||
512 | /** | ||
513 | * Retrieve the set of values that occur in matches for b. | ||
514 | * </p> | ||
515 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
516 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
517 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
518 | * | ||
519 | * @return the Stream of all values or empty set if there are no matches | ||
520 | * | ||
521 | */ | ||
522 | public Stream<EReference> streamAllValuesOfb(final EReference pA) { | ||
523 | return rawStreamAllValuesOfb(new Object[]{pA, null}); | ||
524 | } | ||
525 | |||
526 | /** | ||
527 | * Retrieve the set of values that occur in matches for b. | ||
528 | * @return the Set of all values or empty set if there are no matches | ||
529 | * | ||
530 | */ | ||
531 | public Set<EReference> getAllValuesOfb(final NonSymmetricOpposite.Match partialMatch) { | ||
532 | return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet()); | ||
533 | } | ||
534 | |||
535 | /** | ||
536 | * Retrieve the set of values that occur in matches for b. | ||
537 | * @return the Set of all values or empty set if there are no matches | ||
538 | * | ||
539 | */ | ||
540 | public Set<EReference> getAllValuesOfb(final EReference pA) { | ||
541 | return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet()); | ||
542 | } | ||
543 | |||
544 | @Override | ||
545 | protected NonSymmetricOpposite.Match tupleToMatch(final Tuple t) { | ||
546 | try { | ||
547 | return NonSymmetricOpposite.Match.newMatch((EReference) t.get(POSITION_A), (EReference) t.get(POSITION_B)); | ||
548 | } catch(ClassCastException e) { | ||
549 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
550 | return null; | ||
551 | } | ||
552 | } | ||
553 | |||
554 | @Override | ||
555 | protected NonSymmetricOpposite.Match arrayToMatch(final Object[] match) { | ||
556 | try { | ||
557 | return NonSymmetricOpposite.Match.newMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]); | ||
558 | } catch(ClassCastException e) { | ||
559 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
560 | return null; | ||
561 | } | ||
562 | } | ||
563 | |||
564 | @Override | ||
565 | protected NonSymmetricOpposite.Match arrayToMatchMutable(final Object[] match) { | ||
566 | try { | ||
567 | return NonSymmetricOpposite.Match.newMutableMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]); | ||
568 | } catch(ClassCastException e) { | ||
569 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
570 | return null; | ||
571 | } | ||
572 | } | ||
573 | |||
574 | /** | ||
575 | * @return the singleton instance of the query specification of this pattern | ||
576 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
577 | * | ||
578 | */ | ||
579 | public static IQuerySpecification<NonSymmetricOpposite.Matcher> querySpecification() { | ||
580 | return NonSymmetricOpposite.instance(); | ||
581 | } | ||
582 | } | ||
583 | |||
584 | private NonSymmetricOpposite() { | ||
585 | super(GeneratedPQuery.INSTANCE); | ||
586 | } | ||
587 | |||
588 | /** | ||
589 | * @return the singleton instance of the query specification | ||
590 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
591 | * | ||
592 | */ | ||
593 | public static NonSymmetricOpposite instance() { | ||
594 | try{ | ||
595 | return LazyHolder.INSTANCE; | ||
596 | } catch (ExceptionInInitializerError err) { | ||
597 | throw processInitializerError(err); | ||
598 | } | ||
599 | } | ||
600 | |||
601 | @Override | ||
602 | protected NonSymmetricOpposite.Matcher instantiate(final ViatraQueryEngine engine) { | ||
603 | return NonSymmetricOpposite.Matcher.on(engine); | ||
604 | } | ||
605 | |||
606 | @Override | ||
607 | public NonSymmetricOpposite.Matcher instantiate() { | ||
608 | return NonSymmetricOpposite.Matcher.create(); | ||
609 | } | ||
610 | |||
611 | @Override | ||
612 | public NonSymmetricOpposite.Match newEmptyMatch() { | ||
613 | return NonSymmetricOpposite.Match.newEmptyMatch(); | ||
614 | } | ||
615 | |||
616 | @Override | ||
617 | public NonSymmetricOpposite.Match newMatch(final Object... parameters) { | ||
618 | return NonSymmetricOpposite.Match.newMatch((org.eclipse.emf.ecore.EReference) parameters[0], (org.eclipse.emf.ecore.EReference) parameters[1]); | ||
619 | } | ||
620 | |||
621 | /** | ||
622 | * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.NonSymmetricOpposite (visibility: PUBLIC, simpleName: NonSymmetricOpposite, identifier: ecore.NonSymmetricOpposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
623 | * <b>not</b> at the class load time of the outer class, | ||
624 | * but rather at the first call to {@link JvmGenericType: ecore.NonSymmetricOpposite (visibility: PUBLIC, simpleName: NonSymmetricOpposite, identifier: ecore.NonSymmetricOpposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
625 | * | ||
626 | * <p> This workaround is required e.g. to support recursion. | ||
627 | * | ||
628 | */ | ||
629 | private static class LazyHolder { | ||
630 | private static final NonSymmetricOpposite INSTANCE = new NonSymmetricOpposite(); | ||
631 | |||
632 | /** | ||
633 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
634 | * This initialization order is required to support indirect recursion. | ||
635 | * | ||
636 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
637 | * | ||
638 | */ | ||
639 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
640 | |||
641 | public static Object ensureInitialized() { | ||
642 | INSTANCE.ensureInitializedInternal(); | ||
643 | return null; | ||
644 | } | ||
645 | } | ||
646 | |||
647 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
648 | private static final NonSymmetricOpposite.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
649 | |||
650 | private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT); | ||
651 | |||
652 | private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT); | ||
653 | |||
654 | private final List<PParameter> parameters = Arrays.asList(parameter_a, parameter_b); | ||
655 | |||
656 | private GeneratedPQuery() { | ||
657 | super(PVisibility.PUBLIC); | ||
658 | } | ||
659 | |||
660 | @Override | ||
661 | public String getFullyQualifiedName() { | ||
662 | return "ecore.nonSymmetricOpposite"; | ||
663 | } | ||
664 | |||
665 | @Override | ||
666 | public List<String> getParameterNames() { | ||
667 | return Arrays.asList("a","b"); | ||
668 | } | ||
669 | |||
670 | @Override | ||
671 | public List<PParameter> getParameters() { | ||
672 | return parameters; | ||
673 | } | ||
674 | |||
675 | @Override | ||
676 | public Set<PBody> doGetContainedBodies() { | ||
677 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
678 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
679 | { | ||
680 | PBody body = new PBody(this); | ||
681 | PVariable var_a = body.getOrCreateVariableByName("a"); | ||
682 | PVariable var_b = body.getOrCreateVariableByName("b"); | ||
683 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
684 | new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
685 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
686 | new ExportedParameter(body, var_a, parameter_a), | ||
687 | new ExportedParameter(body, var_b, parameter_b) | ||
688 | )); | ||
689 | // find opposite(a,b) | ||
690 | new PositivePatternCall(body, Tuples.flatTupleOf(var_a, var_b), Opposite.instance().getInternalQueryRepresentation()); | ||
691 | // neg find opposite(b,a) | ||
692 | new NegativePatternCall(body, Tuples.flatTupleOf(var_b, var_a), Opposite.instance().getInternalQueryRepresentation()); | ||
693 | bodies.add(body); | ||
694 | } | ||
695 | { | ||
696 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
697 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
698 | new ParameterReference("a") | ||
699 | })); | ||
700 | annotation.addAttribute("severity", "error"); | ||
701 | annotation.addAttribute("message", "error"); | ||
702 | addAnnotation(annotation); | ||
703 | } | ||
704 | return bodies; | ||
705 | } | ||
706 | } | ||
707 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java new file mode 100644 index 00000000..d826f072 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/Opposite.java | |||
@@ -0,0 +1,693 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.emf.ecore.EReference; | ||
19 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
20 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
21 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
25 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
39 | import 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") | ||
56 | public final class Opposite extends BaseGeneratedEMFQuerySpecification<Opposite.Matcher> { | ||
57 | /** | ||
58 | * Pattern-specific match representation of the ecore.opposite pattern, | ||
59 | * to be used in conjunction with {@link Matcher}. | ||
60 | * | ||
61 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
62 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
63 | * usable to represent a match of the pattern in the result of a query, | ||
64 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
65 | * | ||
66 | * @see Matcher | ||
67 | * | ||
68 | */ | ||
69 | public static abstract class Match extends BasePatternMatch { | ||
70 | private EReference fA; | ||
71 | |||
72 | private EReference fB; | ||
73 | |||
74 | private static List<String> parameterNames = makeImmutableList("a", "b"); | ||
75 | |||
76 | private Match(final EReference pA, final EReference pB) { | ||
77 | this.fA = pA; | ||
78 | this.fB = pB; | ||
79 | } | ||
80 | |||
81 | @Override | ||
82 | public Object get(final String parameterName) { | ||
83 | if ("a".equals(parameterName)) return this.fA; | ||
84 | if ("b".equals(parameterName)) return this.fB; | ||
85 | return null; | ||
86 | } | ||
87 | |||
88 | public EReference getA() { | ||
89 | return this.fA; | ||
90 | } | ||
91 | |||
92 | public EReference getB() { | ||
93 | return this.fB; | ||
94 | } | ||
95 | |||
96 | @Override | ||
97 | public boolean set(final String parameterName, final Object newValue) { | ||
98 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
99 | if ("a".equals(parameterName) ) { | ||
100 | this.fA = (EReference) newValue; | ||
101 | return true; | ||
102 | } | ||
103 | if ("b".equals(parameterName) ) { | ||
104 | this.fB = (EReference) newValue; | ||
105 | return true; | ||
106 | } | ||
107 | return false; | ||
108 | } | ||
109 | |||
110 | public void setA(final EReference pA) { | ||
111 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
112 | this.fA = pA; | ||
113 | } | ||
114 | |||
115 | public void setB(final EReference pB) { | ||
116 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
117 | this.fB = pB; | ||
118 | } | ||
119 | |||
120 | @Override | ||
121 | public String patternName() { | ||
122 | return "ecore.opposite"; | ||
123 | } | ||
124 | |||
125 | @Override | ||
126 | public List<String> parameterNames() { | ||
127 | return Opposite.Match.parameterNames; | ||
128 | } | ||
129 | |||
130 | @Override | ||
131 | public Object[] toArray() { | ||
132 | return new Object[]{fA, fB}; | ||
133 | } | ||
134 | |||
135 | @Override | ||
136 | public Opposite.Match toImmutable() { | ||
137 | return isMutable() ? newMatch(fA, fB) : this; | ||
138 | } | ||
139 | |||
140 | @Override | ||
141 | public String prettyPrint() { | ||
142 | StringBuilder result = new StringBuilder(); | ||
143 | result.append("\"a\"=" + prettyPrintValue(fA) + ", "); | ||
144 | result.append("\"b\"=" + prettyPrintValue(fB)); | ||
145 | return result.toString(); | ||
146 | } | ||
147 | |||
148 | @Override | ||
149 | public int hashCode() { | ||
150 | return Objects.hash(fA, fB); | ||
151 | } | ||
152 | |||
153 | @Override | ||
154 | public boolean equals(final Object obj) { | ||
155 | if (this == obj) | ||
156 | return true; | ||
157 | if (obj == null) { | ||
158 | return false; | ||
159 | } | ||
160 | if ((obj instanceof Opposite.Match)) { | ||
161 | Opposite.Match other = (Opposite.Match) obj; | ||
162 | return Objects.equals(fA, other.fA) && Objects.equals(fB, other.fB); | ||
163 | } else { | ||
164 | // this should be infrequent | ||
165 | if (!(obj instanceof IPatternMatch)) { | ||
166 | return false; | ||
167 | } | ||
168 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
169 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
170 | } | ||
171 | } | ||
172 | |||
173 | @Override | ||
174 | public Opposite specification() { | ||
175 | return Opposite.instance(); | ||
176 | } | ||
177 | |||
178 | /** | ||
179 | * Returns an empty, mutable match. | ||
180 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
181 | * | ||
182 | * @return the empty match. | ||
183 | * | ||
184 | */ | ||
185 | public static Opposite.Match newEmptyMatch() { | ||
186 | return new Mutable(null, null); | ||
187 | } | ||
188 | |||
189 | /** | ||
190 | * Returns a mutable (partial) match. | ||
191 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
192 | * | ||
193 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
194 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
195 | * @return the new, mutable (partial) match object. | ||
196 | * | ||
197 | */ | ||
198 | public static Opposite.Match newMutableMatch(final EReference pA, final EReference pB) { | ||
199 | return new Mutable(pA, pB); | ||
200 | } | ||
201 | |||
202 | /** | ||
203 | * Returns a new (partial) match. | ||
204 | * This can be used e.g. to call the matcher with a partial match. | ||
205 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
206 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
207 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
208 | * @return the (partial) match object. | ||
209 | * | ||
210 | */ | ||
211 | public static Opposite.Match newMatch(final EReference pA, final EReference pB) { | ||
212 | return new Immutable(pA, pB); | ||
213 | } | ||
214 | |||
215 | private static final class Mutable extends Opposite.Match { | ||
216 | Mutable(final EReference pA, final EReference pB) { | ||
217 | super(pA, pB); | ||
218 | } | ||
219 | |||
220 | @Override | ||
221 | public boolean isMutable() { | ||
222 | return true; | ||
223 | } | ||
224 | } | ||
225 | |||
226 | private static final class Immutable extends Opposite.Match { | ||
227 | Immutable(final EReference pA, final EReference pB) { | ||
228 | super(pA, pB); | ||
229 | } | ||
230 | |||
231 | @Override | ||
232 | public boolean isMutable() { | ||
233 | return false; | ||
234 | } | ||
235 | } | ||
236 | } | ||
237 | |||
238 | /** | ||
239 | * Generated pattern matcher API of the ecore.opposite pattern, | ||
240 | * providing pattern-specific query methods. | ||
241 | * | ||
242 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
243 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
244 | * | ||
245 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
246 | * | ||
247 | * <p>Original source: | ||
248 | * <code><pre> | ||
249 | * pattern opposite(a:EReference, b: EReference) { | ||
250 | * EReference.eOpposite(a,b); | ||
251 | * } | ||
252 | * </pre></code> | ||
253 | * | ||
254 | * @see Match | ||
255 | * @see Opposite | ||
256 | * | ||
257 | */ | ||
258 | public static class Matcher extends BaseMatcher<Opposite.Match> { | ||
259 | /** | ||
260 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
261 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
262 | * | ||
263 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
264 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
265 | * | ||
266 | */ | ||
267 | public static Opposite.Matcher on(final ViatraQueryEngine engine) { | ||
268 | // check if matcher already exists | ||
269 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
270 | if (matcher == null) { | ||
271 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
272 | } | ||
273 | return matcher; | ||
274 | } | ||
275 | |||
276 | /** | ||
277 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
278 | * @return an initialized matcher | ||
279 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
280 | * | ||
281 | */ | ||
282 | public static Opposite.Matcher create() { | ||
283 | return new Matcher(); | ||
284 | } | ||
285 | |||
286 | private static final int POSITION_A = 0; | ||
287 | |||
288 | private static final int POSITION_B = 1; | ||
289 | |||
290 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(Opposite.Matcher.class); | ||
291 | |||
292 | /** | ||
293 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
294 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
295 | * | ||
296 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
297 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
298 | * | ||
299 | */ | ||
300 | private Matcher() { | ||
301 | super(querySpecification()); | ||
302 | } | ||
303 | |||
304 | /** | ||
305 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
306 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
307 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
308 | * @return matches represented as a Match object. | ||
309 | * | ||
310 | */ | ||
311 | public Collection<Opposite.Match> getAllMatches(final EReference pA, final EReference pB) { | ||
312 | return rawStreamAllMatches(new Object[]{pA, pB}).collect(Collectors.toSet()); | ||
313 | } | ||
314 | |||
315 | /** | ||
316 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
317 | * </p> | ||
318 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
319 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
320 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
321 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
322 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
323 | * @return a stream of matches represented as a Match object. | ||
324 | * | ||
325 | */ | ||
326 | public Stream<Opposite.Match> streamAllMatches(final EReference pA, final EReference pB) { | ||
327 | return rawStreamAllMatches(new Object[]{pA, pB}); | ||
328 | } | ||
329 | |||
330 | /** | ||
331 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
332 | * Neither determinism nor randomness of selection is guaranteed. | ||
333 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
334 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
335 | * @return a match represented as a Match object, or null if no match is found. | ||
336 | * | ||
337 | */ | ||
338 | public Optional<Opposite.Match> getOneArbitraryMatch(final EReference pA, final EReference pB) { | ||
339 | return rawGetOneArbitraryMatch(new Object[]{pA, pB}); | ||
340 | } | ||
341 | |||
342 | /** | ||
343 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
344 | * under any possible substitution of the unspecified parameters (if any). | ||
345 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
346 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
347 | * @return true if the input is a valid (partial) match of the pattern. | ||
348 | * | ||
349 | */ | ||
350 | public boolean hasMatch(final EReference pA, final EReference pB) { | ||
351 | return rawHasMatch(new Object[]{pA, pB}); | ||
352 | } | ||
353 | |||
354 | /** | ||
355 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
356 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
357 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
358 | * @return the number of pattern matches found. | ||
359 | * | ||
360 | */ | ||
361 | public int countMatches(final EReference pA, final EReference pB) { | ||
362 | return rawCountMatches(new Object[]{pA, pB}); | ||
363 | } | ||
364 | |||
365 | /** | ||
366 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
367 | * Neither determinism nor randomness of selection is guaranteed. | ||
368 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
369 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
370 | * @param processor the action that will process the selected match. | ||
371 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
372 | * | ||
373 | */ | ||
374 | public boolean forOneArbitraryMatch(final EReference pA, final EReference pB, final Consumer<? super Opposite.Match> processor) { | ||
375 | return rawForOneArbitraryMatch(new Object[]{pA, pB}, processor); | ||
376 | } | ||
377 | |||
378 | /** | ||
379 | * Returns a new (partial) match. | ||
380 | * This can be used e.g. to call the matcher with a partial match. | ||
381 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
382 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
383 | * @param pB the fixed value of pattern parameter b, or null if not bound. | ||
384 | * @return the (partial) match object. | ||
385 | * | ||
386 | */ | ||
387 | public Opposite.Match newMatch(final EReference pA, final EReference pB) { | ||
388 | return Opposite.Match.newMatch(pA, pB); | ||
389 | } | ||
390 | |||
391 | /** | ||
392 | * Retrieve the set of values that occur in matches for a. | ||
393 | * @return the Set of all values or empty set if there are no matches | ||
394 | * | ||
395 | */ | ||
396 | protected Stream<EReference> rawStreamAllValuesOfa(final Object[] parameters) { | ||
397 | return rawStreamAllValues(POSITION_A, parameters).map(EReference.class::cast); | ||
398 | } | ||
399 | |||
400 | /** | ||
401 | * Retrieve the set of values that occur in matches for a. | ||
402 | * @return the Set of all values or empty set if there are no matches | ||
403 | * | ||
404 | */ | ||
405 | public Set<EReference> getAllValuesOfa() { | ||
406 | return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet()); | ||
407 | } | ||
408 | |||
409 | /** | ||
410 | * Retrieve the set of values that occur in matches for a. | ||
411 | * @return the Set of all values or empty set if there are no matches | ||
412 | * | ||
413 | */ | ||
414 | public Stream<EReference> streamAllValuesOfa() { | ||
415 | return rawStreamAllValuesOfa(emptyArray()); | ||
416 | } | ||
417 | |||
418 | /** | ||
419 | * Retrieve the set of values that occur in matches for a. | ||
420 | * </p> | ||
421 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
422 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
423 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
424 | * | ||
425 | * @return the Stream of all values or empty set if there are no matches | ||
426 | * | ||
427 | */ | ||
428 | public Stream<EReference> streamAllValuesOfa(final Opposite.Match partialMatch) { | ||
429 | return rawStreamAllValuesOfa(partialMatch.toArray()); | ||
430 | } | ||
431 | |||
432 | /** | ||
433 | * Retrieve the set of values that occur in matches for a. | ||
434 | * </p> | ||
435 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
436 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
437 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
438 | * | ||
439 | * @return the Stream of all values or empty set if there are no matches | ||
440 | * | ||
441 | */ | ||
442 | public Stream<EReference> streamAllValuesOfa(final EReference pB) { | ||
443 | return rawStreamAllValuesOfa(new Object[]{null, pB}); | ||
444 | } | ||
445 | |||
446 | /** | ||
447 | * Retrieve the set of values that occur in matches for a. | ||
448 | * @return the Set of all values or empty set if there are no matches | ||
449 | * | ||
450 | */ | ||
451 | public Set<EReference> getAllValuesOfa(final Opposite.Match partialMatch) { | ||
452 | return rawStreamAllValuesOfa(partialMatch.toArray()).collect(Collectors.toSet()); | ||
453 | } | ||
454 | |||
455 | /** | ||
456 | * Retrieve the set of values that occur in matches for a. | ||
457 | * @return the Set of all values or empty set if there are no matches | ||
458 | * | ||
459 | */ | ||
460 | public Set<EReference> getAllValuesOfa(final EReference pB) { | ||
461 | return rawStreamAllValuesOfa(new Object[]{null, pB}).collect(Collectors.toSet()); | ||
462 | } | ||
463 | |||
464 | /** | ||
465 | * Retrieve the set of values that occur in matches for b. | ||
466 | * @return the Set of all values or empty set if there are no matches | ||
467 | * | ||
468 | */ | ||
469 | protected Stream<EReference> rawStreamAllValuesOfb(final Object[] parameters) { | ||
470 | return rawStreamAllValues(POSITION_B, parameters).map(EReference.class::cast); | ||
471 | } | ||
472 | |||
473 | /** | ||
474 | * Retrieve the set of values that occur in matches for b. | ||
475 | * @return the Set of all values or empty set if there are no matches | ||
476 | * | ||
477 | */ | ||
478 | public Set<EReference> getAllValuesOfb() { | ||
479 | return rawStreamAllValuesOfb(emptyArray()).collect(Collectors.toSet()); | ||
480 | } | ||
481 | |||
482 | /** | ||
483 | * Retrieve the set of values that occur in matches for b. | ||
484 | * @return the Set of all values or empty set if there are no matches | ||
485 | * | ||
486 | */ | ||
487 | public Stream<EReference> streamAllValuesOfb() { | ||
488 | return rawStreamAllValuesOfb(emptyArray()); | ||
489 | } | ||
490 | |||
491 | /** | ||
492 | * Retrieve the set of values that occur in matches for b. | ||
493 | * </p> | ||
494 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
495 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
496 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
497 | * | ||
498 | * @return the Stream of all values or empty set if there are no matches | ||
499 | * | ||
500 | */ | ||
501 | public Stream<EReference> streamAllValuesOfb(final Opposite.Match partialMatch) { | ||
502 | return rawStreamAllValuesOfb(partialMatch.toArray()); | ||
503 | } | ||
504 | |||
505 | /** | ||
506 | * Retrieve the set of values that occur in matches for b. | ||
507 | * </p> | ||
508 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
509 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
510 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
511 | * | ||
512 | * @return the Stream of all values or empty set if there are no matches | ||
513 | * | ||
514 | */ | ||
515 | public Stream<EReference> streamAllValuesOfb(final EReference pA) { | ||
516 | return rawStreamAllValuesOfb(new Object[]{pA, null}); | ||
517 | } | ||
518 | |||
519 | /** | ||
520 | * Retrieve the set of values that occur in matches for b. | ||
521 | * @return the Set of all values or empty set if there are no matches | ||
522 | * | ||
523 | */ | ||
524 | public Set<EReference> getAllValuesOfb(final Opposite.Match partialMatch) { | ||
525 | return rawStreamAllValuesOfb(partialMatch.toArray()).collect(Collectors.toSet()); | ||
526 | } | ||
527 | |||
528 | /** | ||
529 | * Retrieve the set of values that occur in matches for b. | ||
530 | * @return the Set of all values or empty set if there are no matches | ||
531 | * | ||
532 | */ | ||
533 | public Set<EReference> getAllValuesOfb(final EReference pA) { | ||
534 | return rawStreamAllValuesOfb(new Object[]{pA, null}).collect(Collectors.toSet()); | ||
535 | } | ||
536 | |||
537 | @Override | ||
538 | protected Opposite.Match tupleToMatch(final Tuple t) { | ||
539 | try { | ||
540 | return Opposite.Match.newMatch((EReference) t.get(POSITION_A), (EReference) t.get(POSITION_B)); | ||
541 | } catch(ClassCastException e) { | ||
542 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
543 | return null; | ||
544 | } | ||
545 | } | ||
546 | |||
547 | @Override | ||
548 | protected Opposite.Match arrayToMatch(final Object[] match) { | ||
549 | try { | ||
550 | return Opposite.Match.newMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]); | ||
551 | } catch(ClassCastException e) { | ||
552 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
553 | return null; | ||
554 | } | ||
555 | } | ||
556 | |||
557 | @Override | ||
558 | protected Opposite.Match arrayToMatchMutable(final Object[] match) { | ||
559 | try { | ||
560 | return Opposite.Match.newMutableMatch((EReference) match[POSITION_A], (EReference) match[POSITION_B]); | ||
561 | } catch(ClassCastException e) { | ||
562 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
563 | return null; | ||
564 | } | ||
565 | } | ||
566 | |||
567 | /** | ||
568 | * @return the singleton instance of the query specification of this pattern | ||
569 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
570 | * | ||
571 | */ | ||
572 | public static IQuerySpecification<Opposite.Matcher> querySpecification() { | ||
573 | return Opposite.instance(); | ||
574 | } | ||
575 | } | ||
576 | |||
577 | private Opposite() { | ||
578 | super(GeneratedPQuery.INSTANCE); | ||
579 | } | ||
580 | |||
581 | /** | ||
582 | * @return the singleton instance of the query specification | ||
583 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
584 | * | ||
585 | */ | ||
586 | public static Opposite instance() { | ||
587 | try{ | ||
588 | return LazyHolder.INSTANCE; | ||
589 | } catch (ExceptionInInitializerError err) { | ||
590 | throw processInitializerError(err); | ||
591 | } | ||
592 | } | ||
593 | |||
594 | @Override | ||
595 | protected Opposite.Matcher instantiate(final ViatraQueryEngine engine) { | ||
596 | return Opposite.Matcher.on(engine); | ||
597 | } | ||
598 | |||
599 | @Override | ||
600 | public Opposite.Matcher instantiate() { | ||
601 | return Opposite.Matcher.create(); | ||
602 | } | ||
603 | |||
604 | @Override | ||
605 | public Opposite.Match newEmptyMatch() { | ||
606 | return Opposite.Match.newEmptyMatch(); | ||
607 | } | ||
608 | |||
609 | @Override | ||
610 | public Opposite.Match newMatch(final Object... parameters) { | ||
611 | return Opposite.Match.newMatch((org.eclipse.emf.ecore.EReference) parameters[0], (org.eclipse.emf.ecore.EReference) parameters[1]); | ||
612 | } | ||
613 | |||
614 | /** | ||
615 | * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.Opposite (visibility: PUBLIC, simpleName: Opposite, identifier: ecore.Opposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
616 | * <b>not</b> at the class load time of the outer class, | ||
617 | * but rather at the first call to {@link JvmGenericType: ecore.Opposite (visibility: PUBLIC, simpleName: Opposite, identifier: ecore.Opposite, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
618 | * | ||
619 | * <p> This workaround is required e.g. to support recursion. | ||
620 | * | ||
621 | */ | ||
622 | private static class LazyHolder { | ||
623 | private static final Opposite INSTANCE = new Opposite(); | ||
624 | |||
625 | /** | ||
626 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
627 | * This initialization order is required to support indirect recursion. | ||
628 | * | ||
629 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
630 | * | ||
631 | */ | ||
632 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
633 | |||
634 | public static Object ensureInitialized() { | ||
635 | INSTANCE.ensureInitializedInternal(); | ||
636 | return null; | ||
637 | } | ||
638 | } | ||
639 | |||
640 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
641 | private static final Opposite.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
642 | |||
643 | private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT); | ||
644 | |||
645 | private final PParameter parameter_b = new PParameter("b", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT); | ||
646 | |||
647 | private final List<PParameter> parameters = Arrays.asList(parameter_a, parameter_b); | ||
648 | |||
649 | private GeneratedPQuery() { | ||
650 | super(PVisibility.PUBLIC); | ||
651 | } | ||
652 | |||
653 | @Override | ||
654 | public String getFullyQualifiedName() { | ||
655 | return "ecore.opposite"; | ||
656 | } | ||
657 | |||
658 | @Override | ||
659 | public List<String> getParameterNames() { | ||
660 | return Arrays.asList("a","b"); | ||
661 | } | ||
662 | |||
663 | @Override | ||
664 | public List<PParameter> getParameters() { | ||
665 | return parameters; | ||
666 | } | ||
667 | |||
668 | @Override | ||
669 | public Set<PBody> doGetContainedBodies() { | ||
670 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
671 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
672 | { | ||
673 | PBody body = new PBody(this); | ||
674 | PVariable var_a = body.getOrCreateVariableByName("a"); | ||
675 | PVariable var_b = body.getOrCreateVariableByName("b"); | ||
676 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
677 | new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
678 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
679 | new ExportedParameter(body, var_a, parameter_a), | ||
680 | new ExportedParameter(body, var_b, parameter_b) | ||
681 | )); | ||
682 | // EReference.eOpposite(a,b) | ||
683 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
684 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
685 | new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference", "eOpposite"))); | ||
686 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
687 | new Equality(body, var__virtual_0_, var_b); | ||
688 | bodies.add(body); | ||
689 | } | ||
690 | return bodies; | ||
691 | } | ||
692 | } | ||
693 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java new file mode 100644 index 00000000..3a0df648 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/constraints/ecore/OppositeDifferentClass.java | |||
@@ -0,0 +1,577 @@ | |||
1 | /** | ||
2 | * Generated from platform:/resource/SocialNetwork_plugin/queries/ecore/Ecore.vql | ||
3 | */ | ||
4 | package ecore; | ||
5 | |||
6 | import java.util.Arrays; | ||
7 | import java.util.Collection; | ||
8 | import java.util.LinkedHashSet; | ||
9 | import java.util.List; | ||
10 | import java.util.Objects; | ||
11 | import java.util.Optional; | ||
12 | import java.util.Set; | ||
13 | import java.util.function.Consumer; | ||
14 | import java.util.stream.Collectors; | ||
15 | import java.util.stream.Stream; | ||
16 | import org.apache.log4j.Logger; | ||
17 | import org.eclipse.emf.ecore.EClass; | ||
18 | import org.eclipse.emf.ecore.EReference; | ||
19 | import org.eclipse.viatra.query.runtime.api.IPatternMatch; | ||
20 | import org.eclipse.viatra.query.runtime.api.IQuerySpecification; | ||
21 | import org.eclipse.viatra.query.runtime.api.ViatraQueryEngine; | ||
22 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFPQuery; | ||
23 | import org.eclipse.viatra.query.runtime.api.impl.BaseGeneratedEMFQuerySpecification; | ||
24 | import org.eclipse.viatra.query.runtime.api.impl.BaseMatcher; | ||
25 | import org.eclipse.viatra.query.runtime.api.impl.BasePatternMatch; | ||
26 | import org.eclipse.viatra.query.runtime.emf.types.EClassTransitiveInstancesKey; | ||
27 | import org.eclipse.viatra.query.runtime.emf.types.EStructuralFeatureInstancesKey; | ||
28 | import org.eclipse.viatra.query.runtime.matchers.backend.QueryEvaluationHint; | ||
29 | import org.eclipse.viatra.query.runtime.matchers.psystem.PBody; | ||
30 | import org.eclipse.viatra.query.runtime.matchers.psystem.PVariable; | ||
31 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.PAnnotation; | ||
32 | import org.eclipse.viatra.query.runtime.matchers.psystem.annotations.ParameterReference; | ||
33 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Equality; | ||
34 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.ExportedParameter; | ||
35 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicdeferred.Inequality; | ||
36 | import org.eclipse.viatra.query.runtime.matchers.psystem.basicenumerables.TypeConstraint; | ||
37 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameter; | ||
38 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PParameterDirection; | ||
39 | import org.eclipse.viatra.query.runtime.matchers.psystem.queries.PVisibility; | ||
40 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuple; | ||
41 | import org.eclipse.viatra.query.runtime.matchers.tuple.Tuples; | ||
42 | import 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") | ||
63 | public final class OppositeDifferentClass extends BaseGeneratedEMFQuerySpecification<OppositeDifferentClass.Matcher> { | ||
64 | /** | ||
65 | * Pattern-specific match representation of the ecore.oppositeDifferentClass pattern, | ||
66 | * to be used in conjunction with {@link Matcher}. | ||
67 | * | ||
68 | * <p>Class fields correspond to parameters of the pattern. Fields with value null are considered unassigned. | ||
69 | * Each instance is a (possibly partial) substitution of pattern parameters, | ||
70 | * usable to represent a match of the pattern in the result of a query, | ||
71 | * or to specify the bound (fixed) input parameters when issuing a query. | ||
72 | * | ||
73 | * @see Matcher | ||
74 | * | ||
75 | */ | ||
76 | public static abstract class Match extends BasePatternMatch { | ||
77 | private EReference fA; | ||
78 | |||
79 | private static List<String> parameterNames = makeImmutableList("a"); | ||
80 | |||
81 | private Match(final EReference pA) { | ||
82 | this.fA = pA; | ||
83 | } | ||
84 | |||
85 | @Override | ||
86 | public Object get(final String parameterName) { | ||
87 | if ("a".equals(parameterName)) return this.fA; | ||
88 | return null; | ||
89 | } | ||
90 | |||
91 | public EReference getA() { | ||
92 | return this.fA; | ||
93 | } | ||
94 | |||
95 | @Override | ||
96 | public boolean set(final String parameterName, final Object newValue) { | ||
97 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
98 | if ("a".equals(parameterName) ) { | ||
99 | this.fA = (EReference) newValue; | ||
100 | return true; | ||
101 | } | ||
102 | return false; | ||
103 | } | ||
104 | |||
105 | public void setA(final EReference pA) { | ||
106 | if (!isMutable()) throw new java.lang.UnsupportedOperationException(); | ||
107 | this.fA = pA; | ||
108 | } | ||
109 | |||
110 | @Override | ||
111 | public String patternName() { | ||
112 | return "ecore.oppositeDifferentClass"; | ||
113 | } | ||
114 | |||
115 | @Override | ||
116 | public List<String> parameterNames() { | ||
117 | return OppositeDifferentClass.Match.parameterNames; | ||
118 | } | ||
119 | |||
120 | @Override | ||
121 | public Object[] toArray() { | ||
122 | return new Object[]{fA}; | ||
123 | } | ||
124 | |||
125 | @Override | ||
126 | public OppositeDifferentClass.Match toImmutable() { | ||
127 | return isMutable() ? newMatch(fA) : this; | ||
128 | } | ||
129 | |||
130 | @Override | ||
131 | public String prettyPrint() { | ||
132 | StringBuilder result = new StringBuilder(); | ||
133 | result.append("\"a\"=" + prettyPrintValue(fA)); | ||
134 | return result.toString(); | ||
135 | } | ||
136 | |||
137 | @Override | ||
138 | public int hashCode() { | ||
139 | return Objects.hash(fA); | ||
140 | } | ||
141 | |||
142 | @Override | ||
143 | public boolean equals(final Object obj) { | ||
144 | if (this == obj) | ||
145 | return true; | ||
146 | if (obj == null) { | ||
147 | return false; | ||
148 | } | ||
149 | if ((obj instanceof OppositeDifferentClass.Match)) { | ||
150 | OppositeDifferentClass.Match other = (OppositeDifferentClass.Match) obj; | ||
151 | return Objects.equals(fA, other.fA); | ||
152 | } else { | ||
153 | // this should be infrequent | ||
154 | if (!(obj instanceof IPatternMatch)) { | ||
155 | return false; | ||
156 | } | ||
157 | IPatternMatch otherSig = (IPatternMatch) obj; | ||
158 | return Objects.equals(specification(), otherSig.specification()) && Arrays.deepEquals(toArray(), otherSig.toArray()); | ||
159 | } | ||
160 | } | ||
161 | |||
162 | @Override | ||
163 | public OppositeDifferentClass specification() { | ||
164 | return OppositeDifferentClass.instance(); | ||
165 | } | ||
166 | |||
167 | /** | ||
168 | * Returns an empty, mutable match. | ||
169 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
170 | * | ||
171 | * @return the empty match. | ||
172 | * | ||
173 | */ | ||
174 | public static OppositeDifferentClass.Match newEmptyMatch() { | ||
175 | return new Mutable(null); | ||
176 | } | ||
177 | |||
178 | /** | ||
179 | * Returns a mutable (partial) match. | ||
180 | * Fields of the mutable match can be filled to create a partial match, usable as matcher input. | ||
181 | * | ||
182 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
183 | * @return the new, mutable (partial) match object. | ||
184 | * | ||
185 | */ | ||
186 | public static OppositeDifferentClass.Match newMutableMatch(final EReference pA) { | ||
187 | return new Mutable(pA); | ||
188 | } | ||
189 | |||
190 | /** | ||
191 | * Returns a new (partial) match. | ||
192 | * This can be used e.g. to call the matcher with a partial match. | ||
193 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
194 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
195 | * @return the (partial) match object. | ||
196 | * | ||
197 | */ | ||
198 | public static OppositeDifferentClass.Match newMatch(final EReference pA) { | ||
199 | return new Immutable(pA); | ||
200 | } | ||
201 | |||
202 | private static final class Mutable extends OppositeDifferentClass.Match { | ||
203 | Mutable(final EReference pA) { | ||
204 | super(pA); | ||
205 | } | ||
206 | |||
207 | @Override | ||
208 | public boolean isMutable() { | ||
209 | return true; | ||
210 | } | ||
211 | } | ||
212 | |||
213 | private static final class Immutable extends OppositeDifferentClass.Match { | ||
214 | Immutable(final EReference pA) { | ||
215 | super(pA); | ||
216 | } | ||
217 | |||
218 | @Override | ||
219 | public boolean isMutable() { | ||
220 | return false; | ||
221 | } | ||
222 | } | ||
223 | } | ||
224 | |||
225 | /** | ||
226 | * Generated pattern matcher API of the ecore.oppositeDifferentClass pattern, | ||
227 | * providing pattern-specific query methods. | ||
228 | * | ||
229 | * <p>Use the pattern matcher on a given model via {@link #on(ViatraQueryEngine)}, | ||
230 | * e.g. in conjunction with {@link ViatraQueryEngine#on(QueryScope)}. | ||
231 | * | ||
232 | * <p>Matches of the pattern will be represented as {@link Match}. | ||
233 | * | ||
234 | * <p>Original source: | ||
235 | * <code><pre> | ||
236 | * {@literal @}Constraint(key={a}, severity="error", message="error") | ||
237 | * pattern oppositeDifferentClass(a:EReference) { | ||
238 | * EReference.eOpposite(a,b); | ||
239 | * EReference.eContainingClass(a,aContaining); | ||
240 | * EReference.eType(b,bTarget); | ||
241 | * aContaining != bTarget; | ||
242 | * } | ||
243 | * </pre></code> | ||
244 | * | ||
245 | * @see Match | ||
246 | * @see OppositeDifferentClass | ||
247 | * | ||
248 | */ | ||
249 | public static class Matcher extends BaseMatcher<OppositeDifferentClass.Match> { | ||
250 | /** | ||
251 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
252 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
253 | * | ||
254 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
255 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
256 | * | ||
257 | */ | ||
258 | public static OppositeDifferentClass.Matcher on(final ViatraQueryEngine engine) { | ||
259 | // check if matcher already exists | ||
260 | Matcher matcher = engine.getExistingMatcher(querySpecification()); | ||
261 | if (matcher == null) { | ||
262 | matcher = (Matcher)engine.getMatcher(querySpecification()); | ||
263 | } | ||
264 | return matcher; | ||
265 | } | ||
266 | |||
267 | /** | ||
268 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
269 | * @return an initialized matcher | ||
270 | * @noreference This method is for internal matcher initialization by the framework, do not call it manually. | ||
271 | * | ||
272 | */ | ||
273 | public static OppositeDifferentClass.Matcher create() { | ||
274 | return new Matcher(); | ||
275 | } | ||
276 | |||
277 | private static final int POSITION_A = 0; | ||
278 | |||
279 | private static final Logger LOGGER = ViatraQueryLoggingUtil.getLogger(OppositeDifferentClass.Matcher.class); | ||
280 | |||
281 | /** | ||
282 | * Initializes the pattern matcher within an existing VIATRA Query engine. | ||
283 | * If the pattern matcher is already constructed in the engine, only a light-weight reference is returned. | ||
284 | * | ||
285 | * @param engine the existing VIATRA Query engine in which this matcher will be created. | ||
286 | * @throws ViatraQueryRuntimeException if an error occurs during pattern matcher creation | ||
287 | * | ||
288 | */ | ||
289 | private Matcher() { | ||
290 | super(querySpecification()); | ||
291 | } | ||
292 | |||
293 | /** | ||
294 | * Returns the set of all matches of the pattern that conform to the given fixed values of some parameters. | ||
295 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
296 | * @return matches represented as a Match object. | ||
297 | * | ||
298 | */ | ||
299 | public Collection<OppositeDifferentClass.Match> getAllMatches(final EReference pA) { | ||
300 | return rawStreamAllMatches(new Object[]{pA}).collect(Collectors.toSet()); | ||
301 | } | ||
302 | |||
303 | /** | ||
304 | * Returns a stream of all matches of the pattern that conform to the given fixed values of some parameters. | ||
305 | * </p> | ||
306 | * <strong>NOTE</strong>: It is important not to modify the source model while the stream is being processed. | ||
307 | * If the match set of the pattern changes during processing, the contents of the stream is <strong>undefined</strong>. | ||
308 | * In such cases, either rely on {@link #getAllMatches()} or collect the results of the stream in end-user code. | ||
309 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
310 | * @return a stream of matches represented as a Match object. | ||
311 | * | ||
312 | */ | ||
313 | public Stream<OppositeDifferentClass.Match> streamAllMatches(final EReference pA) { | ||
314 | return rawStreamAllMatches(new Object[]{pA}); | ||
315 | } | ||
316 | |||
317 | /** | ||
318 | * Returns an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
319 | * Neither determinism nor randomness of selection is guaranteed. | ||
320 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
321 | * @return a match represented as a Match object, or null if no match is found. | ||
322 | * | ||
323 | */ | ||
324 | public Optional<OppositeDifferentClass.Match> getOneArbitraryMatch(final EReference pA) { | ||
325 | return rawGetOneArbitraryMatch(new Object[]{pA}); | ||
326 | } | ||
327 | |||
328 | /** | ||
329 | * Indicates whether the given combination of specified pattern parameters constitute a valid pattern match, | ||
330 | * under any possible substitution of the unspecified parameters (if any). | ||
331 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
332 | * @return true if the input is a valid (partial) match of the pattern. | ||
333 | * | ||
334 | */ | ||
335 | public boolean hasMatch(final EReference pA) { | ||
336 | return rawHasMatch(new Object[]{pA}); | ||
337 | } | ||
338 | |||
339 | /** | ||
340 | * Returns the number of all matches of the pattern that conform to the given fixed values of some parameters. | ||
341 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
342 | * @return the number of pattern matches found. | ||
343 | * | ||
344 | */ | ||
345 | public int countMatches(final EReference pA) { | ||
346 | return rawCountMatches(new Object[]{pA}); | ||
347 | } | ||
348 | |||
349 | /** | ||
350 | * Executes the given processor on an arbitrarily chosen match of the pattern that conforms to the given fixed values of some parameters. | ||
351 | * Neither determinism nor randomness of selection is guaranteed. | ||
352 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
353 | * @param processor the action that will process the selected match. | ||
354 | * @return true if the pattern has at least one match with the given parameter values, false if the processor was not invoked | ||
355 | * | ||
356 | */ | ||
357 | public boolean forOneArbitraryMatch(final EReference pA, final Consumer<? super OppositeDifferentClass.Match> processor) { | ||
358 | return rawForOneArbitraryMatch(new Object[]{pA}, processor); | ||
359 | } | ||
360 | |||
361 | /** | ||
362 | * Returns a new (partial) match. | ||
363 | * This can be used e.g. to call the matcher with a partial match. | ||
364 | * <p>The returned match will be immutable. Use {@link #newEmptyMatch()} to obtain a mutable match object. | ||
365 | * @param pA the fixed value of pattern parameter a, or null if not bound. | ||
366 | * @return the (partial) match object. | ||
367 | * | ||
368 | */ | ||
369 | public OppositeDifferentClass.Match newMatch(final EReference pA) { | ||
370 | return OppositeDifferentClass.Match.newMatch(pA); | ||
371 | } | ||
372 | |||
373 | /** | ||
374 | * Retrieve the set of values that occur in matches for a. | ||
375 | * @return the Set of all values or empty set if there are no matches | ||
376 | * | ||
377 | */ | ||
378 | protected Stream<EReference> rawStreamAllValuesOfa(final Object[] parameters) { | ||
379 | return rawStreamAllValues(POSITION_A, parameters).map(EReference.class::cast); | ||
380 | } | ||
381 | |||
382 | /** | ||
383 | * Retrieve the set of values that occur in matches for a. | ||
384 | * @return the Set of all values or empty set if there are no matches | ||
385 | * | ||
386 | */ | ||
387 | public Set<EReference> getAllValuesOfa() { | ||
388 | return rawStreamAllValuesOfa(emptyArray()).collect(Collectors.toSet()); | ||
389 | } | ||
390 | |||
391 | /** | ||
392 | * Retrieve the set of values that occur in matches for a. | ||
393 | * @return the Set of all values or empty set if there are no matches | ||
394 | * | ||
395 | */ | ||
396 | public Stream<EReference> streamAllValuesOfa() { | ||
397 | return rawStreamAllValuesOfa(emptyArray()); | ||
398 | } | ||
399 | |||
400 | @Override | ||
401 | protected OppositeDifferentClass.Match tupleToMatch(final Tuple t) { | ||
402 | try { | ||
403 | return OppositeDifferentClass.Match.newMatch((EReference) t.get(POSITION_A)); | ||
404 | } catch(ClassCastException e) { | ||
405 | LOGGER.error("Element(s) in tuple not properly typed!",e); | ||
406 | return null; | ||
407 | } | ||
408 | } | ||
409 | |||
410 | @Override | ||
411 | protected OppositeDifferentClass.Match arrayToMatch(final Object[] match) { | ||
412 | try { | ||
413 | return OppositeDifferentClass.Match.newMatch((EReference) match[POSITION_A]); | ||
414 | } catch(ClassCastException e) { | ||
415 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
416 | return null; | ||
417 | } | ||
418 | } | ||
419 | |||
420 | @Override | ||
421 | protected OppositeDifferentClass.Match arrayToMatchMutable(final Object[] match) { | ||
422 | try { | ||
423 | return OppositeDifferentClass.Match.newMutableMatch((EReference) match[POSITION_A]); | ||
424 | } catch(ClassCastException e) { | ||
425 | LOGGER.error("Element(s) in array not properly typed!",e); | ||
426 | return null; | ||
427 | } | ||
428 | } | ||
429 | |||
430 | /** | ||
431 | * @return the singleton instance of the query specification of this pattern | ||
432 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
433 | * | ||
434 | */ | ||
435 | public static IQuerySpecification<OppositeDifferentClass.Matcher> querySpecification() { | ||
436 | return OppositeDifferentClass.instance(); | ||
437 | } | ||
438 | } | ||
439 | |||
440 | private OppositeDifferentClass() { | ||
441 | super(GeneratedPQuery.INSTANCE); | ||
442 | } | ||
443 | |||
444 | /** | ||
445 | * @return the singleton instance of the query specification | ||
446 | * @throws ViatraQueryRuntimeException if the pattern definition could not be loaded | ||
447 | * | ||
448 | */ | ||
449 | public static OppositeDifferentClass instance() { | ||
450 | try{ | ||
451 | return LazyHolder.INSTANCE; | ||
452 | } catch (ExceptionInInitializerError err) { | ||
453 | throw processInitializerError(err); | ||
454 | } | ||
455 | } | ||
456 | |||
457 | @Override | ||
458 | protected OppositeDifferentClass.Matcher instantiate(final ViatraQueryEngine engine) { | ||
459 | return OppositeDifferentClass.Matcher.on(engine); | ||
460 | } | ||
461 | |||
462 | @Override | ||
463 | public OppositeDifferentClass.Matcher instantiate() { | ||
464 | return OppositeDifferentClass.Matcher.create(); | ||
465 | } | ||
466 | |||
467 | @Override | ||
468 | public OppositeDifferentClass.Match newEmptyMatch() { | ||
469 | return OppositeDifferentClass.Match.newEmptyMatch(); | ||
470 | } | ||
471 | |||
472 | @Override | ||
473 | public OppositeDifferentClass.Match newMatch(final Object... parameters) { | ||
474 | return OppositeDifferentClass.Match.newMatch((org.eclipse.emf.ecore.EReference) parameters[0]); | ||
475 | } | ||
476 | |||
477 | /** | ||
478 | * Inner class allowing the singleton instance of {@link JvmGenericType: ecore.OppositeDifferentClass (visibility: PUBLIC, simpleName: OppositeDifferentClass, identifier: ecore.OppositeDifferentClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)} to be created | ||
479 | * <b>not</b> at the class load time of the outer class, | ||
480 | * but rather at the first call to {@link JvmGenericType: ecore.OppositeDifferentClass (visibility: PUBLIC, simpleName: OppositeDifferentClass, identifier: ecore.OppositeDifferentClass, deprecated: <unset>) (abstract: false, static: false, final: true, packageName: ecore) (interface: false, strictFloatingPoint: false, anonymous: false)#instance()}. | ||
481 | * | ||
482 | * <p> This workaround is required e.g. to support recursion. | ||
483 | * | ||
484 | */ | ||
485 | private static class LazyHolder { | ||
486 | private static final OppositeDifferentClass INSTANCE = new OppositeDifferentClass(); | ||
487 | |||
488 | /** | ||
489 | * Statically initializes the query specification <b>after</b> the field {@link #INSTANCE} is assigned. | ||
490 | * This initialization order is required to support indirect recursion. | ||
491 | * | ||
492 | * <p> The static initializer is defined using a helper field to work around limitations of the code generator. | ||
493 | * | ||
494 | */ | ||
495 | private static final Object STATIC_INITIALIZER = ensureInitialized(); | ||
496 | |||
497 | public static Object ensureInitialized() { | ||
498 | INSTANCE.ensureInitializedInternal(); | ||
499 | return null; | ||
500 | } | ||
501 | } | ||
502 | |||
503 | private static class GeneratedPQuery extends BaseGeneratedEMFPQuery { | ||
504 | private static final OppositeDifferentClass.GeneratedPQuery INSTANCE = new GeneratedPQuery(); | ||
505 | |||
506 | private final PParameter parameter_a = new PParameter("a", "org.eclipse.emf.ecore.EReference", new EClassTransitiveInstancesKey((EClass)getClassifierLiteralSafe("http://www.eclipse.org/emf/2002/Ecore", "EReference")), PParameterDirection.INOUT); | ||
507 | |||
508 | private final List<PParameter> parameters = Arrays.asList(parameter_a); | ||
509 | |||
510 | private GeneratedPQuery() { | ||
511 | super(PVisibility.PUBLIC); | ||
512 | } | ||
513 | |||
514 | @Override | ||
515 | public String getFullyQualifiedName() { | ||
516 | return "ecore.oppositeDifferentClass"; | ||
517 | } | ||
518 | |||
519 | @Override | ||
520 | public List<String> getParameterNames() { | ||
521 | return Arrays.asList("a"); | ||
522 | } | ||
523 | |||
524 | @Override | ||
525 | public List<PParameter> getParameters() { | ||
526 | return parameters; | ||
527 | } | ||
528 | |||
529 | @Override | ||
530 | public Set<PBody> doGetContainedBodies() { | ||
531 | setEvaluationHints(new QueryEvaluationHint(null, QueryEvaluationHint.BackendRequirement.UNSPECIFIED)); | ||
532 | Set<PBody> bodies = new LinkedHashSet<>(); | ||
533 | { | ||
534 | PBody body = new PBody(this); | ||
535 | PVariable var_a = body.getOrCreateVariableByName("a"); | ||
536 | PVariable var_b = body.getOrCreateVariableByName("b"); | ||
537 | PVariable var_aContaining = body.getOrCreateVariableByName("aContaining"); | ||
538 | PVariable var_bTarget = body.getOrCreateVariableByName("bTarget"); | ||
539 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
540 | body.setSymbolicParameters(Arrays.<ExportedParameter>asList( | ||
541 | new ExportedParameter(body, var_a, parameter_a) | ||
542 | )); | ||
543 | // EReference.eOpposite(a,b) | ||
544 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
545 | PVariable var__virtual_0_ = body.getOrCreateVariableByName(".virtual{0}"); | ||
546 | new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_0_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference", "eOpposite"))); | ||
547 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_0_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
548 | new Equality(body, var__virtual_0_, var_b); | ||
549 | // EReference.eContainingClass(a,aContaining) | ||
550 | new TypeConstraint(body, Tuples.flatTupleOf(var_a), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
551 | PVariable var__virtual_1_ = body.getOrCreateVariableByName(".virtual{1}"); | ||
552 | new TypeConstraint(body, Tuples.flatTupleOf(var_a, var__virtual_1_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "EStructuralFeature", "eContainingClass"))); | ||
553 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_1_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClass"))); | ||
554 | new Equality(body, var__virtual_1_, var_aContaining); | ||
555 | // EReference.eType(b,bTarget) | ||
556 | new TypeConstraint(body, Tuples.flatTupleOf(var_b), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EReference"))); | ||
557 | PVariable var__virtual_2_ = body.getOrCreateVariableByName(".virtual{2}"); | ||
558 | new TypeConstraint(body, Tuples.flatTupleOf(var_b, var__virtual_2_), new EStructuralFeatureInstancesKey(getFeatureLiteral("http://www.eclipse.org/emf/2002/Ecore", "ETypedElement", "eType"))); | ||
559 | new TypeConstraint(body, Tuples.flatTupleOf(var__virtual_2_), new EClassTransitiveInstancesKey((EClass)getClassifierLiteral("http://www.eclipse.org/emf/2002/Ecore", "EClassifier"))); | ||
560 | new Equality(body, var__virtual_2_, var_bTarget); | ||
561 | // aContaining != bTarget | ||
562 | new Inequality(body, var_aContaining, var_bTarget); | ||
563 | bodies.add(body); | ||
564 | } | ||
565 | { | ||
566 | PAnnotation annotation = new PAnnotation("Constraint"); | ||
567 | annotation.addAttribute("key", Arrays.asList(new Object[] { | ||
568 | new ParameterReference("a") | ||
569 | })); | ||
570 | annotation.addAttribute("severity", "error"); | ||
571 | annotation.addAttribute("message", "error"); | ||
572 | addAnnotation(annotation); | ||
573 | } | ||
574 | return bodies; | ||
575 | } | ||
576 | } | ||
577 | } | ||
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend index ab187b3a..2add9f0e 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/Main.xtend | |||
@@ -16,11 +16,11 @@ import org.eclipse.emf.ecore.EReference | |||
16 | //import yakindumm2.impl.Yakindumm2PackageImpl | 16 | //import yakindumm2.impl.Yakindumm2PackageImpl |
17 | 17 | ||
18 | class Main { | 18 | class Main { |
19 | var static Domain d = Domain.Ecore; | 19 | var static Domain d = Domain.Yakindumm; |
20 | val static String suffix = '.ecore' | 20 | val static String suffix = '.xmi' |
21 | val static String OUTPUT_FOLDER = "Inputs/human/"; | 21 | val static String OUTPUT_FOLDER = "Inputs/yakindumm/human/humanInput100/"; |
22 | val static String INPUT_FOLDER = "outputs/human/"; | 22 | val static String INPUT_FOLDER = "outputs/Human/"; |
23 | val static int NUM_RUNS = 1; | 23 | val static int NUM_RUNS = 100; |
24 | 24 | ||
25 | static class RWInformation{ | 25 | static class RWInformation{ |
26 | public var String inputFolder; | 26 | public var String inputFolder; |
@@ -88,7 +88,9 @@ class Main { | |||
88 | } | 88 | } |
89 | 89 | ||
90 | var outputs = model.evaluateAllMetrics(); | 90 | var outputs = model.evaluateAllMetrics(); |
91 | var violationsOutput = newArrayList('violations', ViolationCheck.calculateViolationCounts(model.root, d)+''); | 91 | var violations = ViolationCheck.calculateViolationCounts(model.root, d); |
92 | println(violations); | ||
93 | var violationsOutput = newArrayList('violations', violations+''); | ||
92 | outputs.add(violationsOutput); | 94 | outputs.add(violationsOutput); |
93 | CsvFileWriter.write(outputs, fileName); | 95 | CsvFileWriter.write(outputs, fileName); |
94 | } | 96 | } |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend index b2288f52..4c9246d1 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend | |||
@@ -54,7 +54,6 @@ class PartialInterpretationMetricDistance { | |||
54 | metrics.add(new NodeActivityMetric()); | 54 | metrics.add(new NodeActivityMetric()); |
55 | metrics.add(new MultiplexParticipationCoefficientMetric()); | 55 | metrics.add(new MultiplexParticipationCoefficientMetric()); |
56 | metrics.add(new NodeTypeMetric()); | 56 | metrics.add(new NodeTypeMetric()); |
57 | metrics.add(new EdgeTypeMetric()); | ||
58 | val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); | 57 | val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); |
59 | var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); | 58 | var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); |
60 | 59 | ||
@@ -65,7 +64,6 @@ class PartialInterpretationMetricDistance { | |||
65 | //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); | 64 | //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); |
66 | var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); | 65 | var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); |
67 | distance.nodeTypeInfo = metricSamples.nodeTypeSamples; | 66 | distance.nodeTypeInfo = metricSamples.nodeTypeSamples; |
68 | distance.edgeTypeDistance = ks.edgeTypeDistance(metricSamples.edgeTypeSamples); | ||
69 | return distance; | 67 | return distance; |
70 | } | 68 | } |
71 | 69 | ||
@@ -180,7 +178,6 @@ class MetricDistanceGroup{ | |||
180 | var double outDegreeDistance; | 178 | var double outDegreeDistance; |
181 | var double nodeTypeDistance; | 179 | var double nodeTypeDistance; |
182 | protected var HashMap<String, Double> nodeTypeInfo; | 180 | protected var HashMap<String, Double> nodeTypeInfo; |
183 | public var double edgeTypeDistance; | ||
184 | 181 | ||
185 | new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ | 182 | new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ |
186 | this.mpcDistance = mpcDistance; | 183 | this.mpcDistance = mpcDistance; |
diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend index 72239e22..3c98bb1c 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/validation/ViolationCheck.xtend | |||
@@ -2,6 +2,7 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.validation | |||
2 | 2 | ||
3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain | 3 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain |
4 | import com.google.common.reflect.ClassPath | 4 | import com.google.common.reflect.ClassPath |
5 | import ecore.Ecore_pattern | ||
5 | import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns | 6 | import hu.bme.mit.inf.dslreasoner.partialsnapshot_mavo.yakindu.Patterns |
6 | import java.util.ArrayList | 7 | import java.util.ArrayList |
7 | import org.eclipse.emf.ecore.EObject | 8 | import org.eclipse.emf.ecore.EObject |
@@ -16,15 +17,13 @@ class ViolationCheck { | |||
16 | if(d == Domain.Yakindumm){ | 17 | if(d == Domain.Yakindumm){ |
17 | packageName = 'constraints.yakindumm'; | 18 | packageName = 'constraints.yakindumm'; |
18 | }else if (d == Domain.Ecore){ | 19 | }else if (d == Domain.Ecore){ |
19 | //TODO: put constraints package names for ecore and github models | 20 | packageName = 'constraints.ecore'; |
20 | return -1; | ||
21 | }else if (d == Domain.Github){ | 21 | }else if (d == Domain.Github){ |
22 | return -1; | 22 | return -1; |
23 | } | 23 | } |
24 | 24 | ||
25 | |||
26 | var constriants = loadConstraints(packageName); | 25 | var constriants = loadConstraints(packageName); |
27 | var collections = new ConstraintCollection(constriants, Patterns.instance); | 26 | var collections = new ConstraintCollection(constriants, Ecore_pattern.instance); |
28 | collections.addModel(root); | 27 | collections.addModel(root); |
29 | var results = collections.calculateViolations(); | 28 | var results = collections.calculateViolations(); |
30 | if(results.size > 0){ | 29 | if(results.size > 0){ |
@@ -54,7 +53,6 @@ class ViolationCheck { | |||
54 | 53 | ||
55 | val classPath = ClassPath.from(ClassLoader.systemClassLoader); | 54 | val classPath = ClassPath.from(ClassLoader.systemClassLoader); |
56 | val classInfos = classPath.getTopLevelClasses(packageName); | 55 | val classInfos = classPath.getTopLevelClasses(packageName); |
57 | |||
58 | for(info : classInfos){ | 56 | for(info : classInfos){ |
59 | if(info.load.interfaces.contains(IConstraintSpecification)){ | 57 | if(info.load.interfaces.contains(IConstraintSpecification)){ |
60 | //IConstraintSpecification only has one constructor with empty argument list | 58 | //IConstraintSpecification only has one constructor with empty argument list |
@@ -63,7 +61,6 @@ class ViolationCheck { | |||
63 | constraints.add(instance as IConstraintSpecification); | 61 | constraints.add(instance as IConstraintSpecification); |
64 | } | 62 | } |
65 | } | 63 | } |
66 | |||
67 | return constraints | 64 | return constraints |
68 | } | 65 | } |
69 | } | 66 | } |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.png new file mode 100644 index 00000000..560cebd4 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.png new file mode 100644 index 00000000..e3ff605c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.png new file mode 100644 index 00000000..b57ea9b4 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.png new file mode 100644 index 00000000..c3fa40e1 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.png new file mode 100644 index 00000000..d4f25912 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/ecore/Violations.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png index 3ba463f4..b4f2b9a2 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png index ed6c1c43..44da865d 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png index bfb0f1fd..fb9b86d1 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Node_Type.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png index f7349c93..49e4222a 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png index a8790329..7d131230 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/output/yakindumm/Violations.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb index bfae000e..5104cab5 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb +++ b/Metrics/Metrics-Calculation/metrics_plot/Measurements/Measurement1/src/BoxPlot.ipynb | |||
@@ -2,7 +2,7 @@ | |||
2 | "cells": [ | 2 | "cells": [ |
3 | { | 3 | { |
4 | "cell_type": "code", | 4 | "cell_type": "code", |
5 | "execution_count": 1, | 5 | "execution_count": 18, |
6 | "metadata": {}, | 6 | "metadata": {}, |
7 | "outputs": [], | 7 | "outputs": [], |
8 | "source": [ | 8 | "source": [ |
@@ -20,7 +20,7 @@ | |||
20 | }, | 20 | }, |
21 | { | 21 | { |
22 | "cell_type": "code", | 22 | "cell_type": "code", |
23 | "execution_count": 2, | 23 | "execution_count": 19, |
24 | "metadata": {}, | 24 | "metadata": {}, |
25 | "outputs": [], | 25 | "outputs": [], |
26 | "source": [ | 26 | "source": [ |
@@ -39,7 +39,7 @@ | |||
39 | }, | 39 | }, |
40 | { | 40 | { |
41 | "cell_type": "code", | 41 | "cell_type": "code", |
42 | "execution_count": 33, | 42 | "execution_count": 115, |
43 | "metadata": {}, | 43 | "metadata": {}, |
44 | "outputs": [], | 44 | "outputs": [], |
45 | "source": [ | 45 | "source": [ |
@@ -47,26 +47,27 @@ | |||
47 | "mpc_guide = getModels('../input/{}/MPC/'.format(domain), 100)\n", | 47 | "mpc_guide = getModels('../input/{}/MPC/'.format(domain), 100)\n", |
48 | "na_guide = getModels('../input/{}/NodeActivity/'.format(domain), 100)\n", | 48 | "na_guide = getModels('../input/{}/NodeActivity/'.format(domain), 100)\n", |
49 | "od_guide = getModels('../input/{}/OutDegree/'.format(domain), 100)\n", | 49 | "od_guide = getModels('../input/{}/OutDegree/'.format(domain), 100)\n", |
50 | "nt_guide = getModels('../input/{}/NodeType/'.format(domain), 100)\n", | 50 | "# nt_guide = getModels('../input/{}/NodeType/'.format(domain), 100)\n", |
51 | "composite_guide = getModels('../input/{}/Composite/'.format(domain), 100)\n", | 51 | "composite_guide = getModels('../input/{}/RealViatra/'.format(domain), 100)\n", |
52 | "composite_no_violations_guide = getModels('../input/{}/Composite_Without_Violations/'.format(domain), 100)\n", | 52 | "composite_no_violations_guide = getModels('../input/{}/Composite_Without_Violations/'.format(domain), 100)\n", |
53 | "violations_guide = getModels('../input/{}/Violations/'.format(domain), 100)\n", | 53 | "# violations_guide = getModels('../input/{}/Violations/'.format(domain), 100)\n", |
54 | "human = getModels('../input/{}/Human/'.format(domain), 304)\n", | 54 | "human = getModels('../input/{}/Human/'.format(domain), 304)\n", |
55 | "model_types = [human, composite_guide, mpc_guide, na_guide, od_guide, nt_guide, composite_no_violations_guide, violations_guide]" | 55 | "model_types = [human, composite_guide, mpc_guide, od_guide, composite_no_violations_guide, na_guide]" |
56 | ] | 56 | ] |
57 | }, | 57 | }, |
58 | { | 58 | { |
59 | "cell_type": "code", | 59 | "cell_type": "code", |
60 | "execution_count": 34, | 60 | "execution_count": 116, |
61 | "metadata": {}, | 61 | "metadata": {}, |
62 | "outputs": [], | 62 | "outputs": [], |
63 | "source": [ | 63 | "source": [ |
64 | "type_map = {'Entry': 0.04257802080554814, 'Choice': 0.1267671379034409, 'State': 0.1596092291277674, 'Transition': 0.6138636969858629, 'Statechart': 0.010136036276340358, 'Region': 0.04467858095492131, 'Exit': 0.0018338223526273673, 'FinalState': 0.0005334755934915977}" | 64 | " type_map = {'Entry': 0.04257802080554814, 'Choice': 0.1267671379034409, 'State': 0.1596092291277674, 'Transition': 0.6138636969858629, 'Statechart': 0.010136036276340358, 'Region': 0.04467858095492131, 'Exit': 0.0018338223526273673, 'FinalState': 0.0005334755934915977}\n", |
65 | "# type_map = {'EAttribute': 0.23539778449144008, 'EClass': 0.30996978851963747, 'EReference': 0.33081570996978854, 'EPackage': 0.012789526686807653, 'EAnnotation': 0.002517623363544813, 'EEnumLiteral': 0.07275931520644502, 'EEnum': 0.013645518630412891, 'EDataType': 0.004028197381671702, 'EParameter': 0.005941591137965764, 'EGenericType': 0.002014098690835851, 'EOperation': 0.009415911379657605, 'ETypeParameter': 0.0007049345417925478}" | ||
65 | ] | 66 | ] |
66 | }, | 67 | }, |
67 | { | 68 | { |
68 | "cell_type": "code", | 69 | "cell_type": "code", |
69 | "execution_count": 35, | 70 | "execution_count": 117, |
70 | "metadata": {}, | 71 | "metadata": {}, |
71 | "outputs": [], | 72 | "outputs": [], |
72 | "source": [ | 73 | "source": [ |
@@ -89,7 +90,7 @@ | |||
89 | }, | 90 | }, |
90 | { | 91 | { |
91 | "cell_type": "code", | 92 | "cell_type": "code", |
92 | "execution_count": 36, | 93 | "execution_count": 118, |
93 | "metadata": {}, | 94 | "metadata": {}, |
94 | "outputs": [], | 95 | "outputs": [], |
95 | "source": [ | 96 | "source": [ |
@@ -100,7 +101,7 @@ | |||
100 | }, | 101 | }, |
101 | { | 102 | { |
102 | "cell_type": "code", | 103 | "cell_type": "code", |
103 | "execution_count": 37, | 104 | "execution_count": 119, |
104 | "metadata": {}, | 105 | "metadata": {}, |
105 | "outputs": [], | 106 | "outputs": [], |
106 | "source": [ | 107 | "source": [ |
@@ -118,11 +119,11 @@ | |||
118 | }, | 119 | }, |
119 | { | 120 | { |
120 | "cell_type": "code", | 121 | "cell_type": "code", |
121 | "execution_count": 46, | 122 | "execution_count": 120, |
122 | "metadata": {}, | 123 | "metadata": {}, |
123 | "outputs": [], | 124 | "outputs": [], |
124 | "source": [ | 125 | "source": [ |
125 | "labels = ['human', 'combined', 'mpc', 'node activity', 'out degree', 'node type', 'combined_nv', 'violations']\n", | 126 | "labels = ['human', 'combined', 'mpc', 'out degree', 'combined_nv', 'node activity', 'node type', 'violations']\n", |
126 | "output_path = '../output/{}/'.format(domain)\n", | 127 | "output_path = '../output/{}/'.format(domain)\n", |
127 | "mkdir(output_path)" | 128 | "mkdir(output_path)" |
128 | ] | 129 | ] |
@@ -136,7 +137,7 @@ | |||
136 | }, | 137 | }, |
137 | { | 138 | { |
138 | "cell_type": "code", | 139 | "cell_type": "code", |
139 | "execution_count": 47, | 140 | "execution_count": 121, |
140 | "metadata": {}, | 141 | "metadata": {}, |
141 | "outputs": [], | 142 | "outputs": [], |
142 | "source": [ | 143 | "source": [ |
@@ -148,18 +149,26 @@ | |||
148 | " fig.set_size_inches(5, 4)\n", | 149 | " fig.set_size_inches(5, 4)\n", |
149 | " ax1.set_xticklabels(labels, rotation=45, fontsize=15)\n", | 150 | " ax1.set_xticklabels(labels, rotation=45, fontsize=15)\n", |
150 | " #plt.title(title, fontsize=20)\n", | 151 | " #plt.title(title, fontsize=20)\n", |
151 | " plt.boxplot(distances)\n", | 152 | " result = plt.boxplot(distances)\n", |
153 | " print(result['medians'][4].get_ydata())\n", | ||
152 | " plt.savefig('{}/{}.png'.format(output_path, title), dpi=500, bbox_inches=\"tight\")" | 154 | " plt.savefig('{}/{}.png'.format(output_path, title), dpi=500, bbox_inches=\"tight\")" |
153 | ] | 155 | ] |
154 | }, | 156 | }, |
155 | { | 157 | { |
156 | "cell_type": "code", | 158 | "cell_type": "code", |
157 | "execution_count": 48, | 159 | "execution_count": 122, |
158 | "metadata": {}, | 160 | "metadata": {}, |
159 | "outputs": [ | 161 | "outputs": [ |
160 | { | 162 | { |
163 | "name": "stdout", | ||
164 | "output_type": "stream", | ||
165 | "text": [ | ||
166 | "[0.03006364 0.03006364]\n" | ||
167 | ] | ||
168 | }, | ||
169 | { | ||
161 | "data": { | 170 | "data": { |
162 | "image/png": "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\n", | 171 | "image/png": "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\n", |
163 | "text/plain": [ | 172 | "text/plain": [ |
164 | "<Figure size 360x288 with 1 Axes>" | 173 | "<Figure size 360x288 with 1 Axes>" |
165 | ] | 174 | ] |
@@ -180,12 +189,19 @@ | |||
180 | }, | 189 | }, |
181 | { | 190 | { |
182 | "cell_type": "code", | 191 | "cell_type": "code", |
183 | "execution_count": 49, | 192 | "execution_count": 123, |
184 | "metadata": {}, | 193 | "metadata": {}, |
185 | "outputs": [ | 194 | "outputs": [ |
186 | { | 195 | { |
196 | "name": "stdout", | ||
197 | "output_type": "stream", | ||
198 | "text": [ | ||
199 | "[0.02142857 0.02142857]\n" | ||
200 | ] | ||
201 | }, | ||
202 | { | ||
187 | "data": { | 203 | "data": { |
188 | "image/png": "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\n", | 204 | "image/png": "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\n", |
189 | "text/plain": [ | 205 | "text/plain": [ |
190 | "<Figure size 360x288 with 1 Axes>" | 206 | "<Figure size 360x288 with 1 Axes>" |
191 | ] | 207 | ] |
@@ -206,12 +222,19 @@ | |||
206 | }, | 222 | }, |
207 | { | 223 | { |
208 | "cell_type": "code", | 224 | "cell_type": "code", |
209 | "execution_count": 50, | 225 | "execution_count": 124, |
210 | "metadata": {}, | 226 | "metadata": {}, |
211 | "outputs": [ | 227 | "outputs": [ |
212 | { | 228 | { |
229 | "name": "stdout", | ||
230 | "output_type": "stream", | ||
231 | "text": [ | ||
232 | "[0.02126645 0.02126645]\n" | ||
233 | ] | ||
234 | }, | ||
235 | { | ||
213 | "data": { | 236 | "data": { |
214 | "image/png": "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\n", | 237 | "image/png": "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\n", |
215 | "text/plain": [ | 238 | "text/plain": [ |
216 | "<Figure size 360x288 with 1 Axes>" | 239 | "<Figure size 360x288 with 1 Axes>" |
217 | ] | 240 | ] |
@@ -232,7 +255,7 @@ | |||
232 | }, | 255 | }, |
233 | { | 256 | { |
234 | "cell_type": "code", | 257 | "cell_type": "code", |
235 | "execution_count": 51, | 258 | "execution_count": 125, |
236 | "metadata": {}, | 259 | "metadata": {}, |
237 | "outputs": [], | 260 | "outputs": [], |
238 | "source": [ | 261 | "source": [ |
@@ -249,12 +272,20 @@ | |||
249 | }, | 272 | }, |
250 | { | 273 | { |
251 | "cell_type": "code", | 274 | "cell_type": "code", |
252 | "execution_count": 52, | 275 | "execution_count": 128, |
253 | "metadata": {}, | 276 | "metadata": {}, |
254 | "outputs": [ | 277 | "outputs": [ |
255 | { | 278 | { |
279 | "name": "stdout", | ||
280 | "output_type": "stream", | ||
281 | "text": [ | ||
282 | "['Choice', 'Entry', 'Exit', 'FinalState', 'Region', 'State', 'Statechart', 'Transition']\n", | ||
283 | "[0.01196101 0.01196101]\n" | ||
284 | ] | ||
285 | }, | ||
286 | { | ||
256 | "data": { | 287 | "data": { |
257 | "image/png": "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\n", | 288 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVMAAAFBCAYAAADKVUzkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO2deZgdVZn/P286G0uABIIYQiAISIeMiDSRnyIYGSHosDgjA4kLSmNGR9pRRxFtlIC2gPsM4CgSHAUTFheMuICSKBMVTRCFJM0SWSQTB5BEkCVke39/vOemqy/dye1O3a663d/P89TT956qe/s9VXW/9Z73vOccc3eEEEJsH8OKNkAIIQYDElMhhMgBiakQQuSAxFQIIXJAYiqEEDkgMRVCiBwYXrQB1eyxxx6+3377FW2GEGKQcccdd/zF3cfX6/tLJ6b77bcfS5cuLdoMIcQgw8weruf3q5kvhBA5IDEVQogckJgKIUQOSEyFECIHJKZCCJEDElMhhMgBiakQQuSAxFQIIXKgdEn7onExsz5/RpOTi8GCxFTkRm/CaGYSTTHoUTNfCCFyQGIqhBA5IDEVQogckJgKIUQO1CSmZjbDzO41s5Vmdm4P+z9oZivM7C4zu9XM9s3s22Rmv0/bgjyNF0KIsrDN3nwzawIuB14PrAKWmNkCd1+ROexOoMXdnzWz9wCfAU5L+55z95fnbLcQQpSKWjzTacBKd3/A3dcD1wInZw9w90Xu/mx6ezswMV8zhRCi3NQipnsDj2Ter0plvdEK/DjzfrSZLTWz283slH7YKIQQpaeWpP2ehrX0mIFtZm8FWoBjMsWT3H21me0PLDSzu939j1Wfmw3MBpg0aVJNhgshRJmoxTNdBeyTeT8RWF19kJn9PdAOnOTuz1fK3X11+vsA8HPgsOrPuvsV7t7i7i3jx9dtvSshhKgbtYjpEuBAM5tsZiOB04FuvfJmdhjwVUJIH8uUjzWzUen1HsCrgWzHlRBCDAq22cx3941mdjZwM9AEXOXuy83sQmCpuy8APgvsDNyQJrv4k7ufBDQDXzWzzYRwX1yVBSCEEIMCK9sEFC0tLa6lngcXmuhElAEzu8PdW+r1/RoBJYQQOSAxFUKIHJCYCiFEDkhMhRAiBySmQgiRAxJTIYTIAYmpEELkgMRUCCFyQKuTCiEGnMG4LLjEVAgx4AzGZcHVzBdCiByQmAohRA5ITIUQIgckpkIIkQMSUyGEyAGJqRBC5IDEVAghckBiKoQQOSAxFUKIHJCYCiFEDkhMhRAiBySmQgiRAxJTIYTIAYmpEELkgMRUCCFyQGIqhBA5IDEVQogckJgKIUQOSEyFECIHahJTM5thZvea2UozO7eH/R80sxVmdpeZ3Wpm+2b2nWFm96ftjDyNF8Uwbtw4zKzmDaj52HHjxhVcOyH6xzYX1DOzJuBy4PXAKmCJmS1w9xWZw+4EWtz9WTN7D/AZ4DQzGwecD7QADtyRPrs274qIgWPt2rV1W/SsP6tWClEGavFMpwEr3f0Bd18PXAucnD3A3Re5+7Pp7e3AxPT6eOCn7r4mCehPgRn5mC6EEOWhFjHdG3gk835VKuuNVuDH/fysEEI0JNts5gM9tbt6bOOZ2VuJJv0xffmsmc0GZgNMmjSpBpOEEKJc1OKZrgL2ybyfCKyuPsjM/h5oB05y9+f78ll3v8LdW9y9Zfz48bXaLoQQpaEWMV0CHGhmk81sJHA6sCB7gJkdBnyVENLHMrtuBo4zs7FmNhY4LpUJIcSgYpvNfHffaGZnEyLYBFzl7svN7EJgqbsvAD4L7AzckHpj/+TuJ7n7GjP7JCHIABe6+5q61EQIIQrE6pXi0l9aWlp86dKlRZshtoKZ1TU1qmz3pBg46nxv3eHuLXX5cjQCSgghckFiKoQQOSAxFUKIHJCYCiFEDkhMhRAiBySmQgiRAxJTIYTIAYmpEELkgMRUCCFyoJZZo8QA0p/JkQd6xJCfvwvM2bV+3y0GFePGjWPt2trng+/Lb2Ds2LGsWVOOEeoS05LRmzCWaZilXfBUfYeTzqnLV4uCGCorMwyZZv78+fOZOnUqTU1NTJ06lfnz5xdtkhBiEDEkPNP58+fT3t7O3LlzOeqoo1i8eDGtra0AzJw5s2DrhBCDgSHhmXZ0dDB37lymT5/OiBEjmD59OnPnzqWjo6No04QQg4QhMQVfU1MT69atY8SIEVvKNmzYwOjRo9m0aVOu/6telCpmqin4RB8oy/2iKfhyoLm5mcWLF3crW7x4Mc3NzQVZJIQYbAwJMW1vb6e1tZVFixaxYcMGFi1aRGtrK+3t7UWbJoQYJAyJDqhKJ1NbWxudnZ00NzfT0dGhzichRG4MiZjpYKBMscSyxMBEY1CW+0UxUyGEaAAkpkIIkQNDRkw1AkoIUU+GRAeURkAJIerNkOiAmjp1Kqeccgo33njjlt78yvtly5bl+r/qRZk6ZsrSoSAag7LcL/XugBoSnumKFSt45plnuOqqq7Z4pmeeeSYPP/xw0aY1LPWarWfs2LF1+V4h6s2QiJmOHDmStra2bmPz29raGDlyZNGmNSTu3qetL58py9yUQvSVISGm69ev57LLLus2Auqyyy5j/fr1RZsmhBgkDIlm/pQpUzjllFO6jYCaNWsWN954Y9GmCSEGCUPCM21vb2fevHlceumlrFu3jksvvZR58+ZpbL4QIjdq8kzNbAbwH0ATcKW7X1y1/2jgS8DLgNPd/duZfZuAu9PbP7n7SXkY3hc0Nl8IUW+2mRplZk3AfcDrgVXAEmCmu6/IHLMfsAvwIWBBlZg+7e4712qQxub3TCOnDDWy7WL7UWpUF9OAle7+QDLoWuBkYIuYuvtDad/mOtgohBClpxYx3Rt4JPN+FfDKPvyP0Wa2FNgIXOzu6vURYggxVJYGr0VMe8rO7ovPPsndV5vZ/sBCM7vb3f/Y7R+YzQZmA0yaNKkPXy2EKDtDZWnwWnrzVwH7ZN5PBFbX+g/cfXX6+wDwc+CwHo65wt1b3L1l/PjxtX61EEKUhlrEdAlwoJlNNrORwOnAglq+3MzGmtmo9HoP4NVkYq1CCDFY2KaYuvtG4GzgZqATuN7dl5vZhWZ2EoCZHWFmq4BTga+a2fL08WZgqZn9AVhExEwlpkKIQceQmDVqMNDI6UWNbLvYfoZKatSQGAElhBD1RmIqhBA5IDEVQogckJgKIUQOSEyFECIHJKZCCJEDElMhqtCy4KI/DImZ9oWoFS0LLvqLPFMhMnR0dDB37txuiy/OnTuXjo6Ook0TJUdiKkSGzs5OVq1a1a2Zv2rVKjo7O4s2raExs7psZVoaXM18ITJMmDCBc845h3nz5m1p5s+aNYsJEyYUbVrD0pehpI089FieqRBVmNlW3wvRE4NWTPvTZBhoxo0b1yfb+lKXcePGDXh9BgOrV6/mkksuoa2tjdGjR9PW1sYll1zC6tU1T+ErhiiDtpnfW1OhTM2ItWvX1nU2HdF3mpubmThxIsuWLdtStmjRIpqbmwu0SjQCg9YzFaI/tLe309rayqJFi9iwYQOLFi2itbWV9vb2ok0TJWfQeqZC9IdKLmlbWxudnZ00NzfT0dGhHFOxTYbc5NBlauaXZdLcelMmW0S5qfNvQpNDCyFE2ZGYCiFEDihmKoY8/cl8UNhCVCMxFUOeRkijE+VHzXwhhMgBiakQQuSAxFQIIXJAYiqEEDmgDiiRG1vrFe9tnzp4xGBBYipyQ8IohjJq5gshRA5ITIUQIgdqElMzm2Fm95rZSjM7t4f9R5vZ78xso5m9uWrfGWZ2f9rOyMtwIYQoE9sUUzNrAi4HTgCmADPNbErVYX8C3gHMq/rsOOB84JXANOB8MyvPClhCCJETtXim04CV7v6Au68HrgVOzh7g7g+5+13A5qrPHg/81N3XuPta4KfAjBzsFkKIUlGLmO4NPJJ5vyqV1cL2fFYIIRqGWsS0pwTBWnNgavqsmc02s6VmtvTxxx+v8auFEKI81CKmq4B9Mu8nArUu1VjTZ939CndvcfeW8ePH1/jVQvQdrQgr6kUtYroEONDMJpvZSOB0YEGN338zcJyZjU0dT8elMiEKobIibD22tWvXFl09USDbFFN33wicTYhgJ3C9uy83swvN7CQAMzvCzFYBpwJfNbPl6bNrgE8SgrwEuDCVCSHEoEIL6hXIUFlQr0zonJebRl5QT2PzC8TP3wXm7Fq/7xZCDBgS0wKxC56qr5c0py5fLYToAY3NF0KIHJCYCiFEDqiZL4YUilOLeiExFUMKxalFvVAzXwghckBiKoQQOSAxFUKIHJCYCiFEDqgDSgw5trYk9fYwdqwWkRjKSEzFkKIvPfkaay/6gpr5Qgwi5s+fz9SpU2lqamLq1KnMnz+/aJOGDPJMhRgkzJ8/n/b2dubOnctRRx3F4sWLaW1tBWDmzJkFWzf4kWcqxCCho6ODuXPnMn36dEaMGMH06dOZO3cuHR0dRZs2JJCYirqhJufA0tnZyVFHHdWt7KijjqKzs7Mgi4YWDS+mfVnTp6/r+mhNn/5TaXJeeumlrFu3jksvvZT29nYJah1pbm5m8eLF3coWL15Mc3NzQRYNMeq1Hk5/t8MPP9z7QlShPtTzu+v9/fW2fVsccsghvnDhwm5lCxcu9EMOOaQgi/pO0eewr8ybN88nT57sCxcu9PXr1/vChQt98uTJPm/evKJNq5k6/yaWeh21q+GXLWnkZSga2fZt0dTUxLp16xgxYsSWsg0bNjB69Gg2bdpUmF19oehz2B/mz59PR0cHnZ2dNDc3097e3lCdT1q2RIgqKk3O6dOnbylTk7P+zJw5syHEc2sDJ3rbV/YHW8PHTBudvsR7+7IVPRqnvb2d1tZWFi1axIYNG1i0aBGtra20t7cXapcoB/1pRpcdeaYF0pcbpNGanBXvqK2tbUuTs6OjoyG8JiH6g2KmBX13XymTLUMFnfPBRb1jpmrmCyFEDkhMhRAiBySmQgwiNOqsONQBJcQgQROdFIs6oAr67r5SJluGCo12zqdOncopp5zCjTfeuCWDovJ+2bJlRZtXOEraF6LODJYE8hUrVvDMM89w1VVXbfFMzzzzTB5++OGiTRsS1BQzNbMZZnavma00s3N72D/KzK5L+39jZvul8v3M7Dkz+33avpKv+UJsP4MlgXzkyJG0tbV1m4Kvra2NkSNHFm3akGCbYmpmTcDlwAnAFGCmmU2pOqwVWOvuBwBfBC7J7Puju788be/OyW4hRBXr16/nsssu6zbq7LLLLmP9+vVFmzYkqMUznQasdPcH3H09cC1wctUxJwPfSK+/DRxr9Vq1TAjRI1OmTGHWrFm0tbUxevRo2tramDVrFlOmVPs+oh7UIqZ7A49k3q9KZT0e4+4bgSeB3dO+yWZ2p5n9wsxes532CiF6ob29nXnz5nWbQ3bevHmaD2GAqKUDqicPszpo1NsxfwYmufsTZnY4cKOZHeLuT3X7sNlsYDbApEmTajBJCFGN5kMollrEdBWwT+b9RGB1L8esMrPhwK7AmjQh6/MA7n6Hmf0ROAjolvvk7lcAV0CkRvWlAn7+LjBn1758pG/fLUQD0ShT8A1GahHTJcCBZjYZ+F/gdGBW1TELgDOAXwNvBha6u5vZeEJUN5nZ/sCBwAO5WQ/YBU/VN890Tl2+WggxyNimmLr7RjM7G7gZaAKucvflZnYhsQzAAmAucLWZrQTWEIILcDRwoZltBDYB73b3NfWoiBBCFIlGQBX03X2lTLYI0YhoBJQQolf6k4Goh3J9kJgK0cD0JoxqyQw8moJPCCFyQGIqhBA5IDEVQogcUMy0ZAyW6eCEGGpITEuGhFGIxkTNfCGEyAGJqRBC5IDEVAghcmBQxEzrNQ/12LFj6/K9QojBR8OLaV87bDQyRAhRD9TMF0KIHJCYCiFEDkhMhRAiBySmQgiRAxJTIRqAcePGYWY1b0DNx44bN67g2g0OGr43X4ihwNq1a+u6ooTYfuSZCiFEDkhMhRAiBySmQgiRAxJTIYTIAYmpEELkgHrzhWgA/PxdYM6u9ftusd1ITIVoAOyCp+qaGuVz6vLVQwo184UQIgfkmQrRIGje3nIjMRWiAdC8veVHYipEA6OlwctDTTFTM5thZvea2UozO7eH/aPM7Lq0/zdmtl9m30dT+b1mdnx+pgsh3L3Pm6gP2xRTM2sCLgdOAKYAM81sStVhrcBadz8A+CJwSfrsFOB04BBgBvDl9H11pz+z6QghRH+pxTOdBqx09wfcfT1wLXBy1TEnA99Ir78NHGuhTicD17r78+7+ILAyfV/d0RNbCDGQ1CKmewOPZN6vSmU9HuPuG4Engd1r/CxmNtvMlprZ0scff7x264UQoiTUIqY9tX+r3bjejqnls7j7Fe7e4u4t48ePr8EkIYQoF7WI6Spgn8z7icDq3o4xs+HArsCaGj8rhBANTy1iugQ40Mwmm9lIokNpQdUxC4Az0us3Aws9gpALgNNTb/9k4EDgt/mYLoQQ5WGbeabuvtHMzgZuBpqAq9x9uZldCCx19wXAXOBqM1tJeKSnp88uN7PrgRXARuC97r6pTnURQojCsLL1Yre0tPjSpUuLNkMIMcgwszvcvaVe36+JToQQIgckpkIIkQOla+ab2ePAw3X8F3sAf6nj99eLRrUbGtf2RrUbGtf2etq9r7vXLfeydGJab8xsaT3jJvWiUe2GxrW9Ue2GxrW9Ue0GNfOFECIXJKZCCJEDQ1FMryjagH7SqHZD49reqHZD49reqHYPvZipEELUg6HomQohRO5ITIUQIgckpkIIkQMS0yGImY0o2gYhBhsS0yFGEtLfmNklRdsiRNGY2bD0d7iZ7bA93yUx3QpWtcpe9fsGZRRwC/ABMzuvSEMsUXldpC0DxUAtKFkUZvaPPa1gXFbcfbOZjQJ+DBwB/b8Xtzmf6VDFzJqq5171QZBH5u5Pm9mngKeBOWa22d0/PdB2mNlOwAeBR8zsW+6+YaBtGGjMbHiaH3hH4G3AJGKy9Afc/e5irdt+kmf3JuBgM/u6uz9atE214O7Pm1kzMBu4rb+/c3mmPWBmwypCambnm9mVZvY1M3vBYoCNRCVW6u5PAz8Bvgl8yszeP8B2jAF+AxwP7EDPa4UNKszMkpCOAe4APkSsSnElcKmZnVmogTng7s8B84CpwGugqxldVjIthYuBw8zsiH5/1yBwtnIl3fSeXl8PHA08COwLbADOAhalVVgbhqp6XQ3sD6wHWoCdgI+7e8cA2DEC+AEwEng38Ed335S1b7CS1kebD4wD2tx9hZntB9wAHAC8yt07i7OwdqqvV8XrTq+/DhwJvLZs3mnWzqryA4FfApe7+wX9+e5SPzUGmirB2YuIL55IeFBHAPcB1wDHpx9Gw5Cp1xzgBGAOcDLxsPgS8MkBiqHuBTQD3wLu701IB2kMdQTwUqJVcF8qeznwCuCT7t7ZKPdV5n46xMx2rxKo7wOjgdemY0qjM6l1sLOZnZWa9pXy+4EvAu82syn9/XJtVRtwEXAb0RTdPVO+M7EW1qPAG4DhRdvax3oZcaPfVFW+B9ABbAY+WGcbXp3+z6Hp/fCq/TsCI4s+V3Wo9zBgP+AZ4E2p7K3pXHw0c399ADiwaHtrrNMRxNzD9xJOx6TMvp8BSzLvrSAbm9LfUZX3wD+m834nMRfASwjxf2mqzzuyn611K80ToyyY2a7EktQTgNHu/kQqH+4Ra/wn4PfERTixUTyJjPf3JLBT6sEEwN3/AnwDeAj4XPJe8/7/lXttBfAI8J5Mh0xTOmY4cCZwWqN7pln7Uwx+s7s/BNwOnGVmrcQ5/7i7X5QOPQ54PbFUeulx9yXAR4k6XQfMNbP3pd3nAbua2QfSsQMewknx6febWYtHJ9NYYsXkZcAU4L+BvydaCtcAzwN3Af9mZiO9j4t/SkyrcPcngXOAm4BmM7sslW+sEtRVwCVEKKB0VDetMjfz3cA0onm/5Ufv7vcRHSMrgPea2R452VERlcrfdYR3Px1oTed0U7L3IOAtwF5F/PjyItXJM7mL2XP5LaKD5mtAh7t3mNkwMzuIyG54BvjdwFu9daoeDiNSRgLuPs/dzwBmEV7d581sIfBG4uH88uyDe4BtHUOEUH5rZq8j7u/RwJPufo+7/wcRq/4PokV0N5FhcShxH/Yt3FR0U6HIja248cCLgUuBB4DPZMqHp787kWnWlGnL1gs4EDgEeHGm7GbCOzwqU5+9gR8CpwK75GTHzoQHfxNwNXBSKh8H/JxoHl5BdIK9m/BwltJg4ZOezn36Id9EeDqPEeL5srTvU+m++gnhiX4k1f33mesxrOi69FK/N6d6/Q8h/jtm9o1O99qCtH9z2g4eYBv3zLw+CFhIdLb+puoaNVV97k3AV4jl6n/Q5/9b9MUp8KbICs5HgK8S8cRTgfGpfCJwWbrxP9vTZ8u2ZX+EROrTCiILYSnwpVQ+gYhpPQn8V/px3wj8L7FOTh527AB0JjG5JYnnZiLIPwoYC3w5ndvN6e8CYETZz3ENdd+RaEouAj5M5C92An8gWjXDgH8hEsXXAL8C5maEtDQPEzKxTiLWuC6J6S3pvvpm9T1DOBrTkjB9dIDtnZLO9ZEV+9O991zapm3tHBO598cCz5Ie/jX/76IvVglukGuBPxGewwKiaXIZyZPLCOq9wJeLtr0PdfxaqtfpwCnAvwIbidScyo/2s8CvU50XkzqFcvjfw9L/vRV4SSobDbwrCecXMmVjCM/0xZXrUiYx6Wf9W4F7iOZ8xQv6UKr7W6qOnUT3B3sp606EKt4DtCfBGU5kgzwDXF8tqD3dEwNk5xHA7PS68mA+iohH35IE9ZVbO9fAi4iH4Tl9+t9FX6SCb5BLgPszT6uz0w3/ENH83CuV700Eq+8k04Qo60bEgf5A9BaPTGUvI7yKa4iOtcqx44DdyK9pPzrdtN8Frs+UD0t/Z6dz/A+9fL6Uzdtt1Lm6ufhZ4O7M+7emB1m2135SdX0pqMe7hvq9lnAmVgJvq9p3QkZQs735hdaFaP0sAN6VKTsiI6hHZsr3AFoy74cRLarL+vQ/i75QBZ7s/ZKwzEzvz003/D8D/5mE5ysZQZ1QeV32jYhb/Q04Mb0/CHiCGJ2yYyo7vo7//9dJMO8CxqQySzfpjoQX/N/pfcOJZ1VdKw+JscBh6fW/ESGT4USzfjNwbto3kniI/0vRgtOHOp6SrtnTdKUNDcvU/QQiZPQ9YHKBdo7IvD4g2dwJvDNTXhHUpwlvdQrwC+C7aX8T8Hbg/4BD+vT/i75QBZ54A94JjCfSIx4Fzsrsv4NoJl9HpvOmETYiKf5Jokd1VyIud11G2I4j4sO55jPywvDJZuB9wM5Vxy0Ebiz6POVVX8Ibf5SIJe4MzCA6+G4g4oofznzmECJGem7R9vexrscT8wisAo7NlFcE9Y3pep9QsJ07Aael1/8vCfx9VYI6jfBaNwN/JFqcWSF+Cf3oOyj8Ig3QCd5qZwaRE7cUmJgpW5Quwq/LKqZbqxfRofE00QSbWxG09PC4Ov3wd8vJjp2JzIevZUUi3bDPEJ5aRchfSsQTLy36/G1nnSsiMpzokb+RTK818IX0Y/0xXfH3liSki7d1T5Zlq3pAnkB4cb8HXtfDudi3BPZ+Kp33SpL+kenaVAvqBKLV8C664tojtut/F135ATi52eD+G4mOkRdXHTMXeCjzfnciBvRqMiOgyrRV1Ws2kRt7RqbscOBHRCLyCUQM6TCief0YMCUnO3Yg4rP3EiPG1qX/u2fa//10cy8nvITbyHgCNEhTt5e6j0oPpl8DP+rhunye8FCXEbmjy9OxDZWxUCWobyR6x/8ATO/l+MJCN0T/xh/pns44rSdBrfrcdl+Lwi/UAJ7k6+jy1J4kOpv2SPsOA/5KdJq8j2iiPgrsXbTdvdQle3N/G1hLNL82E03LfdK+16Q6bSI62lakLZde+/Q/Xp5u1H2IjqxjgMcJD2ZCOuZbybavk5pgqbyUPdd9OPcTiHzKvwA/z5SPyrw+Id1rFxDx+IoX1FB170FQbyXikXWLvffFpkzZaKLz+Ldk+jiSoH4v2fyvdbGn6Is0QBf/uOQZvJ6IWf1nEpiP0+VBnUr04q8iRkK8rOg69FQnuvf+NhPe4DRiFqgTiI6mn5LpCEj1fzuRP5dLJxoxaccuRE/1d7PikOypFtQbiaD+GTSIR9ZDnbNN+13T64npAfYc8InMsb3OL1CW+hMdYRf35f7LvD4x/aZmDbDN3bx6emiaEwNV1lGV2kR0Pt1GOEu5t4gKv6B1OuHVqSrHAV/s4UbaDHwCGJvKdgImk1MssV71SWUXEmO7v033USj/LwnqLcBBdbJnDBFTvieJ+U+oGrmTBPVRorOpkgb0I8KLe3fW5kbYMvUaSQx4OJ+uls1EwutZDvz71q5bWTYiRHFR+g18rA+fywrqfgNscwvhdVbi7yOIkNF3gNOrjv0s4RQdUlXenLmWuQpq4Re1Dic8e7EvJBLub0vC00R3z64iqO0kD6psWxL47wGvyZRNSSK2GvhWprzytK4I6g/JKTaa+R/DCM/3tnTDfjedwznZY9LfI9K+L2f2/ZIYw71r0ee2D3WuPChGElMIPkrEQT8IjEv7JhHe97IqQS1tTJgIy5xHaqX14XO2tfd1tPeTZLz/VPZO0moFRCz3aOJhfwjRN9CajhtR9bnc47qFX9CcT3ZWKK9NJ/N3ROD5rxVBqjru0+kH/2FK6EkQOaJXAztVlR+bRG098M/V54DoxdxMPLW3q5cy8907EKGEr9GVU/nidJNvBs7rwY7m6vNKiuk2wkZX+tMYwtOZn+6pB4ghh9WC+j2ic2ZO0bZvpU7Z+38yEc/dDPxbX89LQfbvQIToJqb3ewH/QGRJrE6iejgx1PUBUsuz7nYVfWFzPMFZj3RMOpFHpqfvK4iOgkeAw3u4oc4nZw8upzp1a44QHvRbM/uPIZrznaQ5Mqs+dwTw0rzOL12TQDxIxrME9iRaAdWCmr0mTWV8WNVY9yYilWwpEY/bNW03pfNRLai3EQ/A0nqlyda3EB1Jt9A1Kck2x9JXXdfZ9NKrn7Ot2VF77yIGpSqj578AABeMSURBVFxBVScx4alW8ns7U5167MHP3caiL2gdTvoXiGbknXQf3nZgD4LaMD9uouf4CSK15h8z5ccSMcseBTVnGw4mZpzaDPxT1b49CQ9nI3BJ0ecr53rvnO6ni3rY90MiQ+Tf6Yqhvqj6QVi2jeiM3UTMR3o4MSXi16ofiD18Liuk703Hv7VONu5KagGl97tUhDs9vO8l1tB6QR44MXn7LUScfkB+54Vf1BxOeNbD3IEYFnoX0Su/W/aYJKi3Ea7/K4u2fRv1surXxMQZdydB/afM/oqg3kVVIL4Odk0mmlP3AzOq9u1JzAr1y7KKSH/vMSKlLBufrsx5MDY9vFcAbWRGe9XjgZbXfUV0Pt1FpglM9xbGh3r7bHrdlsT4zDqe8zcRnnMr0TJaRff4ewcRwruSrmHfwzJ13CPzuu6paIVf3BxPfiUFZzdihqS1wM96uIkOSDfRMjL5gGXZ0s2wtZFNL0s/3GpBnZ7Kbic8qbqJGTHc7tYk7NWCOjZzrhtOUHsTQCIUdD8v9Mh3J2Kk9xEdU0c0Qt2JNcAeJIUnMuWTgSVJUM/JlPckpGfV2cYpRAfnPcCfiT6C8XQf+tlBl4daEdTqpXAGpoOs6Iua00k/n2jmTknvdyGaIP9LZpLXzI98f0ow9K2qDi/IS0w3/DeJTo/T6BqWeGgvgno0AzRhdXoo3ZoeTC9I3C67mPRSp0qv/Sii6fsquua2PYjIoPgF8ObMZw4mOp0mpgf0tUXXo8a6vo3MelRV+z5HhJQ2U9WCA95PhHJaB8jOI4jBNs+RSeGi+8CIjiS4L4ihDug5Lfqi5nTC30t0DvwiI6i7EiNPVvUkqGXaiHy5/wG+lin7drqhbybyF1cRHR4Hpv0VD/V/GODE6YyNLyHiUo9W/+gabaMrFDSG8O4fSef/caKTZSQx2ut2Yiq664n4/HLgt+mz3yXTGip6o7s3uRvR7N0hU3ZTuq+OzDxIdiA6Gs8Bmqu+73hi9ODsOttdSfEzIkf8aiL2uYLM6KUqQb0QeIoCJ5Ap/IL390T3UH4GMdPT//QgqA8CtxVt+1bqNJ4YlfWX5BXsRCSGvyZzk5+dHhiL6BouegjR/LmFlMhcgO0vTbY3TGfeVuoyivA+f0Z00BwKfIy0QkA6ppnIqrg73W/Xpofh8PTZK8nE7cqwEesz/SLdKz8GPpW5736eHhofJ7zVD6f32U7ObJrba+tsa+V+35FwkvZL76emh1Un8N7M8dkm/zuKvA8Lv9DbcdL3pyq+lU5mRVAPTmW7ELOcL6fE+Y1EvuaniHzYW1I9qidkOZOID52bucEPJs1mX/TWSIJKD/Fyokl5DxF/rpzfY5OY/kvVsZb54e9ODApZwwCvd1RDPf+ZmOzm8+m+uTjZ+Z308BhFLNmzkmhK/4kBXmokY2u2dXBnemCdQ5enOjXZ3Qm8J5XtRWQhHFP0fVj4xe7nSf8k4cUdWe0BEDlof05P3INS2S4MUOLudtZrQhLUh8nkcpKJpxLT2lUWBiuN99NIG/B3hAdZ3Yw9NQlnZb6G6nXtdwNeXvWZ44lQzAPV+wquoyV7byZaO7tk9i1L99e+mbIDiFZGdhrBAc9GSOL+y8rvl66siUp/xyFJUB8iQmG/IjoGC584pvCLXuMJrvZA9yU8zWW9COpcIrh+V9k8hZ7qRffY1qQkqJuAK3o49gKi57hhhmOWbSOS7NcAV5GZv4DwTFcTy3S8pUpIjfDsrq4+98BMBniceo313Dk9mLMdNzclIT00vZ/ay2cLeVAT016uJDPJNFXZIUn0P0eELq6hJFMaDqfkmNlId1+fXu9OPKkeNrPjiaD014F3mtkSd9+UPvY4IaRridljSoeZNWXs3dPMngA2u/ufzOwrxI/3A2a23t3PBjzVvzKByPpiLG983P0LaT30fwWGm9mn3f0eovm4hhDMFxHJ6xeZ2TDCS5pB3FdPAZjZMHff7O7zC6nIVkj125l4KD+dyn5MeHYnuvsfzOwg4EIz+4y73579vCd1KoDxhLO0OmuLmVn6O8Ld7zWzdsCBDal8uLtvLMjmLYaWbiN6FF9VVXYFcbP/HzGefjQxh+YfUvlr0+d2JgT2LZTUe6O7J/rlVIdfELHdnVL5PkTKx2aiKfMjYg2ntZRwesBG2eg+LPG8dO98gzTslhDNlcS8Dm8gEtlnEL34S+iKk5YmxLI1WwgP7pl0D60EXpHKRxIrIPy6TPcT0fH3PKkDrOq3sgPRIXhg1WdKcS0KN6CnG4MIiD8KHJfK/oNomnyamAXqOSJeMiFtS4keyEXElG9PUpJOmW3UtYNohn0y2X4/0WypTDE2kWjyP0TEiA+jZPmxjbTR1ZExlmjizyO8ts1EPm+l0/IgIozUmX7YdxIJ46VoTlbVKSs204iJm2dkypqJ0XGbSSuLpgdEa/qdnF3ktehl3y3EbPn7ZMos1eUuUudT2bbCDejlZL40ndC7081xMXByZv/xRFPr+3QlVX+J6Jz5Ln1cVbCoG4jwSlsz788nepNvyAjqvkQ+4wOksd/atusajCbWMLqVWHVzWroOa6oEdQwxQc4pxEicLRNDF12HXur1TmLyj7VJOK+ha1TgdGIOgc3pd7WUyC/NxlIHzLuje07racRAgBNIObDEvKXL0z1/KjGA4iQi9exXZXqYdatX0QZs5YRXhiwuJ5r2lYB5xbs4NgnqTVmRYSsznBdcn+zaQEcSo5W+QPeJHEYROYz3EEnhFUHdp/LQ0Lbd1+HIJDhvqCpvT+XfpJeZtijhWPtk1+5EZ+z7gKOSQK1Nwjk5HbMDkZ1wCTEc9AUL4g2QrZXfb2VwxD1EGuBmYlHG5rT/cCIT4TlixNVKovVWutbBlroVbcA2TvyBdE0PNrP64gOvI5r3P6crubcU8ZOt1OkGuobqbSby/7JLflQEdRnRPNu5KFsH40aMqNkMHJDeZ0cE/Rdda1X12Mtdti3V51xiYuq9M+WvomsJm16X9C7iAZGE/XYiJLd/KltCdJZdn32YEV71CekhWO7WQdEG1HDi9yfyzh6keyyocmJnEInGE4uwrwb7sx7pmURn00wi0H4HESd9B91nvxpJxEp/W9Z6NeqWfsh/AuZmy9Lfo+lqKvc6DV2Btn8M+If02ojY50Kif+FXmeMqzejKigs/okQpgoRnvIiuyZ2/RzTp/y0J6rX0krNbhPjXXK+iDajx5Fea/Hf1IqilX0+IyC74BHBBpuxFRAzo7l4EtZTLTDfqlgRoJDGBzArgI1X730x4pe+gRM3IZPeE5L21VO2rpAhuJjNHQ+a3cWR6QPyKkmS3EHHqT6bX/0l0sE5L788jmvVXkOYdbpStcAP6cAEqsxTdTerlb5SNGHFTadZflMoqCch7pht9GbGCaGmfvI2ysY1mIDF097okqF8nOphOIdKEsgMlSiGomXtlx/R3Ot2XqjmaaM7fR88rLryGOk9O0o86NRFzZ9xFdECNSuX/QCwHsxnoKNrOPtWpaAP6eAEOIILS/wscW7Q9Ndpc+SG8jhhM8Du6guxZQf1FqlchM0A1+kZ0aEzIvN+RHhZJzJzzFxMthYfTD3dtEtNc1suq172U6vkAES7KCufr6HnFheoMktL0KRADCKo96tOJVMFXbOuhWLatcAP6cQFeSqRE7V+0Lb3Yt7X8ueOJBOobSPmimR/3XunHUMp6lXkjZmxqA/47/UBHE0n3/96Tp5855yOJDr9jiXScUndwZOx/WRLT3lZcuJuqSazLuBEDbH5EpKodkzzoXwJXZ69t0XbWulVuqoYiO8S0TGSHiJrZO4mk+92IyZ3vd/cnzewNhJj+iFga4uHMULlh7r65sAo0MGb2WiJNbjHRbF9JZIA8upXPmFf9AKqG+RZGGg5KtX2Z/S8jOmqeBD7n7t9J5a8jskGaiTSpB3v7jjJgZqcSHU+vIlIgVxGjH4sdGtoPGlJMy0j2h2lm3yEC/88QzbIRxHjvL7j7IxlBXQC0u/sDBZk9KMg8jE4iRsb9lVhSY0Ha35APqcp4czOrzK26G/EQvt/dHzezQ4kHdbWgziBikN8v0GYjWmkbM/uyzkb29/IS4gE4HFjg7ptKMda+rxTtGg+2jUhf+TORlrJ7KruUiHP9F10rWFbyHb9OAzVlyrbRfVb29xLN3yeIET//L3NcaWKF26jPBXTvBDuTmNTmPuIh8SjxIK7kyVaWsFkMnNrD9w3kyKbKtdiZGBL+U2LI7vvpctyGb8s2StLx19dtWE6aPGSpNMcyHEzkjy519ycA3L2N8JhOJZpeuPstRK7pJd5oT+AS4eHF7EgsZHe5ux9KdGJMA84zs1el4ypeUGnveTMbQ3ifp5vZZ1PxacQD+hh3340Y5LEf8A0z29fd/0BMAL0XMCd5eVuo1HsgSNdiJ2K4agsxvn53YhWMRamFsDFzfI+2eQnCLP2iaDVv5I3uCfmVtJWb6J5AnZ3YeSnRjCnc9sG0EfMxPEvM41CZTPh4Invih6T1qQjBOZce1lkvy0bkk15IeKFfJ7I8qnNL306kFH2OrpSil1Gn9etrtLvieV5MdIy9JLPvK0Qr7E3Vxw+mTTHTflIV/6lM5jyf6JG8gFgm95q0vxJHuoFYWvfYouwejCRv6HZidNMHgJvdfb2ZHUdM+LGCEKVjiXkOJnuJY6hmNoGYa/VtxAxXLe5+n5mNdvd16ZgriR7wg73Kk+upY60ONr4UeMzd11aVf4cIuZzm7hvM7J+IIaLnuPvnzWxHd3+2nrYVRWmbPGUm3awVIb2BWLBsAxHP+gkR33pXupFIQrob0eR5yMyG9RAeEDVgZsOr3o9292eAVxKxxS8Bx6eMj1uIJv9OwD8SHTUHuPvmMjb3Kza5+2oi5ng1keb1sVS+zsxGpMN/QKzKcED19wyAkI4hWmA/N7OxqazJzJqAccC6JKSziPjueUlIRwPnph78wUfRrnEjb8RiX6uJzqbssrPTiKF/ncQSKh8jcmOfpGrdIW39Ou87AWdk3leaujsSXuhK4ES6mvwvIprPL+gEKXqD7pMfZ8vomiD8eeA/M8c1EdM1rgImFWBzEzH5yIPE4pVjM/tmE1ksXySGhX4sU5+jiBbCoByYUrgBjbwRnsP3ycy+Tlfi90HEZNadhKd6C/B3Rds8GDbgI0QM7kOZsoqgjks/8juBk6makpGSDtclPOfvEaGiM+mKwWdXXPhJEqmLiBjxOQXb/Lp0b/+MrsyVgwivdT1wTSobQeS9/ir9Dhqyt36b56NoAxp1I3LiFgM/zJRZladRSV/ZicxUb9r6db6z5/VgYvWFJ7OCkvHszkni839ULX9Txi15ec/RtS78SmIpleyKCx1EK2gD0cOfXde+iImdRxITwlyZzvVNwG5p37FEDvVTRDrgt4mW2u8o8Xyk27uVLm7UQGwichoPNrOXQ8SqvHJ3m70ReIeZjXX3Z9z9uQJtbVhSHI7KeU2v7yGWr7ka+LiZnZPKK+e4iWgV3EzMzl4qeoiXH0rM9n8qkbw+jwgVXWVmY9x9FRFD/QbxwH7Y3b+bvmtY9tzUG4/4/85ENsHbCSFdSKT5/cDMdnX3W4EPE2uaHUB40d8hZobakDpkGzP9aSuoN387MLOpxJyjPwA+4e73pvLdiY6QfYBT3P2vxVnZuGSyIHYEziImhNkAfNXd/8/MJgIfJTyki4hz/hJikMTl7n5d+p5SDBGFF4z82Zs08Tmwxt3/O5XvQCxH/TZCtFrd/W9mNhnYy91/XYjxbHkQfI5YbPAkd78/dSy9gXjA/ZFY/fSv6fhuo8/KdC3yRmK6nSQP9NvEFHo3E03P6aSlSdx9WYHmNSyZIaKV5S0gRtbskF5/hFhi5EXEJCcfIjo+ngceAY70Eg+GMLMziE6kMUScd667z87sH0XUaSYxgfgZ7v5UZn9hQ2TNbD6RRzotUzaCWKdpPhEXPcPdn6iI50CkaxWNmvnbibv/kMgtXUt4ErOJppiEdDtIQtpECObfiA6aQ4mRNT8nYnFv80gjuohIjfocMa3ekcmjbSrC9p7INu3N7AhiJYUFdE1UfaKZvSOTHvU88FkiR/NI0si5CkUIaSad7BFgRGoZVOzZQAyQ+CXhpS5KIYpNaf+gFlKQZ5obqakzmhDSdYqRbj9mtgcRj5vv7hdV7buBSFqf6u6P9fDZUjYn0+QkU4hOmg+k5vt4IitkDDFc9JsVsUwe6t+5+9ICbO3xHJrZdKIHfw4xgXO2GX8V4MRv4e1lvAb1Qp5pTrj7Onf/q7uvlZDmxvNE7ugelYJM0v6HiQdXayrv1qlTxh+xme1FpGxdQ6Q+/Q3A3R8nZvp/imjavzXroVaEdCAHGlQ6icxstJlNN7NZZjbNzHZx90XENH9ziPkPJqXPNBOpUYvc/S3p86VpHdSb4ds+RIjCWE90wBxjZs3u3pmJg/6NENvh0BjNyNRpNoPolT8ieal3pX2PmdmbiPh7OxEb/mrV5wekaV+ZkCTFq39BjNzbB1gDrDSzN7n7xWbmRMrWm81sAzFJy1NE3LRic+keavVCnqkoLSlu+Akir3SOmU3J7N6L6HB6DHpMNyqU3uzxGOJ6BrFsyseJEUyeOmgeI9KjNgBPD5ixL7Rxs5mNJLJU/gq8lejou4DImf6tme3l7pcQ4YqbgOVEfPeIoeaRVlDMVJQeMzueyFO8l+jg+AvRIbWZ9OMt0LwXUJX+dDgxlHUi0UHzhLs/Y1tfcWGHokNFKe3vJ0Rc94ZUNhx4NXA54YEeXwlVVH228SZ2zgF5pqL0uPvNRG/9/cTUeicTI4WmldELygjpOwmxnEvkwC4BPmZm+7j7jwgv9A3AJWa2X+VzFSEt2NseDexC8pDTxDEbiYfZ14hk/APSvm46MhSFFOSZigYiNT1HEOPt16ayUnpBqcf7B0RT/lZiUpLPAH9PzEB/nrs/mrzuH6ayf+7J0xsAW3taC2sssTDfze5e6eQb6TG14QSiPqdVvFYhz1Q0EO6+3mNobkVIrYxCmngF8BBwnbvf5e5r3P0sYqjoScRE1hWv+03ADwoS0uEptDAs62Gmc/wJ4O1m1p7KKotYNhO5pn8eaHvLjDxTIbaTqhhpZQjsF4DT3X1CKh+VOtQws58Cu7j7K7f2XQNg97DU2bQzMWHJ7kSn3ofcfWXK8z2XWD30GuBGogOqjcglfU3Z4tVFIs9UiO2gSkhnAO8zs4OJzpsdzOwsiMyEFKaAGMG1j5ntWv19BQjpKGIymAOI+GgzcJuZneDufyEmjHkXMd3eN4llSZ4i1qQqXby6SCSmQmwHGSF9B5Ff+XLCe7ubmFPgbWZ2cjp2fRKfPYnVaitLIg8oGSEdQSzOdzfRqXca0Vv/B+AaMzsRWOsxAcuhwNHEqron+CCe/am/qJkvxHZiZscQw0HnAN9KI5oqY/CvJPJGbyEtjkck5X/Y3S8vxGC2dOZdDxxIzJM6w7uW4tmJSNuaRszI9TNPa09lPl/YRCtlRZ6pENtPC9HZdAORA1sZ176ESHj/HTF7/gIiYf/jFSEtMP1pDDHD2Q7EJNQVIR3usabWqYRnfSUxCUu35ryE9IXIMxViO0mTe7zG3Q9M77cIZOopn0QsO70P8KzHZM+Fe3dmticxH+xs4OvufnYqz84ju5AYaPDGouxsFOSZCrH9LAPGmNmroSuOmoS0mfBOd3P3+zJCakV7d2n46qcJ7/MEM/t8Kt+YBPVZ4LXE4oRiG0hMhdh+fkA0l99vZgfAFiEdSYxdn0VMAL2FskzMkuK7nybG159SJahNHrOhlXJp7LKhWaOE2E48lu44jVhddHczu45YFO9o4N+B8919eZE2bo00EuvTRO7oiRbrOJ2V7akv2otuBBQzFSInzOxVxAoAE4l5WB8ErnT3L6T9pV66w8xeBFxC2H66BLRvSEyFyBEz241o0o8hFsl7JJU3RCpRGpP/ZKVp3wg2lwWJqRB1puweaU9ISPuOxFQIIXJAPXRCCJEDElMhhMgBiakQQuSAxFQIIXJAYiqEEDkgMRVCiByQmAohRA5ITIUQIgckpkIIkQP/H4mkserR/6WNAAAAAElFTkSuQmCC\n", |
258 | "text/plain": [ | 289 | "text/plain": [ |
259 | "<Figure size 360x288 with 1 Axes>" | 290 | "<Figure size 360x288 with 1 Axes>" |
260 | ] | 291 | ] |
@@ -267,8 +298,9 @@ | |||
267 | ], | 298 | ], |
268 | "source": [ | 299 | "source": [ |
269 | "# draw node type\n", | 300 | "# draw node type\n", |
270 | "types = rep.nodeTypeStat.keys()\n", | 301 | "types = sorted(rep.nodeTypeStat.keys())\n", |
271 | "rep_type_dist = [float(rep.nodeTypeStat[key]) for key in types]\n", | 302 | "rep_type_dist = [float(rep.nodeTypeStat[key]) for key in types]\n", |
303 | "print(types)\n", | ||
272 | "node_type_types = []\n", | 304 | "node_type_types = []\n", |
273 | "for models in model_types:\n", | 305 | "for models in model_types:\n", |
274 | " type_dists = []\n", | 306 | " type_dists = []\n", |
@@ -282,12 +314,19 @@ | |||
282 | }, | 314 | }, |
283 | { | 315 | { |
284 | "cell_type": "code", | 316 | "cell_type": "code", |
285 | "execution_count": 53, | 317 | "execution_count": 112, |
286 | "metadata": {}, | 318 | "metadata": {}, |
287 | "outputs": [ | 319 | "outputs": [ |
288 | { | 320 | { |
321 | "name": "stdout", | ||
322 | "output_type": "stream", | ||
323 | "text": [ | ||
324 | "[0. 0.]\n" | ||
325 | ] | ||
326 | }, | ||
327 | { | ||
289 | "data": { | 328 | "data": { |
290 | "image/png": "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\n", | 329 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAUkAAAFBCAYAAAD62V3FAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO2de3hdVZn/P2/S9EppuZRLgQrKLZgRlcJgwUthSkDF24iAN9RABxjiZVSgBgUvBR2Fcewo/SH1Bk5UFBURpYhRLHihyAiFoDDIbUBAoEWBQmne3x/vOs3OIdltknOy90m/n+fZT3LW3uecd+29z3e/a613vcvcHSGEEIPTVLQBQghRZiSSQgiRg0RSCCFykEgKIUQOEkkhhMhBIimEEDlMGMsv23bbbX3XXXcdy68UQmwG3HDDDX9191n1+OwxFcldd92VlStXjuVXCiE2A8zs7np9tprbQgiRg0RSCCFykEgKIUQOEkkhhMhBIimEEDlIJAuku7ubtrY2mpubaWtro7u7u2iThBBVjGkIkOinu7ubrq4uli1bxsEHH8yKFSvo6OgA4Nhjjy3YOiFEBRvLfJJz5851xUkGbW1tLFmyhPnz528o6+npobOzk1WrVhVomRCNh5nd4O5z6/LZEsliaG5uZu3atbS0tGwoW7duHZMnT2b9+vUFWiZE41FPkVSfZEG0trayYsWKAWUrVqygtbW1IIuEEIMhkSyIrq4uOjo66OnpYd26dfT09NDR0UFXV1fRpgkhMmjgpiAqgzOdnZ309vbS2trK4sWLNWgjRMlQn6QQouFRn6QQQhSERFIIIXKQSAohRA4SSSGEyEEiKYQQOUgkhRAiB4mkEELkIJEUQogcNiqSZvYVM3vIzFZlyrY2s6vM7Pb0d6v6mimEEMWwKZ7k14DDq8pOB6529z2Aq9NrIYQYd2xUJN39GuDRquLXA19P/38deEON7RJCiFIw0j7J7d39AYD0d7uhDjSzhWa20sxWPvzwwyP8OiGEKIa6D9y4+wXuPtfd586aNaveXyeEEDVlpCL5oJntCJD+PlQ7k4QQojyMVCQvA45L/x8H/LA25gghRLnYlBCgbuDXwF5mdp+ZdQCfBhaY2e3AgvRaCCHGHRvNTO7uQ6XKPrTGtgghROnQjBshhMhBIimEEDlIJIUQIgeJpBBC5CCRFEKIHCSSQgiRg0RSCCFykEgKIUQOEkkhhMhBIimEEDlIJIUQIgeJpBBC5CCRFEKIHCSSQgiRg0RSCCFykEgKIUQOEkkhhMhBIimEEDlIJIUQIgeJpBBC5CCRFEKIHCSSQgiRg0RSCCFykEgKIUQOoxJJM/uAmd1iZqvMrNvMJtfKsM2B7u5u2traaG5upq2tje7u7qJNEkJUMWKRNLOdgPcCc929DWgGjqmVYeOd7u5uurq6WLJkCWvXrmXJkiV0dXVJKIUoGaNtbk8AppjZBGAqcP/oTdo8WLx4McuWLWP+/Pm0tLQwf/58li1bxuLFi4s2TQiRwdx95G82ex+wGHgKWO7ubxvkmIXAQoA5c+bsd/fdd4/4+8YTzc3NrF27lpaWlg1l69atY/Lkyaxfv75Ay4RoPMzsBnefW4/PHk1zeyvg9cBuwGxgmpm9vfo4d7/A3ee6+9xZs2aN3NJxRmtrKytWrBhQtmLFClpbWwuySAgxGKNpbv8T8Gd3f9jd1wGXAvNqY9b4p6uri46ODnp6eli3bh09PT10dHTQ1dVVtGlCiAwTRvHee4ADzWwq0dw+FFhZE6s2A4499lgAOjs76e3tpbW1lcWLF28oF0KUg9H2SX4cOBp4FrgRON7dnx7q+Llz5/rKldJRIURtqWef5Gg8Sdz9TODMGtkihBClQzNuhBAiB4mkEELkIJEUQogcJJJCCJGDRFIIIXKQSAohRA4SSSGEyEEiKYQQOUgkxbCZM2cOZrZhmzNnTtEmjXuUoLk4JJJiWMyZM4d7772XefPmcf/99zNv3jzuvfdeCWUdUYLmYhnV3O3hornbjY+ZMW/ePK699toNZQcddBDXXXcdY3kvbU60tbWxZMkS5s+fv6Gsp6eHzs5OVq1aVaBl5aGec7clkmJYmBn3338/O+6444ayBx54gNmzZ0sk64QSNG+cUibdFZsvb37zm3Nfi9qiBM3FIpEUw2KXXXbhuuuu46CDDuKBBx7Y0NTeZZddijZt3KIEzcUyqlRpYvPjnnvuYc6cOVx33XXMnj0bCOG85557CrZs/KIEzcWiPkkhRMOjPkkhhCgIiaQQQuQgkRRCiBwkkkIIkYNEUgghcpBICiFEDhJJIYTIYVQiaWYzzey7ZnabmfWa2ctqZZgQQpSB0XqS/wn81N33BvYFekdvkig77e3tNDU1YWY0NTXR3t5etEnjns7OTiZPnoyZMXnyZDo7O4s2abNhxCJpZlsCrwCWAbj7M+6+ulaGiXLS3t7O8uXLOfHEE1m9ejUnnngiy5cvl1DWkc7OTpYuXcrZZ5/NE088wdlnn83SpUsllGOFu49oA14M/A74GnAjcCEwLe89++23n4vGxsz8pJNOGlB20kknuZkVZNH4Z9KkSX7uuecOKDv33HN90qRJBVlUPoCVPkIt29g24rnbZjYX+A1wkLv/1sz+E3jc3T9addxCYCHAnDlz9rv77rtHpuaiFJgZq1evZsaMGRvK1qxZw8yZM5VPsk6YGU888QRTp07dUPbkk08ybdo0nfNEWedu3wfc5+6/Ta+/C7y0+iB3v8Dd57r73FmzZo3i60QZMDMWLVo0oGzRokWYWUEWjX8mTZrE0qVLB5QtXbqUSZMmFWTR5sWIRdLd/wLca2Z7paJDgVtrYpUoLQsWLOD888/n5JNPZs2aNZx88smcf/75LFiwoGjTxi0nnHACp512Gueddx5PPvkk5513HqeddhonnHBC0aZtHoymrU70S64EbgJ+AGyVd7z6JMcHhx12mJuZA25mfthhhxVt0rjnlFNO8UmTJjngkyZN8lNOOaVok0oFZeyTHAnKJymEqAdl7ZMUQohxj0RSCCFykEgKIUQOEkkhhMhBIimEEDlIJIUQIgeJpBBC5CCRFEKIHCSSQgiRg0SyQLq7u2lra6O5uZm2tja6u7uLNkkIUcWEog3YXOnu7qarq4tly5Zx8MEHs2LFCjo6OgA49thjC7ZOCFFBc7cLoq2tjSVLljB//vwNZT09PXR2drJq1aoCLROi8ajn3G2JZEE0Nzezdu1aWlpaNpStW7eOyZMns379+gItey4jyRU5lveVEEpwMQ5pbW1lxYoVA8pWrFhBa2trQRYNzVAppDa2T4jxgESyILq6uujo6KCnp4d169bR09NDR0cHXV1dRZsmhMiggZuCqAzOdHZ20tvbS2trK4sXL9agjRAlQ32SYsSYmZrWohSoT1IIIQpCIimEEDlIJIUQIgeJpBBC5CCRFEKIHCSSQgiRg0RSCCFyGLVImlmzmd1oZpfXwiAhhCgTtfAk3wf01uBzhBBDoNyjxTEqkTSznYHXABfWxhwhRDWV3KNLlixh7dq1LFmyhK6uLgnlGDFaT/LzwKlAXw1sEUIMwuLFi1m2bBnz58+npaWF+fPns2zZMhYvXly0aZsFIxZJM3st8JC737CR4xaa2UozW/nwww+P9OuE2Gzp7e3l4IMPHlB28MEH09urXq6xYDSe5EHA68zsLuBbwCFmdnH1Qe5+gbvPdfe5s2bNGsXXCbF50ki5R8cjIxZJd1/k7ju7+67AMcDP3f3tNbNMCAEo92jRKJ+kECVHuUeLRfkkxYhRPklRFpRPUgghCkIiKYQQOUgkhRAiB4mkEELkIJEUQogcJJJCCJGDRFIIIXKQSAohRA4SSSGEyEEiKUQD0N7eTlNTE2ZGU1MT7e3tRZu02SCRFKLktLe3s3z5ck488URWr17NiSeeyPLlyyWUY4QSXAhRcq666ipOOukkvvSlLwFs+Lt06dIizdpsUIILMWKU4GJsMDNWr17NjBkzNpStWbOGmTNn6vwnlOBCiM0YM2PRokUDyhYtWoSZFWTR5oVEUoiSs2DBAs4//3xOPvlk1qxZw8knn8z555/PggULijZts0DNbTFi1NweO9rb27nqqqtwd8yMBQsWcOWVVxZtVmmoZ3NbAzdCNAASxOJQc1sIIXKQSAohRA4SSSGEyEEiKYQQOUgkhRAiB4mkEELkIJEUQogcRiySZraLmfWYWa+Z3WJm76ulYUIIUQZGE0z+LPBBd/+9mU0HbjCzq9z91hrZJoQQhTNiT9LdH3D336f//wb0AjvVyjAhhCgDNemTNLNdgZcAv63F5wkhRFkYtUia2RbA94D3u/vjg+xfaGYrzWzlww8/PNqva2jMbFjbWLP11lsP277hHL/11luPeZ2EGC2jSnBhZi2EQH7T3S8d7Bh3vwC4ACIL0Gi+r9EZKmNOWbLpPPbYY3W1Q/kPRSMymtFtA5YBve5+Xu1MEkKI8jCa5vZBwDuAQ8zsf9L26hrZJYQQpWDEzW13XwGo/SSEGNdoxo0QQuQgkRRCiBwkkkIIkYNEsg7UM95QsYZCjC1aCKwO1DPeULGGQowt8iSFECIHiaQQQuQgkRRCiBwkkkIIkYNEUgghcpBICiFEDhJJIQpkuDG1w90UVzt6FCcpRIEoh2f5kScphBA5SCSFECIHiaQQQuQgkRRCiBwkkkIIkYNEUgghcpBICiFEDhJJIYTIQSIphBA5SCSFECIHiaQQQuQwKpE0s8PN7I9mdoeZnV4ro4QQoiyMWCTNrBn4InAEsA9wrJntUyvDhBCiDIzGkzwAuMPd73T3Z4BvAa+vjVlCCFEORiOSOwH3Zl7fl8qEEGLcMJp8koMlqntOYjwzWwgsBJgzZ84ovq5x8DO3hLNm1O+z60Q97d7w+WIADX3O62h3fP6a+n7+JmIjTfhpZi8DznL39vR6EYC7nzPUe+bOnesrV64c0fcJIcRQmNkN7j63Hp89mub29cAeZrabmU0EjgEuq41ZQghRDkbc3Hb3Z83sFOBKoBn4irvfUjPLhBCiBIxqjRt3vwK4oka2CCFE6dCMGyGEyEEiKYQQOUgkhRAiB4mkEELkIJEUQogcJJJCCJGDRFIIIXKQSAohRA4SSSGEyEEiKYQQOUgkhRAih1HN3a4r9c5VB6XJVyeEKC8lFkkJmBCieNTcFkKIHCSSQgiRg0RSCCFykEgKIUQOEkkhhMhBIimEEDlIJIUQIgeJpBBC5GDuPnZfZvYwcHedPn5b4K91+ux606i2N6rd0Li2N6rdUF/bn+fus+rxwWMqkvXEzFa6+9yi7RgJjWp7o9oNjWt7o9oNjWu7mttCCJGDRFIIIXIYTyJ5QdEGjIJGtb1R7YbGtb1R7YYGtX3c9EkKIUQ9GE+epBBC1ByJpBBC5CCRFEKIHCSS4wgzaynaBiHGGxLJcUISyN+a2WeKtkWIojGzpvR3gplNGc1nbZYiaWaW97pBmQQsBz5gZmcUaYglKv8XactYYmbNRdtQL8zsTWZ2etF2bCru3mdmk4CfAPvDyO/F8i4EVifMrNnd12fLfBzEQbn7383sU8DfgbPMrM/dzx5rO8xsGvBvwL1m9k13XzfWNhSBmU1w92fNbCrwDmAO8DvgTne/uVjrRkfyxN4I7G1mX3X3B4u2aVNw96fNrBVYCFwz0t/5ZuVJmllTRSDN7Ewzu9DMvmxmOxVt22io9EW6+9+BnwLfAD5lZu8fYzumA78F2oEpwGbhRZqZJYGcDtwAfAh4M3AhsMTM3lOogaPE3Z8C/htoA14O/c3ZspLx6j8NvMTM9h/xZ40DJ2qTSDeyp/+/A7wC+DPwPGAdcDzQ4+7PFmfl8Kmq10XA84FngLnANOCj7r54DOxoAX4ETAROBP7X3ddn7RvPmNkEoBvYGuh091vNbFfgEmB3YJ679xZn4aZRfb0qHnL6/6vAgcCryuZNZu2sKt8DuBb4ort/fCSfXeqnQa2oEpIdiP67IwmPZ3/gT8DFQHu62RuGTL3OAo4AzgJeTzwEPg98coz6KHcAWoFvArcPJZDjuI+yBdiL8OT/lMpeDLwU+KS79zbCvZW5n15oZttUCc8PgcnAq9IxpdGP5MlvYWbHpyZ2pfx24D+AE81sn5F++GazAecA1xBNwm0y5VsAVwIPAq8GJhRt6zDrZcQNfHlV+bbAYqAP+Lc623BQ+p590+sJVfunAhOLPld1qnsTsCvwBPDGVPb2dD4WZe6xDwB7FG3vJtRnfyLv6x8JZ2JOZt/PgOszr60gG5vT30mV18Cb0jm/kZgn/gJC1PdK9XlX9r2bupXmSVBvzGwGsDMwG5js7o+k8gkefXn/DPwPcXKPbISnPgzwktcA09KIHgDu/lfg68BdwOeSt1nr76/cQ7cC9wInZQYxmtMxE4D3AEePB08yW4fUz93n7ncBvwGON7MO4rx/1N3PSYceBiwAZoy1vcPF3a8HFhH1+TawzMzem3afAcwwsw+kY8e8KyX1/b7fzOZ6DM5sBVwGrAL2Ab4G/BPh1V8MPA3cBLzPzCZ61cDtRin6qTXGT58diSboM8B/ZconpL9bEDfGn4BpRds7RB2ahij/MOHJLEivLbPvknQDPQxsWyM7Kv3ZlSf6FOIB80fgXzLntCnduL8GPlz0+atBvSv1mpDqvF1m33sIj6UP+ESm/nsCK9J1GPT6FVif7H3SAkyt2v8GYgBqHfBz4JNEqNnXSV7cWNtKODrfTOf5EOBO4Gpg+8yxTcApwBXA34A/pOPfXV3vjX5v0RepTidzSHc6CeWSdGL/PVNeufmnkWlelGnL1gvYA3ghsGOm7ErCmzs4U5+dgB8DRwFb1siOLZIgXg5cBLwulW8N/CIJ5QXE4NGJ6cGzkgbrxhjq/APTU91vAh4Cvgy8KO37VLq3fkp4jqel+v9P9sFRdF0GqdubU51+RYRwTc3sm5zutcvS/r607T3GNmYfSHsm0X4G+G3V9Wmuet8bgaXAo8CPhv29RV+cOpzIrJCcBvw/or/uKGBWKt8Z+K90M392sPeWbcv+sIgQn1uJp/tK4POpfDbRZ7QGOD/9YH8A/B+xBkgt7JgC9CaBWJ5EsY/oHJ8EbAV8KZ3bvvT3MqCl7Od4E+s/lfDKewjvfWE6H38gumyaCE/6J+lHeR2wLCOQpXhQMNCDfBOwNonk8nRffaP6niEciAOS4CwaY3v3Sef5wIr96d57Km0H5J1fwvM/FHiS9FDf5O8u+mLV8cJ/C7iHeMpfRvTL/RfJ88oI5R+BLxVt+zDq+OVUr2OIptDJwLNE+Enlh/hZonl7F9HM27dG392Uvvdq4AWpbDJwQhLE8zJl0wlPckf6m0mlEIhRnoMO4DYiZrDiuXwo1f9tVcfOYeBDu3T1Jwb3TgK6kpBMIKIjngC+Uy2Ug90TY2Tn/sDC9H/lgXsw0de7PAnlP+adZ2B74gF36rC+u+iLVKcT+hng9szT5ZR0E99FNAN3SOU7EZ28N5Jx5cu6EfF2fyBGTiemshcRXsDFxIBU5ditgZnUrok9Od2MlwLfyZQ3pb8L0zl+7RDvL10TcxPrXd10+yxwc+b129NDKjuKPae6zhQ0CryRur2KcBLuAN5Rte+IjFBmR7cLrQfRWrkMOCFTtn9GKA/MlG8LzM28biJaQP81rO8s+kLV4STumgTj2PT69HQTvwX4QhKUpRmhnF35v+wb0S/0N+DI9HpP4BFiNsTUVNZex+//dRLCm4DpqczSzTeV8Fq/ll43pChW1bfyANgKeEn6/31E98UEonndB5ye9k0kHtD/UrSYbGL93pCu2d/pD49pytT7CKLr5vvAbgXa2ZL5f/dkcy9pECaVV4Ty74R3uQ/wS+DStL8ZeCfwF+CFw/r+oi9UHU6oAe8GZhFhAA8Cx2f230A0V79NZtCjETYiWHsN8BoilOTRVI+KYB1G9L/WNBaP53Zj9AHvBbaoOu7nwA+KPk+1rDPhQT9I9NdtARxODI5dQvTdfTjznhcSfZCnF23/MOrZTswxvw84NFNeEcrXpOt9RMF2TgOOTv+/LAn3n6qE8gDCy+wD/pdoIWYF9gWMoG++8Is0yhOXOwhAxHStBHbOlPWkk/vrsopkXr2IQYC/E02hZRWhSg+Fi9KPeWaN7NiCiAT4cvaHn27EJwivqiLQexF9dUuKPn81qHdFICYQI9Q/IDOSC5yXfog/ob+Pe24SyBUbuy/LsFU9+I4gvK7/AQ4Z5Dw8rwT2fiqd80rw+IHpulQL5WzCwz+B/j7jllF9d9GVH8VJy3aIv4YYUNix6phlwF2Z19sQfSwHkZlxU6atql4LgVOB4zJl+xGxX0+nm3sS8BKimfsQsE+N7JhC9H/+kZihtDZ973Zp/w/TTXsL8VS/hsyTmwZobm6k/pPSQ+fXwBWDXJtzCY9yFfD7dB5+TQON4lcJ5WuI0eI/APOHOL6wLhRi/OB/GRi2d8BgQln1vlFfh8IvVA1O3rfp96zWEIM026Z9LwFWE4MN7yWaig8COxVt9xB1yd603wUeI5pBfUTzbpe07+WpTuuJAapb01aTUez0HS9ON+AuxADQK4lg9F8Cs9MxlYDer5KaQqm8dKO4Izj/s4mYwL8Cv8iUT8r8f0S63z5O9HlXPJeGqf8gQnk10d9Xt77t4diUKZtMDLr+jswYQhLK7yebT66LPUVfpFFe1MPSU3wB0R/0hSQcH6Xf4zmKGNW+D7iZFPRbpo00+JF53Up4bwcQWX2OIAZoriLTgZ7q/04i/qsmg0/ErIstiVHbS7M/+GRPtVD+gOgMP44G8J5y6p1tYs9I/++cHk5PAR/LHDvkHPQynANi8OjTw7n/Mv8fmX5Tbx1jmwd44AzSRCYmUKylKoSHGLS5hnCCat6CKfRijuBEVodjHAb8xyA3SB/wMWCrVDYN2I0a9dXVqz6p7BPElK/vMnDWw8uSUC4H9qyTPdOJPtvbkkj/lKpZIkkoHyQGaSqhLlcQHteJVE1ra4QtU7eJRDD+mfS3RnYmPJVbgA/mXbsybEQ3wTnpN/CRYbwvK5S7jrHNcwkvsdK/3UJ03XwPOKbq2M8Szs4Lq8pbM9expkJZ+EUd4UX8BBEIfk0SlGYGemIVoewieTxl25Jwfx94eaZsnyRO9wPfzJRXnq4VofwxNep7zHxHE+GpXpNuxEvTOTwre0z6u3/a96XMvmuJecszij63w6x35SEwkUj39iDRz/hvwNZp3xzCY15VJZSl7HclukfOILWqhvE+y3tdR3s/ScZTT2XvJmV2J/pKX0E8xF9I9L13pONaqt5X837Twi/oJp7ErAB+K52k3xMdtqsrQlN13Nnph/xhSvjUJ2IcL6IqkQbRdL6KmJP6lupzQIzq9RFP2VGN2mU+ewrRpP8y/fGAO6abtw84YxA7WqvPK6nPtFE2+sN8phPeSXe6r+4kpq9VC+X3iYGNs4q2fYj6ZO//3Yi+0j7gfcM9JwXZP4XoKts5vd4BeC0RMXB/Esv9iCmTd5JainW3q+gLO5yLlm7mbyShmEkkNP0VMcq43yA3ypnU2OOqUZ0GNAsIj/ftmf2vJJrVvaT8hFXv2x/Yq1bnl/7J/38m4wkC2xFee7VQZq9JcxkfQsOofzMRNrWS6POakbbL0zmpFspriIdbKb3IZOfbiAGY5fQno9joXOuq67qQIUa5a2xrdpbYCcRkiQuoGlwlPMtKbGovmYw+dbex6As6jJN5HtGcu5GB06T2GEQoG+ZHS4yiPkKEj7wpU34o0Sc4qFDW2Ia9iQxCfcA/V+3bjvBIngU+U/T5qkPdt0j31DmD7PsxETXxQfr7KLevfsiVaSMGMdcT+SD3A+YTLYQBD7pB3pcVyH9Nx7+9TjbOILVY0ustK4KcHsp/JNKzPSeOmUiKvZzoBx+T33nhFzXnRGY9winE9MKbiFHqmdljklBeQ7jg/1i07Rupl1X/TyRLuDkJ5T9n9leE8iaqOrDrYNduRLPmduDwqn3bEVl+ri2jMIz2PiPCp7J9wJV58VulB/OtQCeZGUb1eFjV4r4iBm1uItMUZWCL4ENDvTf935lE9j11PN9vJDzdDqIlcx8D+7cXE11pF9I/fbgpU8dtM//XPdyq8Iu7CSe1Emoyk8h48xjws0Fujt3TzbGKMU4GOoybI28mzYvSj7FaKOenst8QXk/dRIqYtnV1Euxqodwqc64bUiiHEjaiW+Z2nutFb0P0Qf6JGNDZv+z1J9Y4+jOpiyBTvhtwfRLKUzPlgwnk8XW2cR9iYPA24AGiD34WA6cQLqbfo6wIZfWSIGMzsFT0Rd3IyTyTaG7uk15vSTQF/o9M8szMj/f5lGAKVVUdnhNTl27kbxADBUfTP7Vt3yGE8hWMUSLg9LC5Oj1wnhNQXGaB2Ei9KqPYk4hm6Dz684vuSUQV/BJ4c+Y9exODNTunh++3iq7HJtTzHWTW2qna9zmia6ePqhYX8H6iS6VjjOzcn5gE8hSZUCUGBusvTkL6nD7KMT2nRV/UjZzIfyU61H+ZEcoZxCyH+wYTyjJtRLzXr4AvZ8q+m27UK4nYu/uIQYI90v6KR/krxjigN2PjC4h+nwerf0yNuNHfLTOd8MjvTdfgYWKAYiIxw+g3RNqw7xB94LcAv0vvvZRMC6bg+mS9v5lE83NKpuzydF8dmHk4TCEG6E4FWqs+r52YrbawznZXQtmMiHG+iOhbvJXMbJkqofwE8DgFJg0p/IJXn8BByo8jMvf8ahCh/DNwTdG259RpFjEL6K/pKT6NCFZ+eebmPSU9CHron3b4QqIZspwUYFuA7Xsl2xtmEGwj9ZlEeIs/IwY39gU+Qsqqno5pJSINbk733LfSg25Ceu+FZPrGit6AtxIOxANEso1PZe67X6QHwUcJ7/LD6XV2cDAbzvWqOttaud+nEs7Prul1W3oA9QL/mjk+2/R+V5H3YeEXepCT+Xyq+o7SSaoI5d6pbEsiI/QtlDg+j4g3/BQRz7k81aM6Ecd7iP6X0zM37t6k7N9Fb40mlAzSJ000724j+ngr5/jQJJL/UnWsZX7U2xATFh5ljNd02Ugd30IkOTk33TefTjZ+Lz0QJhFLl9xBNGnvYYyXXMjYmvXkb0wPodeAblcAABMwSURBVFPp9yzbkt29wEmpbAdiVP6VRd+HhV/sqpP5ScLrOrD6aU3EUD2QnpB7prItGaOA0lHWa3YSyrvJxCKS6a8k0o9VFjQqhafSiBvwD4THV92kPCoJYmVOf/W62DOBF1e9p53oFrmzel+B9bNk65VE62TLzL5V6f56XqZsd6JVkE31NuYj80m0r638fumPIKiMJ7wwCeVdRJfUdcRgWuHJQoq+4NUe4/MIz3DVEEK5jOiUvqlMT/Wh6sXAvqM5SSjXAxcMcuzHiVHUhprWV7aNCP5+FPgKmTnuhCd5P7FkwduqBNIIb+yi6vMPHMsYz2XehDpukR642QGPy5NA7ptetw3x3kIewER6wjvIJO+lKloiifnniC6EiylJ2rkJFERaJPyZ9P82xJPlbjNrJzpzvwq828yu9/7FxB8mBPIxIhtI6TCz5oy925nZI0Cfu99jZkuJH+QHzOwZdz8F8FT/SuKIZ4qxfHzg7ueZmRHhYhPM7Gx3v41oyj1KCOH2RGD1OWZWWRf7cOLeehzAzJrcvc/duwupyBCkum1BPGz/nsp+QnhiR7r7H8xsT+ATZvbv7v6b7Ps9qU4BzCKcoPuztpiZpb8t7v5HM+sCHFiXyie4+7MF2bzB0LF8mkwB5lWVXUDcwH8h5ltPJnIY/iGVvyq9bwtCON9GSb0tBnqOX0p1+CXRdzotle9ChDb0EU2KK4g1ah6jhGncGmlj4BS3M9L983XSFE5CDO8g5v6/mgiyPpwY1b6e/n7IUnR35NlBeFxPpHvoDuClqXwikTH+12W6n4jBsqdJA0dVv5UpxCDaHlXvKcd1GMsLTnQkPwgclsr+k2ginE1k9XmK6I+YnbaVxIhcD5Gaaw0lGczYSF0XE82hTybbbyeaD5VUUDsTTe+7iD7Yl1Cy+M5G2+gfBNiKaGr/N+Fp9RExqZUBvz2JLp3e9KO9kQhmLkXTLlOfrIgcQCTEPTxT1krMxuojrXSYRL8j/U5OKfI6DLFvOZFdfJdMmaW63EQatCnbNtYncK90om5OF/3TwOsz+9uJ5s4P6Q/0/TwxqHEpw1zlrKgbg/AiOzKvzyRGVi/JCOXziFi8O0nzgrWN+jpMJtZpuZpYCfCAdC0erRLK6URylDcQsz82JNwtug6D1OndRNKHx5IgXkz/LLT5xPzyvvS7WknER2b7KsfMG2NgTObRRID6EaQYTiJv5C3pnj+KCOp/HRFedV1ZHlDPqVcBF70y9e0Woold6WiueAKHJqG8PCse5GSDLvQEDlz35EBidsx5DJzAP4mIv7uNCFSuCOUulYeBtppciwOTmLy6qrwrlX+DIbInUbK52MmmbYhBzPcCByfheSwJ4m7pmCnESP1niGmFz1nIa4xsrfx+KwH7txHhbn3EYnKtaf9+xMj8U8QMnzuI1lapPPkBdSvo4u9BfxqnY6svKnAI0cz+Bf1Bp6Xon8ip0yX0T/nqI+LXsksfVIRyFdFM2qIoW8frRszi6AN2T6+zs1DOp389nkFHfsu0pbqcTiT73SlTPo/+pTyGXDq4CNFPgv0bomvs+ansemKQ6TvZBxThBR+RHmyl9eTdCwwBIoLGryX6JLN9LZUTdjgRALtzEfZtgv1ZD/I9xCDNsUQH9Q1EP+S7GJjNaCLRF/m7starkbf0I70HWJYtS39fQX+zdciUYQXZ/RHgtel/I/oWf07031+XOa7SnK1kqL+CEoXCEZ5sD/1Jc79PNK3fl4TyWwwRb1qEqG9yvQo+qZWm901DCGXp10shRts/Bnw8U7Y90cdy8xBCWcrlbBt5S+IykUgecitwWtX+NxNe5LsoSZMu2Tw7eVtzq/ZVQuH6yMzhz/w2Dkyifx0lifYg+oA/mf7/AjEweUB6fQbRvL6AlPe1UbbiDejPOnMzadS7UTZidkeleX1OKqsExm6XbuBVxIqGpX1SNtLGRppkxDTQbyeh/CoxMPMGIiQmG8RfuFBm7pWp6e98Bi7Z8QqiWf0nBs9Q/3LqnJRiBHVqJnIr3EQM3ExK5a8llsToAxYXbeew6lS0AekE7k505v4fcGjR9myizZUb/BAiyP339HdOZ4Xyl6lehWT0GQ8bMRgwO/N6KoMs8JY57zsS3v3d6Uf5WBLJmqwJVI97KdXxTqLbJiuIhzB4hvrqiIrS9NkTge3VHvAxREjcSzf2oCvbVrgBmZO4FxH68/yibRnCvrz4r3YisPcSUrxj5ge7Q7rJS1mvsm9EBp5O4GvpxzeZCAb/4GDeeea8TyQGyw4lQk9KPTiQbHtREsmhMtTfTFVi4DJuxMSPK4hwrFcmj/da4KLsdS3azk3dKjdUKchOVSwT2amGZvZuIhh8JpE093Z3X2NmryZE8goiRf7dmSlXTe7eV1gFGhwzexUREraCaD7fQURFPJjzHvOqm7tqymghpGmFVNuW2f8iYoBjDfA5d/9eKj+EiI5oJcKB/jzUZ5QBMzuKGLCZR4T63UfMtit2iuEIKJVIlpHsj83Mvkd0mD9BNI9aiLnA57n7vRmhvAzocvc7CzJ73JB50LyOmI21mlhe4LK0v+EeQJX5yGZWyWs5k3i43u7uD5vZvsQDuFooDyf6+H5YoM1GtKqezezLOhHZ38sLiIfaBOAyd19firnYw6VoV7ZRNiJM4wEi/GKbVLaE6Ec6n/7V9Cqxel+lgZoUZdwYmMn6X4mm6CPELJOXZY4rTX9cTl0+zsCBo/cQyUwqa8c/SDxgKzGelaU8VgBHDfJ5YzmTpnIdtiCmFl9FTPt8P/2O1oSN2UYJBstGsjXVSGvHHZVmUYa9ifjHle7+CIC7dxLezVFEEwh3X07ESn7GG+2JWTI8PI+pxAJcX3T3fYkBgAOAM8xsXjqu4rmU8n42s+mEt3iMmX02FR9NPHhf6e4zickHuwJfN7PnufsfiMS6OwBnJa9sA5U6jwXpOkwjpj3OJeZfb0OsGtCTvPlnM8cPapsX3NUxYopW6TJuDAwUr4RnXM7AwN5swtyVRHOicNvH20bM2X+SmOtfSdTaTkQU/Ji0Bg8hJqczyFrNZdiIeMhPEF7jV4moh+rYyHcSoTOfoz905kXUaf3rTbS74il+mhhQekFm31Ki1fTG6uPH06Y+ySqq+lcqSXK7iRG6jxPLcV6c9lf6aS4hlvA8tCi7xyvJg/kNMZvmA8CV7v6MmR1GJHu4lRCcQ4m58Lt5SfsozWw2kefyHUS2ornu/iczm+zua9MxFxIjwnt7lec12GBUHWzcC3jI3R+rKv8e0e1xtLuvM7N/JqYanuru55rZVHd/sp62FUUpmydFkW7CikBeQiy0tI7oL/op0X90QrpBSAI5k2h63GVmTYM008UmYmYTql5PdvcngH8k+u8+D7SnKIjlRNN7GvAmYpBjd3fvK1uzu2KPu99P9OldRIQyfSSVrzWzlnT4j4gs9rtXf84YCOR0osX0CzPbKpU1m1kzsDWwNgnkW4n+0zOSQE4GTk8j2uOPol3ZMm7EIkX3E4M02eUtDyCmkPUSS0l8hIjtXEPVmiraRnzupwHHZV5Xmp1TCa/xDuBI+pve2xNN2ecMIBRcjwFJZbNl9Cdefhr4Qua4ZiKt3n2M0TrrVTY3E0kn/kwsurdVZt9CIqrjP4jphR/J1OdgwpsflxMmCjegjBvxpP8hmUzV9Acj70kkCe4lPMvlwD8UbfN42YDTiH6uD2XKKkK5dfoB3wi8nqr0eZRw6ifh5X6f6LJ5D/193NkM9T9N4nMO0f96asE2H5Lu7Z/RH8mxJ+FlPgNcnMpaiLjN69LvoCFHrzd6Poo2oGwbEdO1AvhxpsyqPINKmMY0Mum4tI34nGfP7d5Exvo1WbHIeGOnJmH5C1VLgZRtS17ZU/SvK30HsZxENkP9YqLVso4Y8c6ui11EwtyJRBKQC9N5vhyYmfYdSsQAP06EvX2XaFn9nhLngxztVqq+m5KwnojH29vMXgzRF+SVu9bsNcC7zGwrd3/C3Z8q0NaGJvV1UTm36f/biKU8LgI+amanpvLKeW4mPPkriYzWpWGQ/uh9iczoRxFB1f9NdNl8xcymu/t9RB/l14kH8d3ufmn6rKbseak3Hv3rWxCj6+8kBPLnRDjbj8xshrtfDXyYWLNpd8Lr/R6R6WddGshszDCfPIpW6TJuxGLpTxLZZLKJQrchfry/ID1dtY34HFc8l6lE5u1PEf1xO6TynYEvEv1gZxCBzPsC1xAjrJXPKYXnwkBveCciyca/Ae/KlE9h8Az1u5EJji/KfiJWs5eUzJcYXHoT4en+KnvP89zloEtxHeqxKQRoCJLH+F0i1dmVRPNvPmmJBndfVaB5DU1mqmEl1T+ECE5J/59GLLWwPZHc4kOEWD4N3Asc6CUN1Dez4wixn070oS5z94WZ/ZOI+hxLJGY+zt0fz+wvbJqlmXUTcZAHZMpaiHVouol+x+Pc/ZFKqNxYhCUVjZrbQ+DuPyZiIx8j4toWEk9bCeQoSQLZTAjh3whvZV9iNscviP6ud3iEzJxDhAB9jkh/dqBH07C5CNuryTaxzWx/wiO+jP7kv0ea2bsyYUBPA58lPMkDSTO1KhQhkJmQqXuBFjPbOWPPOiJo/1piGd6e1FWwPu0f1wIJSnCxUVIM2GRCINe6+iBrgpltS/R5dbv7OVX7LiECqtvc/aFB3lt4Np9qUlKKfYjBjQ+4+9/MbBYRJTGdaMp+oyKCyaP8B3dfWYCtg54/M5tPjGifRSTG7cvs+wrgxG/hnWU7//VEnuRGcPe17r7a3R+TQNaUp4n+yG0rBZlg8g8TD6WOVD5gQKRsP1Az24EIS7qYCPH5G4C7P0xkRX+caGK/PetRVgRyLIPfK4MrZjbZzOab2VvN7AAz29Lde4g+07OIufFz0ntaiRCgHnd/W3p/KTz5sWDCxg8Roi48Q4ykvtLMWt29N9PP+DdCRCdA+Zt07v6XlMbs68D+yau8Ke17yMzeSPRvdxH9rv+v6v1j0sSuJKJIfcG/JAYidyHWJb/DzN7o7p82MydCk95sZuuI5ByPE/2SFZtL9aCqJ/IkRSGkvrmPEXGRZ5nZPpndOxADNQ/BoKE1hTGULR7TJI8jRrU/SsyY8TSw8RARBrQO+PuYGftcG/vMbCIx9XE1sV739kROgmnA78xsB3f/DNFtcDlwC9F/uv/m5kFWUJ+kKBQzaydi7f5IDA78lRjI6SP9MAs0bwDZkVwz24+YDrkzMbDxiLs/YfkZ6qcU3WVjZm3EDJ8PuPslqWwCcBARcvU40F7pMqh6b+MlzK0B8iRFobj7lcTo9e1ECrTXE7F6B5TNc8kI5LsJEVxGJN24HviIme3i7lcQXuOrgc+Y2a6V91UEsmDPeDKwJcmjTclCniUeUF8mgsR3T/sG6MPmKJAgT1KUhNQMbCHmYz+WykrnuaQR4B8RTeqriWQU/w78E5Gx+wx3fzB5yD9OZW8ZzDMbA1sHW+dnK2JBsSvdvTIwNtEj/dxsoj5HV7xMIU9SlAR3f8ZjmmdFIK1sApl4KXAX8G13v8ndH3X344kph68jkgNXPOQ3Aj8qSCAnpCZ+U9YjTOf3Y8A7zawrlVUW32slYiUfGGt7y4w8SSGGoKoPspJg+TzgGHefnconpUEozOwqYEt3/8e8zxoDu5vSIM0WRKKKbYiBsA+5+x0pRvV0YjXDi4EfEAM3nUQs5MvL1BdcNPIkhRiEKoE8HHivme1NDHpMMbPjIUbpU1cBxGyhXcxsRvXnFSCQk4gEILsT/Y+twDVmdoS7/5VIEnICkRbtG8TyDI8Ta+6Uqi+4aCSSQgxCRiDfRcQHvpjwtm4m5pu/w8xen459JonKdsTqmZWlV8eUjEC2EIuK3UwMhB1NjF7/AbjYzI4EHnP3rxHTQV9BrPJ5hI/nbD4jRM1tIYbAzF5JTCs8C/hmmkFTmaN9IRH3uJy0qBcRLP5hd/9iIQazYQDsO8AeRPaew71/SZJpRHjSAUTOyJ95Wlsn8/6GW8e83siTFGJo5hKDNJcQ8ZuVec/XE4HYvyeyjV9GBJJ/tCKQBYb5TCcyVk0hUrFVBHKCx3pBRxGe8IVE8o0BzWoJ5HORJynEEKSkDi939z3S6w3Cl0aO5xBL2+4CPOmRRLdwb8zMtgMWEZmrvurup6TyyuDTVCK5yCPu/pqi7GwU5EkKMTSrgOlmdhD091MmgWwlvMmZ7v6njEBa0d5YmgZ5NuEtHmFm56byZ5NQPgm8ilhQTWwEiaQQQ/Mjotn6fjPbHTYI5ERibvNbicS6GyhLMo7Uf3o2Mf/6DVVC2eyR3ap0y++WEWUBEmII3P12MzuaWO1wGzP7NrGY1yuADwJnuvstRdqYR5r5czYR+3ikxTo1x2dHrov2ehsB9UkKsRHMbB6RLX1nIgfmn4EL3f28tL/USxiY2fbAZwjbj5EwDg+JpBCbgJnNJJrW04FH3f3eVN4QITNpzvaaShO7EWwuCxJJIUZI2T3IwZBADh+JpBBC5KCRLSGEyEEiKYQQOUgkhRAiB4mkEELkIJEUQogcJJJCCJGDRFIIIXKQSAohRA4SSSGEyOH/AxQVXTpu+6WzAAAAAElFTkSuQmCC\n", |
291 | "text/plain": [ | 330 | "text/plain": [ |
292 | "<Figure size 360x288 with 1 Axes>" | 331 | "<Figure size 360x288 with 1 Axes>" |
293 | ] | 332 | ] |
@@ -312,6 +351,13 @@ | |||
312 | "metadata": {}, | 351 | "metadata": {}, |
313 | "outputs": [], | 352 | "outputs": [], |
314 | "source": [] | 353 | "source": [] |
354 | }, | ||
355 | { | ||
356 | "cell_type": "code", | ||
357 | "execution_count": null, | ||
358 | "metadata": {}, | ||
359 | "outputs": [], | ||
360 | "source": [] | ||
315 | } | 361 | } |
316 | ], | 362 | ], |
317 | "metadata": { | 363 | "metadata": { |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png deleted file mode 100644 index b76e1162..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png deleted file mode 100644 index 7c1e381e..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png deleted file mode 100644 index b6c865a8..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png deleted file mode 100644 index e734a9c2..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png deleted file mode 100644 index a4f9033f..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png deleted file mode 100644 index 343550b4..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-No-Annotations-Viatra (75 nodes)-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png deleted file mode 100644 index 8795605d..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png deleted file mode 100644 index 5abfa423..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png deleted file mode 100644 index e21d38f8..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-50-500-Viatra (75 nodes)-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png new file mode 100644 index 00000000..b52aa827 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png new file mode 100644 index 00000000..6adb45e2 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png new file mode 100644 index 00000000..e257f381 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png new file mode 100644 index 00000000..2672ee2c --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png new file mode 100644 index 00000000..33adbfe9 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png new file mode 100644 index 00000000..d64df78b --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png new file mode 100644 index 00000000..eb245365 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Node_Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png new file mode 100644 index 00000000..2c8f53f6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png new file mode 100644 index 00000000..86b7c3a0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-BaseViatra-RealViatra-Random-rep-/Out_Degree_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.png new file mode 100644 index 00000000..81085eab --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types_lengend.png new file mode 100644 index 00000000..e92f1b26 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Node Types_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.png new file mode 100644 index 00000000..25b35ee7 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree_lengend.png new file mode 100644 index 00000000..d2c660c0 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-Alloy-rep-/Out_Degree_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.png new file mode 100644 index 00000000..52b5e5f6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.png new file mode 100644 index 00000000..9e8289a8 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/MPC_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.png new file mode 100644 index 00000000..e8a3093f --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.png new file mode 100644 index 00000000..24a6fee6 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Node Activity_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.png new file mode 100644 index 00000000..7c5c9251 --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.png new file mode 100644 index 00000000..87845cef --- /dev/null +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human-BaseViatra-RealViatra-rep-/Out Degree_lengend.png | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png deleted file mode 100644 index da20de14..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png deleted file mode 100644 index 0c60d130..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png deleted file mode 100644 index e2cadbc5..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/Human_anno-Human_No_anno-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png deleted file mode 100644 index ccd02aca..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/MPC.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png deleted file mode 100644 index 1edf0945..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Node Activity.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png b/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png deleted file mode 100644 index 1e70734b..00000000 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/output/human_no_xml-human_xml-/Out Degree.png +++ /dev/null | |||
Binary files differ | |||
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py index eb9d4ae2..02f28546 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py +++ b/Metrics/Metrics-Calculation/metrics_plot/model comparison/src/plot_ks_stats.py | |||
@@ -12,36 +12,45 @@ import DistributionMetrics as metrics | |||
12 | 12 | ||
13 | def main(): | 13 | def main(): |
14 | # read models | 14 | # read models |
15 | human = GraphCollection('../input/human_30_500_no_xml/', 500, 'human_no_xml') | 15 | alloy = GraphCollection('../input/measurement2/yakindu/Alloy/', 100, 'Alloy') |
16 | human2 = GraphCollection('../input/human_30_500_xml/', 500, 'human_xml') | 16 | human = GraphCollection('../input/measurement2/yakindu/Human/', 304, 'Human') |
17 | # human_na = GraphCollection('../input/human_models_50_500/na_rep/', 1, 'Human rep') | 17 | base = GraphCollection('../input/measurement2/yakindu/BaseViatra/', 100, 'BaseViatra') |
18 | # human_mpc = GraphCollection('../input/human_models_50_500/mpc_rep/', 1, 'Human rep') | 18 | real = GraphCollection('../input/measurement2/yakindu/RealViatra/', 100, 'RealViatra') |
19 | # human_od = GraphCollection('../input/human_models_50_500/od_rep/', 1, 'Human rep') | 19 | random = GraphCollection('../input/measurement2/yakindu/Random/', 100, 'Random') |
20 | 20 | na_rep = GraphCollection('../input/measurement2/yakindu/Human/na_rep/', 1, 'rep') | |
21 | # viatra75 = GraphCollection('../input/viatra_75/', 500, 'Viatra (75 nodes)') | 21 | mpc_rep = GraphCollection('../input/measurement2/yakindu/Human/mpc_rep/', 1, 'rep') |
22 | # viatra30 = GraphCollection('../input/viatraOutput30/', 500,'Viatra (30 nodes)') | 22 | od_rep = GraphCollection('../input/measurement2/yakindu/Human/od_rep/', 1, 'rep') |
23 | # viatra60 = GraphCollection('../input/viatraOutput60/', 500, 'Viatra (60 nodes)') | 23 | |
24 | # viatra100 = GraphCollection('../input/viatraOutput100/', 500, 'Viatra (100 nodes)') | 24 | # a hack to make the node type as the same as an exiting model |
25 | # viatra100R = GraphCollection('../input/realisticViatraOutput_newMetric/', 500, 'Realistic Viatra (100 nodes)') | 25 | type_rep = GraphCollection('../input/measurement2/yakindu/Human/od_rep/', 1, 'rep') |
26 | # viatra100C = GraphCollection('../input/yakindumm/viatraOutput100C/', 500, 'Viatra consistent (100 nodes)') | 26 | type_rep.nts = [{'Entry': 0.04257802080554814, 'Choice': 0.1267671379034409, 'State': 0.1596092291277674, 'Transition': 0.6138636969858629, 'Statechart': 0.010136036276340358, 'Region': 0.04467858095492131, 'Exit': 0.0018338223526273673, 'FinalState': 0.0005334755934915977}] |
27 | # viatra100EE = GraphCollection('../input/realisticViatra_excludeExit/', 500, 'Realistic Viatra no Exit (100 nodes)') | 27 | types = sorted(type_rep.nts[0].keys()) |
28 | # viatra100EEF = GraphCollection('../input/realisticViatra_excludeExitFinal/', 500, 'Realistic Viatra no Exit Final (100 nodes)') | ||
29 | # viatra100NT = GraphCollection('../input/yakindumm/realisticVIatraOutput_nodeTypeKS/', 500, 'Realistic Viatra with Node Type KS (100 nodes)') | ||
30 | 28 | ||
31 | # random = GraphCollection('../input/randomOutput/', 500, 'Random') | 29 | # random = GraphCollection('../input/randomOutput/', 500, 'Random') |
32 | # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)') | 30 | # alloy = GraphCollection('../input/alloy/', 500, 'Alloy (30 nodes)') |
33 | # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)') | 31 | # realistic_viatra = GraphCollection('../input/viatra_output_consistent_100/', 50, 'Realistic Viatra With Some Constraints (100 nodes)') |
34 | models_to_compare_na = [human, human2] | 32 | models_to_compare_na = [human, alloy,base, real, random, na_rep] |
35 | models_to_compare_mpc = [human, human2] | 33 | models_to_compare_mpc = [human, alloy,base, real, random, mpc_rep] |
36 | models_to_compare_od = [human, human2] | 34 | models_to_compare_od = [human, alloy,base, real, random, od_rep] |
37 | 35 | models_to_compare_nt = [human, alloy,base, real, random, type_rep] | |
36 | for modelCollection in models_to_compare_nt: | ||
37 | type_dists = [] | ||
38 | for nt in modelCollection.nts: | ||
39 | type_dist = [] | ||
40 | for key in types: | ||
41 | type_dist.append(nt.get(key, 0.0)) | ||
42 | type_dists.append(type_dist) | ||
43 | modelCollection.nts = type_dists | ||
44 | |||
45 | |||
38 | # define output folder | 46 | # define output folder |
39 | outputFolder = '../output/' | 47 | outputFolder = '../output/' |
40 | 48 | ||
41 | #calculate metrics | 49 | #calculate metrics |
42 | metricStat(models_to_compare_na, 'Node Activity', nodeActivity, 0, outputFolder) | 50 | # metricStat(models_to_compare_na, 'Node_Activity', nodeActivity, 0, outputFolder) |
43 | metricStat(models_to_compare_od, 'Out Degree', outDegree, 1, outputFolder) | 51 | metricStat(models_to_compare_od, 'Out_Degree', outDegree, 1, outputFolder) |
44 | metricStat(models_to_compare_mpc, 'MPC', mpc, 2, outputFolder) | 52 | # metricStat(models_to_compare_mpc, 'MPC', mpc, 2, outputFolder) |
53 | # metricStat(models_to_compare_nt, 'Node Types', nodeType, 3, outputFolder) | ||
45 | 54 | ||
46 | def calculateKSMatrix(dists): | 55 | def calculateKSMatrix(dists): |
47 | dist = [] | 56 | dist = [] |
@@ -65,18 +74,19 @@ def calculateMDS(dissimilarities): | |||
65 | return trans | 74 | return trans |
66 | 75 | ||
67 | def plot(graphTypes, coords, title='',index = 0, savePath = ''): | 76 | def plot(graphTypes, coords, title='',index = 0, savePath = ''): |
68 | color = ['blue', 'red', 'yellow', 'green', 'k'] | 77 | color = ['blue', 'm', 'gold', 'green', 'k', 'red'] |
69 | plt.figure(index, figsize=(7, 4)) | 78 | markers = ['o', 'v', '+', 'x', '^', '*'] |
70 | plt.title(title) | 79 | plt.figure(index, figsize=(5, 4)) |
80 | # plt.title(title) | ||
71 | index = 0 | 81 | index = 0 |
72 | for i in range(len(graphTypes)): | 82 | for i in range(len(graphTypes)): |
73 | x = (coords[index:index+graphTypes[i].size, 0].tolist()) | 83 | x = (coords[index:index+graphTypes[i].size, 0].tolist()) |
74 | y = (coords[index:index+graphTypes[i].size, 1].tolist()) | 84 | y = (coords[index:index+graphTypes[i].size, 1].tolist()) |
75 | index += graphTypes[i].size | 85 | index += graphTypes[i].size |
76 | plt.plot(x, y, color=color[i], marker='o', label = graphTypes[i].name, linestyle='', alpha=0.7) | 86 | plt.plot(x, y, color=color[i], marker=markers[i], label = graphTypes[i].name, linestyle='', alpha=0.7) |
87 | plt.savefig(fname = savePath+'.png', dpi=500) | ||
77 | plt.legend(loc='upper right') | 88 | plt.legend(loc='upper right') |
78 | plt.savefig(fname = savePath, dpi=150) | 89 | plt.savefig(fname = savePath+'_lengend.png', dpi=500) |
79 | #graph.show() | ||
80 | 90 | ||
81 | def mkdir_p(mypath): | 91 | def mkdir_p(mypath): |
82 | '''Creates a directory. equivalent to using mkdir -p on the command line''' | 92 | '''Creates a directory. equivalent to using mkdir -p on the command line''' |
@@ -99,7 +109,7 @@ def metricStat(graphTypes, metricName, metric, graphIndex, outputFolder): | |||
99 | print('calculate' + metricName +' for ' + outputFolder) | 109 | print('calculate' + metricName +' for ' + outputFolder) |
100 | mkdir_p(outputFolder) | 110 | mkdir_p(outputFolder) |
101 | out_d_coords = calculateMDS(calculateKSMatrix(metrics)) | 111 | out_d_coords = calculateMDS(calculateKSMatrix(metrics)) |
102 | plot(graphTypes, out_d_coords, metricName, graphIndex,outputFolder + '/'+ metricName+'.png') | 112 | plot(graphTypes, out_d_coords, metricName, graphIndex,outputFolder + '/'+ metricName) |
103 | 113 | ||
104 | def nodeActivity(graphType): | 114 | def nodeActivity(graphType): |
105 | return graphType.nas | 115 | return graphType.nas |
@@ -110,5 +120,8 @@ def outDegree(graphType): | |||
110 | def mpc(graphType): | 120 | def mpc(graphType): |
111 | return graphType.mpcs | 121 | return graphType.mpcs |
112 | 122 | ||
123 | def nodeType(graphType): | ||
124 | return graphType.nts | ||
125 | |||
113 | if __name__ == '__main__': | 126 | if __name__ == '__main__': |
114 | main() \ No newline at end of file | 127 | main() \ No newline at end of file |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb index 8d7b1bc3..32edb00c 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb +++ b/Metrics/Metrics-Calculation/metrics_plot/model_evolve_comparison/src/representative_selector .ipynb | |||
@@ -16,7 +16,7 @@ | |||
16 | }, | 16 | }, |
17 | { | 17 | { |
18 | "cell_type": "code", | 18 | "cell_type": "code", |
19 | "execution_count": 1, | 19 | "execution_count": 2, |
20 | "metadata": {}, | 20 | "metadata": {}, |
21 | "outputs": [], | 21 | "outputs": [], |
22 | "source": [ | 22 | "source": [ |
@@ -43,7 +43,7 @@ | |||
43 | }, | 43 | }, |
44 | { | 44 | { |
45 | "cell_type": "code", | 45 | "cell_type": "code", |
46 | "execution_count": 2, | 46 | "execution_count": 3, |
47 | "metadata": {}, | 47 | "metadata": {}, |
48 | "outputs": [], | 48 | "outputs": [], |
49 | "source": [ | 49 | "source": [ |
@@ -64,16 +64,16 @@ | |||
64 | }, | 64 | }, |
65 | { | 65 | { |
66 | "cell_type": "code", | 66 | "cell_type": "code", |
67 | "execution_count": 27, | 67 | "execution_count": 4, |
68 | "metadata": {}, | 68 | "metadata": {}, |
69 | "outputs": [ | 69 | "outputs": [ |
70 | { | 70 | { |
71 | "data": { | 71 | "data": { |
72 | "text/plain": [ | 72 | "text/plain": [ |
73 | "198" | 73 | "304" |
74 | ] | 74 | ] |
75 | }, | 75 | }, |
76 | "execution_count": 27, | 76 | "execution_count": 4, |
77 | "metadata": {}, | 77 | "metadata": {}, |
78 | "output_type": "execute_result" | 78 | "output_type": "execute_result" |
79 | } | 79 | } |
@@ -90,7 +90,7 @@ | |||
90 | " orientation='horizontal'\n", | 90 | " orientation='horizontal'\n", |
91 | ")\n", | 91 | ")\n", |
92 | "\n", | 92 | "\n", |
93 | "humanFiles = reader.readmultiplefiles('../input/human_30_500_no_xml/', 1300, False)\n", | 93 | "humanFiles = reader.readmultiplefiles('../input/Human/', 1300, False)\n", |
94 | "modelToFileName = {}\n", | 94 | "modelToFileName = {}\n", |
95 | "for name in humanFiles:\n", | 95 | "for name in humanFiles:\n", |
96 | " modelToFileName[GraphStat(name)] = name\n", | 96 | " modelToFileName[GraphStat(name)] = name\n", |
@@ -115,7 +115,7 @@ | |||
115 | }, | 115 | }, |
116 | { | 116 | { |
117 | "cell_type": "code", | 117 | "cell_type": "code", |
118 | "execution_count": 28, | 118 | "execution_count": 5, |
119 | "metadata": {}, | 119 | "metadata": {}, |
120 | "outputs": [], | 120 | "outputs": [], |
121 | "source": [ | 121 | "source": [ |
@@ -164,15 +164,15 @@ | |||
164 | }, | 164 | }, |
165 | { | 165 | { |
166 | "cell_type": "code", | 166 | "cell_type": "code", |
167 | "execution_count": 29, | 167 | "execution_count": 6, |
168 | "metadata": {}, | 168 | "metadata": {}, |
169 | "outputs": [ | 169 | "outputs": [ |
170 | { | 170 | { |
171 | "name": "stdout", | 171 | "name": "stdout", |
172 | "output_type": "stream", | 172 | "output_type": "stream", |
173 | "text": [ | 173 | "text": [ |
174 | "../input/human_30_500_no_xml\\rdm_run_1.csv\n", | 174 | "../input/Human\\33_run_1.csv\n", |
175 | "../input/human_30_500_no_xml\\rdm_run_1.csv\n" | 175 | "../input/Human\\33_run_1.csv\n" |
176 | ] | 176 | ] |
177 | } | 177 | } |
178 | ], | 178 | ], |
@@ -185,17 +185,17 @@ | |||
185 | }, | 185 | }, |
186 | { | 186 | { |
187 | "cell_type": "code", | 187 | "cell_type": "code", |
188 | "execution_count": 30, | 188 | "execution_count": 7, |
189 | "metadata": {}, | 189 | "metadata": {}, |
190 | "outputs": [ | 190 | "outputs": [ |
191 | { | 191 | { |
192 | "name": "stdout", | 192 | "name": "stdout", |
193 | "output_type": "stream", | 193 | "output_type": "stream", |
194 | "text": [ | 194 | "text": [ |
195 | "average distance: 0.1120958646931491\n", | 195 | "average distance: 0.04615092955852465\n", |
196 | "median: 0.07794784580498866\n", | 196 | "median: 0.04402137483980782\n", |
197 | "std: 0.10338893965532157\n", | 197 | "std: 0.017305709419913242\n", |
198 | "max: 0.8512271307452031\n", | 198 | "max: 0.1411706837186424\n", |
199 | "min: 0.0\n" | 199 | "min: 0.0\n" |
200 | ] | 200 | ] |
201 | } | 201 | } |
@@ -242,15 +242,15 @@ | |||
242 | }, | 242 | }, |
243 | { | 243 | { |
244 | "cell_type": "code", | 244 | "cell_type": "code", |
245 | "execution_count": 31, | 245 | "execution_count": 8, |
246 | "metadata": {}, | 246 | "metadata": {}, |
247 | "outputs": [ | 247 | "outputs": [ |
248 | { | 248 | { |
249 | "name": "stdout", | 249 | "name": "stdout", |
250 | "output_type": "stream", | 250 | "output_type": "stream", |
251 | "text": [ | 251 | "text": [ |
252 | "../input/human_30_500_no_xml\\XSHMLMT_run_1.csv\n", | 252 | "../input/Human\\288_run_1.csv\n", |
253 | "../input/human_30_500_no_xml\\XSHMLMT_run_1.csv\n" | 253 | "../input/Human\\288_run_1.csv\n" |
254 | ] | 254 | ] |
255 | } | 255 | } |
256 | ], | 256 | ], |
@@ -263,17 +263,17 @@ | |||
263 | }, | 263 | }, |
264 | { | 264 | { |
265 | "cell_type": "code", | 265 | "cell_type": "code", |
266 | "execution_count": 32, | 266 | "execution_count": 9, |
267 | "metadata": {}, | 267 | "metadata": {}, |
268 | "outputs": [ | 268 | "outputs": [ |
269 | { | 269 | { |
270 | "name": "stdout", | 270 | "name": "stdout", |
271 | "output_type": "stream", | 271 | "output_type": "stream", |
272 | "text": [ | 272 | "text": [ |
273 | "average distance: 0.11606713468404145\n", | 273 | "average distance: 0.046794293118067494\n", |
274 | "median: 0.08615545879696823\n", | 274 | "median: 0.03898868458274401\n", |
275 | "std: 0.09424733847431985\n", | 275 | "std: 0.02880119213919405\n", |
276 | "max: 0.8536367692994199\n", | 276 | "max: 0.18702970297029703\n", |
277 | "min: 0.0\n" | 277 | "min: 0.0\n" |
278 | ] | 278 | ] |
279 | } | 279 | } |
@@ -320,15 +320,15 @@ | |||
320 | }, | 320 | }, |
321 | { | 321 | { |
322 | "cell_type": "code", | 322 | "cell_type": "code", |
323 | "execution_count": 33, | 323 | "execution_count": 10, |
324 | "metadata": {}, | 324 | "metadata": {}, |
325 | "outputs": [ | 325 | "outputs": [ |
326 | { | 326 | { |
327 | "name": "stdout", | 327 | "name": "stdout", |
328 | "output_type": "stream", | 328 | "output_type": "stream", |
329 | "text": [ | 329 | "text": [ |
330 | "../input/human_30_500_no_xml\\Sql_run_1.csv\n", | 330 | "../input/Human\\151_run_1.csv\n", |
331 | "../input/human_30_500_no_xml\\Sql_run_1.csv\n" | 331 | "../input/Human\\151_run_1.csv\n" |
332 | ] | 332 | ] |
333 | } | 333 | } |
334 | ], | 334 | ], |
@@ -341,17 +341,17 @@ | |||
341 | }, | 341 | }, |
342 | { | 342 | { |
343 | "cell_type": "code", | 343 | "cell_type": "code", |
344 | "execution_count": 34, | 344 | "execution_count": 11, |
345 | "metadata": {}, | 345 | "metadata": {}, |
346 | "outputs": [ | 346 | "outputs": [ |
347 | { | 347 | { |
348 | "name": "stdout", | 348 | "name": "stdout", |
349 | "output_type": "stream", | 349 | "output_type": "stream", |
350 | "text": [ | 350 | "text": [ |
351 | "average distance: 0.1365610722702415\n", | 351 | "average distance: 0.07028909225833632\n", |
352 | "median: 0.10589419186354082\n", | 352 | "median: 0.06254480286738351\n", |
353 | "std: 0.09795223151686845\n", | 353 | "std: 0.037281890512224164\n", |
354 | "max: 0.8574673315618971\n", | 354 | "max: 0.21961550993809065\n", |
355 | "min: 0.0\n" | 355 | "min: 0.0\n" |
356 | ] | 356 | ] |
357 | } | 357 | } |
@@ -366,20 +366,6 @@ | |||
366 | "print('max:', max(distances))\n", | 366 | "print('max:', max(distances))\n", |
367 | "print('min:', min(distances))" | 367 | "print('min:', min(distances))" |
368 | ] | 368 | ] |
369 | }, | ||
370 | { | ||
371 | "cell_type": "code", | ||
372 | "execution_count": null, | ||
373 | "metadata": {}, | ||
374 | "outputs": [], | ||
375 | "source": [] | ||
376 | }, | ||
377 | { | ||
378 | "cell_type": "code", | ||
379 | "execution_count": null, | ||
380 | "metadata": {}, | ||
381 | "outputs": [], | ||
382 | "source": [] | ||
383 | } | 369 | } |
384 | ], | 370 | ], |
385 | "metadata": { | 371 | "metadata": { |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb index 8f01040d..80365bb8 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb +++ b/Metrics/Metrics-Calculation/metrics_plot/type_analysis/src/Node Type Analysis.ipynb | |||
@@ -2,7 +2,7 @@ | |||
2 | "cells": [ | 2 | "cells": [ |
3 | { | 3 | { |
4 | "cell_type": "code", | 4 | "cell_type": "code", |
5 | "execution_count": 5, | 5 | "execution_count": 1, |
6 | "metadata": {}, | 6 | "metadata": {}, |
7 | "outputs": [], | 7 | "outputs": [], |
8 | "source": [ | 8 | "source": [ |
@@ -18,7 +18,7 @@ | |||
18 | }, | 18 | }, |
19 | { | 19 | { |
20 | "cell_type": "code", | 20 | "cell_type": "code", |
21 | "execution_count": 6, | 21 | "execution_count": 2, |
22 | "metadata": {}, | 22 | "metadata": {}, |
23 | "outputs": [], | 23 | "outputs": [], |
24 | "source": [ | 24 | "source": [ |
@@ -30,7 +30,7 @@ | |||
30 | }, | 30 | }, |
31 | { | 31 | { |
32 | "cell_type": "code", | 32 | "cell_type": "code", |
33 | "execution_count": 7, | 33 | "execution_count": 3, |
34 | "metadata": {}, | 34 | "metadata": {}, |
35 | "outputs": [], | 35 | "outputs": [], |
36 | "source": [ | 36 | "source": [ |
@@ -52,7 +52,7 @@ | |||
52 | }, | 52 | }, |
53 | { | 53 | { |
54 | "cell_type": "code", | 54 | "cell_type": "code", |
55 | "execution_count": 5, | 55 | "execution_count": 4, |
56 | "metadata": { | 56 | "metadata": { |
57 | "scrolled": true | 57 | "scrolled": true |
58 | }, | 58 | }, |
@@ -61,12 +61,12 @@ | |||
61 | "name": "stdout", | 61 | "name": "stdout", |
62 | "output_type": "stream", | 62 | "output_type": "stream", |
63 | "text": [ | 63 | "text": [ |
64 | "['EParameter', 'EStringToStringMapEntry', 'EOperation', 'EAttribute', 'ETypeParameter', 'EClass', 'EReference', 'EDataType', 'EGenericType', 'EEnum', 'EAnnotation', 'EEnumLiteral', 'EPackage']\n" | 64 | "['EPackage', 'EAttribute', 'EEnumLiteral', 'EGenericType', 'EAnnotation', 'EOperation', 'EEnum', 'ETypeParameter', 'EParameter', 'EReference', 'EClass', 'EStringToStringMapEntry', 'EDataType']\n" |
65 | ] | 65 | ] |
66 | }, | 66 | }, |
67 | { | 67 | { |
68 | "data": { | 68 | "data": { |
69 | "image/png": "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\n", | 69 | "image/png": "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\n", |
70 | "text/plain": [ | 70 | "text/plain": [ |
71 | "<Figure size 432x288 with 1 Axes>" | 71 | "<Figure size 432x288 with 1 Axes>" |
72 | ] | 72 | ] |
@@ -78,7 +78,7 @@ | |||
78 | }, | 78 | }, |
79 | { | 79 | { |
80 | "data": { | 80 | "data": { |
81 | "image/png": "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", | 81 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEICAYAAABGaK+TAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAATH0lEQVR4nO3df5BlZ13n8feHDDEmhs2vTswmGSaUY5YUJYHtwiC1LDBgBYLMlIZsosKwNTIbV1wVqzSrZSmrVoWtXaNbpoCRIL1bECZEcEbwFw6JKAujExJ+JIFNiCHMZjLTSAYFFAh89497hvT2dM893X3v7X5m3q+qW/f8uvd8n749n37mOfeck6pCktSeJ612AZKk5THAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLQJI3J/mVbvoFSfavdk3SMAa41pwkDyX5pyRfnvP43TnrX5CkkvzCvNdt6Javm7PsNUn+etg+q+q6qvr1EdVfSb5nFO8lHYsBrrXqh6rqu+Y8Xjdn3Vbgi93ziiU5aRTvI02aAa6mJDkVuAr4KWBjkuk5qz/UPR/ueu3PBd4MPLebP9y9x9uTvCnJHyf5CvDCbtlvzNvXLyX5Qvc/gh+bs/yOJD8xZ/7bvfwkR2r4eLfPf9ctf3mSu5McTvK/k3zfSH8wOiEZ4GrNjwBfBt4N/Bnw6jnrnt89n9H12j8CXAd8pJs/Y862Pwr8JnA6sNAQy3cD5wAXMOjp70hyybDiqupIDc/s9rkzybOBtwH/ATgbeAuwO8l39GqxtAgDXGvVH3a91SOP13bLtwI7q+qbwDuBa5M8eRnvv6uqPlxV36qqf15km1+pqq9V1V8C7weuXsZ+AF4LvKWq9lbVN6tqBvgacPky308CDHCtXVuq6ow5j99LchHwQuAd3Ta7gFOAK5fx/p8fsv6xqvrKnPnPAf9yGfsBeCrw83P/IAEXreD9JMAAV1texeB39o+SPAo8yCDAjwyjLHRpzcUutznsMpxnJjltzvx64JFu+ivAqXPWffeQ9/o88Jvz/iCdWlW3DHmddEwGuFryauANwGVzHj8CXJnkbGAW+BbwtDmvOQhcmOTkZezvDUlOTvJvgJczGHcHuBv44SSndl8X3DbvdQfn1fB7wHVJvj8DpyW5Msnpy6hJ+jYDXGvVH837HvjtwAbgpqp6dM5jN/AAcG1VfZXBgckPd0MVlwMfBO4BHk3yhSXs/1HgMQa97ncA11XVp7t1NwJfZxDUMzwxpHPErwEzXQ1XV9U+BuPgv9u95wPAa5b005AWEG/oIEltsgcuSY0ywCWpUQa4JDXKAJekRq0bvsnonHPOObVhw4ZJ7lKSmnfnnXd+oaqm5i+faIBv2LCBffv2TXKXktS8JJ9baLlDKJLUKANckhplgEtSowxwSWqUAS5JjTLAJalRvQI8yc8luSfJp5LckuSUJBcn2Zvk/iQ7l3m5TknSMg0N8CQXAP8JmK6qZwAnAdcAbwRurKqNDC6ROf+ayJKkMeo7hLIO+M4k6xjcieQA8CLgtm79DLBl9OVJkhYz9EzMqvq/Sf4b8DDwT8CfA3cCh6vq8W6z/Qzu3n2UJNuB7QDr169fdqEbrn//gssfumE5t0OUpPb1GUI5E9gMXMzgJqynAS9dYNMF7wxRVTuqarqqpqemjjqVX5K0TH2GUF4M/F1VzVbVN4D3AD8AnNENqQBcyBM3fJUkTUCfAH8YuLy7gWuATcC9wO3AVd02W4Fd4ylRkrSQoQFeVXsZHKz8GPDJ7jU7gF8EXp/kAeBs4OYx1ilJmqfX5WSr6leBX523+EHgOSOvSJLUi2diSlKjDHBJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIa1eemxpckuXvO4x+S/GySs5J8IMn93fOZkyhYkjTQ55Zqn6mqy6rqMuBfA18F3gtcD+ypqo3Anm5ekjQhSx1C2QR8tqo+B2wGZrrlM8CWURYmSTq2pQb4NcAt3fR5VXUAoHs+d5SFSZKOrXeAJzkZeAXw7qXsIMn2JPuS7JudnV1qfZKkRSylB/5S4GNVdbCbP5jkfIDu+dBCL6qqHVU1XVXTU1NTK6tWkvRtSwnwa3li+ARgN7C1m94K7BpVUZKk4XoFeJJTgZcA75mz+AbgJUnu79bdMPryJEmLWddno6r6KnD2vGV/z+BbKZKkVeCZmJLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRhngktSovrdUOyPJbUk+neS+JM9NclaSDyS5v3s+c9zFSpKe0LcH/jvAn1bVvwKeCdwHXA/sqaqNwJ5uXpI0IUMDPMlTgOcDNwNU1der6jCwGZjpNpsBtoyrSEnS0fr0wJ8GzAK/n+SuJG9NchpwXlUdAOiez13oxUm2J9mXZN/s7OzICpekE12fAF8HPBt4U1U9C/gKSxguqaodVTVdVdNTU1PLLFOSNF+fAN8P7K+qvd38bQwC/WCS8wG650PjKVGStJChAV5VjwKfT3JJt2gTcC+wG9jaLdsK7BpLhZKkBa3rud1PA+9IcjLwIPDvGYT/rUm2AQ8DrxxPiZKkhfQK8Kq6G5heYNWm0ZYjSerLMzElqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUb3uyJPkIeAfgW8Cj1fVdJKzgJ3ABuAh4Oqqemw8ZUqS5ltKD/yFVXVZVR25tdr1wJ6q2gjs6eYlSROykiGUzcBMNz0DbFl5OZKkvvoGeAF/nuTOJNu7ZedV1QGA7vnchV6YZHuSfUn2zc7OrrxiSRLQcwwceF5VPZLkXOADST7ddwdVtQPYATA9PV3LqFGStIBePfCqeqR7PgS8F3gOcDDJ+QDd86FxFSlJOtrQAE9yWpLTj0wDPwh8CtgNbO022wrsGleRkqSj9RlCOQ94b5Ij27+zqv40yd8CtybZBjwMvHJ8ZUqS5hsa4FX1IPDMBZb/PbBpHEVJkobzTExJapQBLkmNMsAlqVEGuCQ1ygCXpEYZ4JLUKANckhplgEtSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIa1feemFqCDde/f8HlD91w5YQrkXQ8swcuSY3qHeBJTkpyV5L3dfMXJ9mb5P4kO5OcPL4yJUnzLWUI5WeA+4CndPNvBG6sqncleTOwDXjTiOsbubU4vLEWa5K09vXqgSe5ELgSeGs3H+BFwG3dJjPAlnEUKElaWN8hlN8GfgH4Vjd/NnC4qh7v5vcDFyz0wiTbk+xLsm92dnZFxUqSnjA0wJO8HDhUVXfOXbzAprXQ66tqR1VNV9X01NTUMsuUJM3XZwz8ecArkrwMOIXBGPhvA2ckWdf1wi8EHhlfmZKk+Yb2wKvqP1fVhVW1AbgG+GBV/RhwO3BVt9lWYNfYqpQkHWUl3wP/ReD1SR5gMCZ+82hKkiT1saQzMavqDuCObvpB4DmjL0mS1IdnYkpSowxwSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1Kjj9o48i12idZTv4+VeJa0me+CS1CgDXJIaddwOoSzVqIZcJGlS7IFLUqMMcElqlAEuSY0ywCWpUQa4JDXKAJekRvW5K/0pSf4myceT3JPkDd3yi5PsTXJ/kp1JTh5/uZKkI/r0wL8GvKiqnglcBlyR5HLgjcCNVbUReAzYNr4yJUnz9bkrfVXVl7vZJ3ePAl4E3NYtnwG2jKVCSdKCep2JmeQk4E7ge4CbgM8Ch6vq8W6T/cAFi7x2O7AdYP369Sutt2me7SlplHodxKyqb1bVZcCFDO5E//SFNlvktTuqarqqpqemppZfqSTp/7Okb6FU1WHgDuBy4IwkR3rwFwKPjLY0SdKxDB1CSTIFfKOqDif5TuDFDA5g3g5cBbwL2ArsGmehGm6xIRqvWy4dn/qMgZ8PzHTj4E8Cbq2q9yW5F3hXkt8A7gJuHmOdkqR5hgZ4VX0CeNYCyx9kMB6uCfNgqCTwTExJapYBLkmNMsAlqVEGuCQ1yntiroAHEyWtJnvgktQoA1ySGuUQyho2qiGaUZ2heax6PNtTmjx74JLUKANckhplgEtSowxwSWpU8wcx/S62pBOVPXBJapQBLkmNan4IRaPnsJTUBnvgktSooQGe5KIktye5L8k9SX6mW35Wkg8kub97PnP85UqSjujTA38c+PmqejqDu9H/VJJLgeuBPVW1EdjTzUuSJmRogFfVgar6WDf9j8B9wAXAZmCm22wG2DKuIiVJR1vSQcwkGxjc4HgvcF5VHYBByCc5d5HXbAe2A6xfv34ltapBo7qQlqSj9T6ImeS7gD8Afraq/qHv66pqR1VNV9X01NTUcmqUJC2gV4AneTKD8H5HVb2nW3wwyfnd+vOBQ+MpUZK0kD7fQglwM3BfVf3WnFW7ga3d9FZg1+jLkyQtps8Y+POAVwGfTHJ3t+yXgBuAW5NsAx4GXjmeEiVJCxka4FX110AWWb1ptOVokjzjUmqbZ2JKUqMMcElqlBez0kg4HCNNnj1wSWqUAS5JjTLAJalRBrgkNcoAl6RGGeCS1CgDXJIa5ffAtSq8Tri0cvbAJalR9sDVBHvs0tHsgUtSowxwSWqUQyhaU7woltSfPXBJatTQHniStwEvBw5V1TO6ZWcBO4ENwEPA1VX12PjKlJbGg546EfTpgb8duGLesuuBPVW1EdjTzUuSJmhogFfVh4Avzlu8GZjppmeALSOuS5I0xHLHwM+rqgMA3fO5i22YZHuSfUn2zc7OLnN3kqT5xn4Qs6p2VNV0VU1PTU2Ne3eSdMJYboAfTHI+QPd8aHQlSZL6WG6A7wa2dtNbgV2jKUeS1NfQAE9yC/AR4JIk+5NsA24AXpLkfuAl3bwkaYKGfg+8qq5dZNWmEdciLZlnbupE5pmYktQoA1ySGuXFrHRC8RR7HU/sgUtSo+yBS9gzV5vsgUtSowxwSWqUAS5JjTLAJalRHsSUlmGUBz09gKrlsgcuSY0ywCWpUQ6hSMeJpQ7FOHTTPnvgktQoA1ySGuUQinQMo7zeuNcu16jZA5ekRq2oB57kCuB3gJOAt1aVt1aTRmS1euxr8eDmUn8WJ8qB2GX3wJOcBNwEvBS4FLg2yaWjKkySdGwrGUJ5DvBAVT1YVV8H3gVsHk1ZkqRhUlXLe2FyFXBFVf1EN/8q4Pur6nXzttsObO9mLwE+s8xazwG+sMzXtso2nxhs8/Fvpe19alVNzV+4kjHwLLDsqL8GVbUD2LGC/Qx2luyrqumVvk9LbPOJwTYf/8bV3pUMoewHLpozfyHwyMrKkST1tZIA/1tgY5KLk5wMXAPsHk1ZkqRhlj2EUlWPJ3kd8GcMvkb4tqq6Z2SVHW3FwzANss0nBtt8/BtLe5d9EFOStLo8E1OSGmWAS1Kj1lyAJ7kiyWeSPJDk+gXWf0eSnd36vUk2TL7K0erR5tcnuTfJJ5LsSfLU1ahzlIa1ec52VyWpJE1/5axPe5Nc3X3O9yR556RrHLUev9frk9ye5K7ud/tlq1HnKCV5W5JDST61yPok+R/dz+QTSZ69oh1W1Zp5MDgY+lngacDJwMeBS+dt8x+BN3fT1wA7V7vuCbT5hcCp3fRPnght7rY7HfgQ8FFgerXrHvNnvBG4Czizmz93teueQJt3AD/ZTV8KPLTadY+g3c8Hng18apH1LwP+hMF5NJcDe1eyv7XWA+9zev5mYKabvg3YlGShk4paMbTNVXV7VX21m/0og+/ct6zvZRh+HfivwD9Psrgx6NPe1wI3VdVjAFV1aMI1jlqfNhfwlG76X3AcnEdSVR8CvniMTTYD/7MGPgqckeT85e5vrQX4BcDn58zv75YtuE1VPQ58CTh7ItWNR582z7WNwV/wlg1tc5JnARdV1fsmWdiY9PmMvxf43iQfTvLR7kqfLevT5l8DfjzJfuCPgZ+eTGmraqn/3o9prd3Qoc/p+b1O4W9I7/Yk+XFgGvi3Y61o/I7Z5iRPAm4EXjOpgsasz2e8jsEwygsY/A/rr5I8o6oOj7m2cenT5muBt1fVf0/yXOB/dW3+1vjLWzUjza+11gPvc3r+t7dJso7Bf72O9V+Wta7XJQmSvBj4ZeAVVfW1CdU2LsPafDrwDOCOJA8xGCvc3fCBzL6/17uq6htV9XcMLvq2cUL1jUOfNm8DbgWoqo8ApzC46NPxbKSXIFlrAd7n9PzdwNZu+irgg9UdHWjU0DZ3wwlvYRDerY+NwpA2V9WXquqcqtpQVRsYjPu/oqr2rU65K9bn9/oPGRysJsk5DIZUHpxolaPVp80PA5sAkjydQYDPTrTKydsNvLr7NsrlwJeq6sCy3221j9oucpT2/zA4gv3L3bL/wuAfMAw+5HcDDwB/AzxttWueQJv/AjgI3N09dq92zeNu87xt76Dhb6H0/IwD/BZwL/BJ4JrVrnkCbb4U+DCDb6jcDfzgatc8gjbfAhwAvsGgt70NuA64bs7nfFP3M/nkSn+vPZVekhq11oZQJEk9GeCS1CgDXJIaZYBLUqMMcElqlAEuSY0ywCWpUf8PL6yPJS1j+0kAAAAASUVORK5CYII=\n", |
82 | "text/plain": [ | 82 | "text/plain": [ |
83 | "<Figure size 432x288 with 1 Axes>" | 83 | "<Figure size 432x288 with 1 Axes>" |
84 | ] | 84 | ] |
@@ -90,7 +90,7 @@ | |||
90 | }, | 90 | }, |
91 | { | 91 | { |
92 | "data": { | 92 | "data": { |
93 | "image/png": "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\n", | 93 | "image/png": "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\n", |
94 | "text/plain": [ | 94 | "text/plain": [ |
95 | "<Figure size 432x288 with 1 Axes>" | 95 | "<Figure size 432x288 with 1 Axes>" |
96 | ] | 96 | ] |
@@ -102,7 +102,7 @@ | |||
102 | }, | 102 | }, |
103 | { | 103 | { |
104 | "data": { | 104 | "data": { |
105 | "image/png": "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\n", | 105 | "image/png": "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\n", |
106 | "text/plain": [ | 106 | "text/plain": [ |
107 | "<Figure size 432x288 with 1 Axes>" | 107 | "<Figure size 432x288 with 1 Axes>" |
108 | ] | 108 | ] |
@@ -114,7 +114,7 @@ | |||
114 | }, | 114 | }, |
115 | { | 115 | { |
116 | "data": { | 116 | "data": { |
117 | "image/png": "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\n", | 117 | "image/png": "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\n", |
118 | "text/plain": [ | 118 | "text/plain": [ |
119 | "<Figure size 432x288 with 1 Axes>" | 119 | "<Figure size 432x288 with 1 Axes>" |
120 | ] | 120 | ] |
@@ -126,7 +126,7 @@ | |||
126 | }, | 126 | }, |
127 | { | 127 | { |
128 | "data": { | 128 | "data": { |
129 | "image/png": "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\n", | 129 | "image/png": "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\n", |
130 | "text/plain": [ | 130 | "text/plain": [ |
131 | "<Figure size 432x288 with 1 Axes>" | 131 | "<Figure size 432x288 with 1 Axes>" |
132 | ] | 132 | ] |
@@ -138,7 +138,7 @@ | |||
138 | }, | 138 | }, |
139 | { | 139 | { |
140 | "data": { | 140 | "data": { |
141 | "image/png": "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\n", | 141 | "image/png": "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\n", |
142 | "text/plain": [ | 142 | "text/plain": [ |
143 | "<Figure size 432x288 with 1 Axes>" | 143 | "<Figure size 432x288 with 1 Axes>" |
144 | ] | 144 | ] |
@@ -150,7 +150,7 @@ | |||
150 | }, | 150 | }, |
151 | { | 151 | { |
152 | "data": { | 152 | "data": { |
153 | "image/png": "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\n", | 153 | "image/png": "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\n", |
154 | "text/plain": [ | 154 | "text/plain": [ |
155 | "<Figure size 432x288 with 1 Axes>" | 155 | "<Figure size 432x288 with 1 Axes>" |
156 | ] | 156 | ] |
@@ -162,7 +162,7 @@ | |||
162 | }, | 162 | }, |
163 | { | 163 | { |
164 | "data": { | 164 | "data": { |
165 | "image/png": "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\n", | 165 | "image/png": "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\n", |
166 | "text/plain": [ | 166 | "text/plain": [ |
167 | "<Figure size 432x288 with 1 Axes>" | 167 | "<Figure size 432x288 with 1 Axes>" |
168 | ] | 168 | ] |
@@ -174,7 +174,7 @@ | |||
174 | }, | 174 | }, |
175 | { | 175 | { |
176 | "data": { | 176 | "data": { |
177 | "image/png": "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\n", | 177 | "image/png": "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\n", |
178 | "text/plain": [ | 178 | "text/plain": [ |
179 | "<Figure size 432x288 with 1 Axes>" | 179 | "<Figure size 432x288 with 1 Axes>" |
180 | ] | 180 | ] |
@@ -186,7 +186,7 @@ | |||
186 | }, | 186 | }, |
187 | { | 187 | { |
188 | "data": { | 188 | "data": { |
189 | "image/png": "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\n", | 189 | "image/png": "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\n", |
190 | "text/plain": [ | 190 | "text/plain": [ |
191 | "<Figure size 432x288 with 1 Axes>" | 191 | "<Figure size 432x288 with 1 Axes>" |
192 | ] | 192 | ] |
@@ -198,7 +198,7 @@ | |||
198 | }, | 198 | }, |
199 | { | 199 | { |
200 | "data": { | 200 | "data": { |
201 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEICAYAAACktLTqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAR4UlEQVR4nO3de7DcZ13H8feHhrYqlwJNoSaVgEQGdLR0IsbBS6WIbUHSP1qnKNB2IhEExUHUepkRb2N1RoodEY2UIcULrSA0Qr2U0oogqZxKKZSKDbU2Z1Kbo20jWIsUvv6xT3B7epKzJ2f3nOyT92tmZ3+/5/fs/r5P9uSzv31297epKiRJfXnUahcgSRo/w12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGu7RMSb47yWdXcH+nJ5ldqf1pOhnuOiIkuTPJ/yT5wtDl95JcmOTL89q/kOTrV6nGF8xvr6q/r6pnLtZPWklrVrsAacgPVtUHhxuSXAh8rKq+a3VKWllJAqSqvrLatWi6eeSuqdaOkt+Q5JYk+5NcmeT4tu3CJB+Z17+SPKMtvyPJ7yf5q/Zq4KNJnpLkzUnuS/LPSZ4zQg1fnSZJ8k7gG4C/bPf5s619c5J/SHJ/kk8mOX3o9jck+Y0kHwUeAJ6e5KIktyX5fJI7kvzYmP7JdJQw3NWDHwLOBJ4GfCtw4RJv+0vAicAXgY8B/9TW3w28aSmFVNXLgbsYvAp5TFX9dpJ1wAeAXweeCLwBeE+StUM3fTmwDXgs8G/APuDFwOOAi4BLk5y2lFp0dDPcdSR5XzuyPXB5ZWvfPK/9c/Nud1lV7a2qe4G/BE5dwj7fW1U3VdWDwHuBB6vqiqr6MnAlsOiR+wheBlxTVddU1Veq6lpgBjh7qM87qurWqnqoqr5UVR+oqs/VwN8Bfwt89xhq0VHCcNeR5JyqOmHo8ketfde89m+cd7t/H1p+AHjMEvZ5z9Dy/yywvpT7OpinAucNP0EB3wWcPNRnz/ANkpyVZFeSe1v/sxm8mpBG4huq6tl/A197YCXJU1Zov/NPtboHeGdVvXKhzvNvk+Q44D3AK4Crq+pLSd4HZOyVqlseuatnnwS+Ocmp7U3WN47hPh+d5Pihy0IHSPcATx9a/2PgB5P8QJJj2u1OT7L+IPs4FjgOmAMeSnIW8MIx1K6jiOGuI8mBT5gcuLy3tX/nAp9z//bF7qyq/gX4VeCDwO3ARw59i5Fcw2C65sDljQv0+U3gl9oUzBuqag+wBfgFBoG9B/gZDvL/r6o+D/wkcBVwH/DDwM4x1K6jSPyxDknqj0fuktQhw12SOmS4S1KHDHdJ6tAR8Tn3E088sTZs2LDaZUjSVLnpppv+o6rWLrTtiAj3DRs2MDMzs9plSNJUSfJvB9vmtIwkdchwl6QOGe6S1KGRwr39IMKnktycZKa1PTHJtUlub9dPaO1JclmS3e0HFDwHtSStsKUcuX9fVZ1aVZva+sXAdVW1EbiurQOcBWxsl23AW8dVrCRpNMuZltkC7GjLO4BzhtqvaD8ysAs4IcnJC92BJGkyRg33Av42yU1JtrW2J1fV3QDt+qTWvo6H//DAbGt7mCTbkswkmZmbmzu86iVJCxr1c+7Pq6q9SU4Crk3yz4fou9APCjzi1JNVtR3YDrBp0yZPTSlJYzTSkXtV7W3X+xj8zuRzgXsOTLe0632t+yxwytDN1wN7x1WwJGlxix65J/k64FFV9fm2/EIGP4CwE7gAuKRdX91ushN4bZJ3Ad8B7D8wfTMJGy7+wILtd17yokntUpKOeKNMyzwZeG+SA/3/tKr+OsnHgauSbAXuAs5r/a9h8GO+uxn8WPFFY69aknRIi4Z7Vd0BfNsC7f8JnLFAewGvGUt1kqTD4jdUJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQyOHe5Jjknwiyfvb+tOS3Jjk9iRXJjm2tR/X1ne37RsmU7ok6WCWcuT+OuC2ofXfAi6tqo3AfcDW1r4VuK+qngFc2vpJklbQSOGeZD3wIuBtbT3A84F3ty47gHPa8pa2Ttt+RusvSVohox65vxn4WeArbf1JwP1V9VBbnwXWteV1wB6Atn1/6/8wSbYlmUkyMzc3d5jlS5IWsmi4J3kxsK+qbhpuXqBrjbDt/xuqtlfVpqratHbt2pGKlSSNZs0IfZ4HvCTJ2cDxwOMYHMmfkGRNOzpfD+xt/WeBU4DZJGuAxwP3jr1ySdJBLXrkXlU/X1Xrq2oDcD7woar6EeB64NzW7QLg6ra8s63Ttn+oqh5x5C5JmpzlfM7954DXJ9nNYE798tZ+OfCk1v564OLllShJWqpRpmW+qqpuAG5oy3cAz12gz4PAeWOoTZJ0mPyGqiR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdWjRcE9yfJJ/TPLJJLcm+ZXW/rQkNya5PcmVSY5t7ce19d1t+4bJDkGSNN8oR+5fBJ5fVd8GnAqcmWQz8FvApVW1EbgP2Nr6bwXuq6pnAJe2fpKkFbRouNfAF9rqo9ulgOcD727tO4Bz2vKWtk7bfkaSjK1iSdKiRppzT3JMkpuBfcC1wOeA+6vqodZlFljXltcBewDa9v3Akxa4z21JZpLMzM3NLW8UkqSHGSncq+rLVXUqsB54LvCshbq164WO0usRDVXbq2pTVW1au3btqPVKkkawpE/LVNX9wA3AZuCEJGvapvXA3rY8C5wC0LY/Hrh3HMVKkkYzyqdl1iY5oS1/DfAC4DbgeuDc1u0C4Oq2vLOt07Z/qKoeceQuSZqcNYt34WRgR5JjGDwZXFVV70/yGeBdSX4d+ARweet/OfDOJLsZHLGfP4G6JUmHsGi4V9UtwHMWaL+Dwfz7/PYHgfPGUp0k6bD4DVVJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SerQouGe5JQk1ye5LcmtSV7X2p+Y5Nokt7frJ7T2JLksye4ktyQ5bdKDkCQ93ChH7g8BP11VzwI2A69J8mzgYuC6qtoIXNfWAc4CNrbLNuCtY69aknRIi4Z7Vd1dVf/Ulj8P3AasA7YAO1q3HcA5bXkLcEUN7AJOSHLy2CuXJB3Ukubck2wAngPcCDy5qu6GwRMAcFLrtg7YM3Sz2dY2/762JZlJMjM3N7f0yiVJBzVyuCd5DPAe4Keq6r8O1XWBtnpEQ9X2qtpUVZvWrl07ahmSpBGMFO5JHs0g2P+kqv6iNd9zYLqlXe9r7bPAKUM3Xw/sHU+5kqRRjPJpmQCXA7dV1ZuGNu0ELmjLFwBXD7W/on1qZjOw/8D0jSRpZawZoc/zgJcDn0pyc2v7BeAS4KokW4G7gPPatmuAs4HdwAPARWOtWJK0qEXDvao+wsLz6ABnLNC/gNcssy5J0jL4DVVJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SerQouGe5O1J9iX59FDbE5Ncm+T2dv2E1p4klyXZneSWJKdNsnhJ0sJGOXJ/B3DmvLaLgeuqaiNwXVsHOAvY2C7bgLeOp0xJ0lIsGu5V9WHg3nnNW4AdbXkHcM5Q+xU1sAs4IcnJ4ypWkjSaw51zf3JV3Q3Qrk9q7euAPUP9ZlvbIyTZlmQmyczc3NxhliFJWsi431DNAm21UMeq2l5Vm6pq09q1a8dchiQd3Q433O85MN3Srve19lnglKF+64G9h1+eJOlwHG647wQuaMsXAFcPtb+ifWpmM7D/wPSNJGnlrFmsQ5I/A04HTkwyC/wycAlwVZKtwF3Aea37NcDZwG7gAeCiCdQsSVrEouFeVS89yKYzFuhbwGuWW5QkaXn8hqokdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nqkOEuSR0y3CWpQ4a7JHXIcJekDhnuktQhw12SOmS4S1KHDHdJ6pDhLkkdMtwlqUOGuyR1yHCXpA4Z7pLUIcNdkjpkuEtShwx3SeqQ4S5JHTLcJalDa1a7gJW24eIPHHTbnZe8aEm3OVh/SVptHrlLUocMd0nqULfTMoeafpGk3nUb7qvJOXpJq81wXwZfHUg6UjnnLkkd8sh9yLQciTvtI2kxhvsKWq0nD58MpKPPRMI9yZnA7wLHAG+rqksmsR893LS88pA0eWMP9yTHAG8Bvh+YBT6eZGdVfWbc+9LyHM6TgUf70nSYxJH7c4HdVXUHQJJ3AVsAw70D43p1sNQniWmaWpqWWqelztU0zf9Gqarx3mFyLnBmVf1oW3858B1V9dp5/bYB29rqM4HPHuYuTwT+4zBvO60c89HBMR8dljPmp1bV2oU2TOLIPQu0PeIZpKq2A9uXvbNkpqo2Lfd+poljPjo45qPDpMY8ic+5zwKnDK2vB/ZOYD+SpIOYRLh/HNiY5GlJjgXOB3ZOYD+SpIMY+7RMVT2U5LXA3zD4KOTbq+rWce9nyLKndqaQYz46OOajw0TGPPY3VCVJq89zy0hShwx3SerQ1IR7kjOTfDbJ7iQXL7D9uCRXtu03Jtmw8lWO1whjfn2SzyS5Jcl1SZ66GnWO02JjHup3bpJKMvUfmxtlzEl+qD3Wtyb505WucdxG+Nv+hiTXJ/lE+/s+ezXqHJckb0+yL8mnD7I9SS5r/x63JDlt2TutqiP+wuCN2c8BTweOBT4JPHtenx8H/qAtnw9cudp1r8CYvw/42rb86qNhzK3fY4EPA7uATatd9wo8zhuBTwBPaOsnrXbdKzDm7cCr2/KzgTtXu+5ljvl7gNOATx9k+9nAXzH4ntBm4Mbl7nNajty/ekqDqvpf4MApDYZtAXa05XcDZyRZ6AtV02LRMVfV9VX1QFvdxeA7BdNslMcZ4NeA3wYeXMniJmSUMb8SeEtV3QdQVftWuMZxG2XMBTyuLT+eKf+uTFV9GLj3EF22AFfUwC7ghCQnL2ef0xLu64A9Q+uzrW3BPlX1ELAfeNKKVDcZo4x52FYGz/zTbNExJ3kOcEpVvX8lC5ugUR7nbwK+KclHk+xqZ12dZqOM+Y3Ay5LMAtcAP7Eypa2apf5/X9S0nM99lFMajHTagyky8niSvAzYBHzvRCuavEOOOcmjgEuBC1eqoBUwyuO8hsHUzOkMXp39fZJvqar7J1zbpIwy5pcC76iq30nyncA725i/MvnyVsXY82tajtxHOaXBV/skWcPgpdyhXgYd6UY6jUOSFwC/CLykqr64QrVNymJjfizwLcANSe5kMDe5c8rfVB31b/vqqvpSVf0rg5PsbVyh+iZhlDFvBa4CqKqPAcczOMFWr8Z+2pZpCfdRTmmwE7igLZ8LfKjaOxVTatExtymKP2QQ7NM+DwuLjLmq9lfViVW1oao2MHif4SVVNbM65Y7FKH/b72Pw5jlJTmQwTXPHilY5XqOM+S7gDIAkz2IQ7nMrWuXK2gm8on1qZjOwv6ruXtY9rva7yEt4t/ls4F8YvMv+i63tVxn854bBg//nwG7gH4Gnr3bNKzDmDwL3ADe3y87VrnnSY57X9wam/NMyIz7OAd7E4DcRPgWcv9o1r8CYnw18lMEnaW4GXrjaNS9zvH8G3A18icFR+lbgVcCrhh7jt7R/j0+N4+/a0w9IUoemZVpGkrQEhrskdchwl6QOGe6S1CHDXZI6ZLhLUocMd0nq0P8BUMBOFFP0AMIAAAAASUVORK5CYII=\n", | 201 | "image/png": "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\n", |
202 | "text/plain": [ | 202 | "text/plain": [ |
203 | "<Figure size 432x288 with 1 Axes>" | 203 | "<Figure size 432x288 with 1 Axes>" |
204 | ] | 204 | ] |
@@ -210,7 +210,7 @@ | |||
210 | }, | 210 | }, |
211 | { | 211 | { |
212 | "data": { | 212 | "data": { |
213 | "image/png": "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\n", | 213 | "image/png": "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\n", |
214 | "text/plain": [ | 214 | "text/plain": [ |
215 | "<Figure size 432x288 with 1 Axes>" | 215 | "<Figure size 432x288 with 1 Axes>" |
216 | ] | 216 | ] |
@@ -227,7 +227,7 @@ | |||
227 | }, | 227 | }, |
228 | { | 228 | { |
229 | "cell_type": "code", | 229 | "cell_type": "code", |
230 | "execution_count": 13, | 230 | "execution_count": 5, |
231 | "metadata": { | 231 | "metadata": { |
232 | "scrolled": true | 232 | "scrolled": true |
233 | }, | 233 | }, |
@@ -236,176 +236,8 @@ | |||
236 | "name": "stdout", | 236 | "name": "stdout", |
237 | "output_type": "stream", | 237 | "output_type": "stream", |
238 | "text": [ | 238 | "text": [ |
239 | "['EAttribute', 'EGenericType', 'ETypeParameter', 'EPackage', 'EOperation', 'EStringToStringMapEntry', 'EEnum', 'EDataType', 'EClass', 'EReference', 'EObject', 'EEnumLiteral', 'EAnnotation', 'EParameter']\n" | 239 | "[]\n" |
240 | ] | 240 | ] |
241 | }, | ||
242 | { | ||
243 | "data": { | ||
244 | "image/png": "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\n", | ||
245 | "text/plain": [ | ||
246 | "<Figure size 432x288 with 1 Axes>" | ||
247 | ] | ||
248 | }, | ||
249 | "metadata": { | ||
250 | "needs_background": "light" | ||
251 | }, | ||
252 | "output_type": "display_data" | ||
253 | }, | ||
254 | { | ||
255 | "data": { | ||
256 | "image/png": "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\n", | ||
257 | "text/plain": [ | ||
258 | "<Figure size 432x288 with 1 Axes>" | ||
259 | ] | ||
260 | }, | ||
261 | "metadata": { | ||
262 | "needs_background": "light" | ||
263 | }, | ||
264 | "output_type": "display_data" | ||
265 | }, | ||
266 | { | ||
267 | "data": { | ||
268 | "image/png": "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\n", | ||
269 | "text/plain": [ | ||
270 | "<Figure size 432x288 with 1 Axes>" | ||
271 | ] | ||
272 | }, | ||
273 | "metadata": { | ||
274 | "needs_background": "light" | ||
275 | }, | ||
276 | "output_type": "display_data" | ||
277 | }, | ||
278 | { | ||
279 | "data": { | ||
280 | "image/png": "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\n", | ||
281 | "text/plain": [ | ||
282 | "<Figure size 432x288 with 1 Axes>" | ||
283 | ] | ||
284 | }, | ||
285 | "metadata": { | ||
286 | "needs_background": "light" | ||
287 | }, | ||
288 | "output_type": "display_data" | ||
289 | }, | ||
290 | { | ||
291 | "data": { | ||
292 | "image/png": "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\n", | ||
293 | "text/plain": [ | ||
294 | "<Figure size 432x288 with 1 Axes>" | ||
295 | ] | ||
296 | }, | ||
297 | "metadata": { | ||
298 | "needs_background": "light" | ||
299 | }, | ||
300 | "output_type": "display_data" | ||
301 | }, | ||
302 | { | ||
303 | "data": { | ||
304 | "image/png": "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\n", | ||
305 | "text/plain": [ | ||
306 | "<Figure size 432x288 with 1 Axes>" | ||
307 | ] | ||
308 | }, | ||
309 | "metadata": { | ||
310 | "needs_background": "light" | ||
311 | }, | ||
312 | "output_type": "display_data" | ||
313 | }, | ||
314 | { | ||
315 | "data": { | ||
316 | "image/png": "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\n", | ||
317 | "text/plain": [ | ||
318 | "<Figure size 432x288 with 1 Axes>" | ||
319 | ] | ||
320 | }, | ||
321 | "metadata": { | ||
322 | "needs_background": "light" | ||
323 | }, | ||
324 | "output_type": "display_data" | ||
325 | }, | ||
326 | { | ||
327 | "data": { | ||
328 | "image/png": "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\n", | ||
329 | "text/plain": [ | ||
330 | "<Figure size 432x288 with 1 Axes>" | ||
331 | ] | ||
332 | }, | ||
333 | "metadata": { | ||
334 | "needs_background": "light" | ||
335 | }, | ||
336 | "output_type": "display_data" | ||
337 | }, | ||
338 | { | ||
339 | "data": { | ||
340 | "image/png": "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\n", | ||
341 | "text/plain": [ | ||
342 | "<Figure size 432x288 with 1 Axes>" | ||
343 | ] | ||
344 | }, | ||
345 | "metadata": { | ||
346 | "needs_background": "light" | ||
347 | }, | ||
348 | "output_type": "display_data" | ||
349 | }, | ||
350 | { | ||
351 | "data": { | ||
352 | "image/png": "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\n", | ||
353 | "text/plain": [ | ||
354 | "<Figure size 432x288 with 1 Axes>" | ||
355 | ] | ||
356 | }, | ||
357 | "metadata": { | ||
358 | "needs_background": "light" | ||
359 | }, | ||
360 | "output_type": "display_data" | ||
361 | }, | ||
362 | { | ||
363 | "data": { | ||
364 | "image/png": "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\n", | ||
365 | "text/plain": [ | ||
366 | "<Figure size 432x288 with 1 Axes>" | ||
367 | ] | ||
368 | }, | ||
369 | "metadata": { | ||
370 | "needs_background": "light" | ||
371 | }, | ||
372 | "output_type": "display_data" | ||
373 | }, | ||
374 | { | ||
375 | "data": { | ||
376 | "image/png": "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\n", | ||
377 | "text/plain": [ | ||
378 | "<Figure size 432x288 with 1 Axes>" | ||
379 | ] | ||
380 | }, | ||
381 | "metadata": { | ||
382 | "needs_background": "light" | ||
383 | }, | ||
384 | "output_type": "display_data" | ||
385 | }, | ||
386 | { | ||
387 | "data": { | ||
388 | "image/png": "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\n", | ||
389 | "text/plain": [ | ||
390 | "<Figure size 432x288 with 1 Axes>" | ||
391 | ] | ||
392 | }, | ||
393 | "metadata": { | ||
394 | "needs_background": "light" | ||
395 | }, | ||
396 | "output_type": "display_data" | ||
397 | }, | ||
398 | { | ||
399 | "data": { | ||
400 | "image/png": "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\n", | ||
401 | "text/plain": [ | ||
402 | "<Figure size 432x288 with 1 Axes>" | ||
403 | ] | ||
404 | }, | ||
405 | "metadata": { | ||
406 | "needs_background": "light" | ||
407 | }, | ||
408 | "output_type": "display_data" | ||
409 | } | 241 | } |
410 | ], | 242 | ], |
411 | "source": [ | 243 | "source": [ |
@@ -421,7 +253,7 @@ | |||
421 | }, | 253 | }, |
422 | { | 254 | { |
423 | "cell_type": "code", | 255 | "cell_type": "code", |
424 | "execution_count": 4, | 256 | "execution_count": 6, |
425 | "metadata": {}, | 257 | "metadata": {}, |
426 | "outputs": [], | 258 | "outputs": [], |
427 | "source": [ | 259 | "source": [ |
@@ -448,7 +280,7 @@ | |||
448 | }, | 280 | }, |
449 | { | 281 | { |
450 | "cell_type": "code", | 282 | "cell_type": "code", |
451 | "execution_count": 29, | 283 | "execution_count": 7, |
452 | "metadata": {}, | 284 | "metadata": {}, |
453 | "outputs": [ | 285 | "outputs": [ |
454 | { | 286 | { |
@@ -482,7 +314,7 @@ | |||
482 | }, | 314 | }, |
483 | { | 315 | { |
484 | "cell_type": "code", | 316 | "cell_type": "code", |
485 | "execution_count": 30, | 317 | "execution_count": 8, |
486 | "metadata": {}, | 318 | "metadata": {}, |
487 | "outputs": [], | 319 | "outputs": [], |
488 | "source": [ | 320 | "source": [ |
@@ -496,7 +328,7 @@ | |||
496 | }, | 328 | }, |
497 | { | 329 | { |
498 | "cell_type": "code", | 330 | "cell_type": "code", |
499 | "execution_count": 31, | 331 | "execution_count": 9, |
500 | "metadata": {}, | 332 | "metadata": {}, |
501 | "outputs": [], | 333 | "outputs": [], |
502 | "source": [ | 334 | "source": [ |
@@ -541,70 +373,34 @@ | |||
541 | }, | 373 | }, |
542 | { | 374 | { |
543 | "cell_type": "code", | 375 | "cell_type": "code", |
544 | "execution_count": 20, | 376 | "execution_count": 21, |
545 | "metadata": {}, | 377 | "metadata": {}, |
546 | "outputs": [ | 378 | "outputs": [], |
547 | { | ||
548 | "name": "stdout", | ||
549 | "output_type": "stream", | ||
550 | "text": [ | ||
551 | "466\n", | ||
552 | "30\n", | ||
553 | "100\n", | ||
554 | "198\n" | ||
555 | ] | ||
556 | }, | ||
557 | { | ||
558 | "data": { | ||
559 | "text/plain": [ | ||
560 | "(array([107., 37., 18., 16., 8., 2., 3., 2., 3., 2.]),\n", | ||
561 | " array([ 30. , 73.6, 117.2, 160.8, 204.4, 248. , 291.6, 335.2, 378.8,\n", | ||
562 | " 422.4, 466. ]),\n", | ||
563 | " <a list of 10 Patch objects>)" | ||
564 | ] | ||
565 | }, | ||
566 | "execution_count": 20, | ||
567 | "metadata": {}, | ||
568 | "output_type": "execute_result" | ||
569 | }, | ||
570 | { | ||
571 | "data": { | ||
572 | "image/png": "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\n", | ||
573 | "text/plain": [ | ||
574 | "<Figure size 432x288 with 1 Axes>" | ||
575 | ] | ||
576 | }, | ||
577 | "metadata": { | ||
578 | "needs_background": "light" | ||
579 | }, | ||
580 | "output_type": "display_data" | ||
581 | } | ||
582 | ], | ||
583 | "source": [ | 379 | "source": [ |
584 | "import matplotlib.pyplot as plt\n", | 380 | "import matplotlib.pyplot as plt\n", |
585 | "from shutil import copyfile\n", | 381 | "from shutil import copyfile\n", |
586 | "import statistics \n", | 382 | "import statistics \n", |
587 | "\n", | 383 | "\n", |
588 | "graphStats = getModels('../input/human_30_500_no_xml/', 1500)\n", | 384 | "graphStats = getModels('../input/human/', 1500)\n", |
589 | "sizes = []\n", | 385 | "sizes = []\n", |
590 | "filenames = reader.readmultiplefiles('../input/human/', 1500, False)\n", | 386 | "filenames = reader.readmultiplefiles('../input/human/', 1500, False)\n", |
591 | "count = 1\n", | 387 | "count = 1\n", |
592 | "# for filename in filenames:\n", | 388 | "for filename in filenames:\n", |
593 | "# graphStat = GraphStat(filename)\n", | 389 | " graphStat = GraphStat(filename)\n", |
594 | "# size = graphStat.numNodes[0]\n", | 390 | " size = graphStat.numNodes[0]\n", |
595 | "# if size >= 30 and size <= 500 and not ('EAnnotation' in graphStat.nodeTypeStat.keys() and 'EStringToStringMapEntry' in graphStat.nodeTypeStat.keys()):\n", | 391 | " if size >= 30 and size <= 500 and not ('EAnnotation' in graphStat.nodeTypeStat.keys() and 'EStringToStringMapEntry' in graphStat.nodeTypeStat.keys()):\n", |
596 | "# copyfile(filename, filename.replace('human', 'human_30_500_no_xml'))\n", | 392 | " copyfile(filename, filename.replace('human', 'human_30_500_no_xml'))\n", |
597 | " \n", | 393 | " \n", |
598 | " \n", | 394 | " \n", |
599 | "for g in graphStats:\n", | 395 | "# for g in graphStats:\n", |
600 | " size = g.numNodes[0]\n", | 396 | "# size = g.numNodes[0]\n", |
601 | " if size >= 30 and size <= 500 and not ('EAnnotation' in g.nodeTypeStat.keys() and 'EStringToStringMapEntry' in g.nodeTypeStat.keys()):\n", | 397 | "# if size >= 30 and size <= 500 and not ('EAnnotation' in g.nodeTypeStat.keys() and 'EStringToStringMapEntry' in g.nodeTypeStat.keys()):\n", |
602 | " sizes.append(g.numNodes[0])\n", | 398 | "# sizes.append(g.numNodes[0])\n", |
603 | "print(max(sizes))\n", | 399 | "# print(max(sizes))\n", |
604 | "print(min(sizes))\n", | 400 | "# print(min(sizes))\n", |
605 | "print(statistics.mean(sizes))\n", | 401 | "# print(statistics.mean(sizes))\n", |
606 | "print(len(sizes))\n", | 402 | "# print(len(sizes))\n", |
607 | "plt.hist(sizes, bins=10)\n" | 403 | "# plt.hist(sizes, bins=10)\n" |
608 | ] | 404 | ] |
609 | }, | 405 | }, |
610 | { | 406 | { |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py b/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py index 6e707108..cf532bc5 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/DistributionMetrics.py | |||
@@ -5,6 +5,16 @@ def ks_distance(samples1, samples2): | |||
5 | value, p = stats.ks_2samp(samples1, samples2) | 5 | value, p = stats.ks_2samp(samples1, samples2) |
6 | return (value, p) | 6 | return (value, p) |
7 | 7 | ||
8 | def manual_ks(pdf1, pdf2): | ||
9 | result = 0 | ||
10 | sum1 = 0 | ||
11 | sum2 = 0 | ||
12 | for(a, b) in zip(pdf1, pdf2): | ||
13 | sum1 += a | ||
14 | sum2 += b | ||
15 | result = max(result, abs(sum1-sum2)) | ||
16 | return result | ||
17 | |||
8 | def js_distance(samples1, samples2): | 18 | def js_distance(samples1, samples2): |
9 | map1 = fromSamples(samples1) | 19 | map1 = fromSamples(samples1) |
10 | map2 = fromSamples(samples2) | 20 | map2 = fromSamples(samples2) |
diff --git a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py index 0a9a95c5..41054294 100644 --- a/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py +++ b/Metrics/Metrics-Calculation/metrics_plot/utils/GraphType.py | |||
@@ -10,6 +10,7 @@ class GraphCollection: | |||
10 | self.out_ds = [] | 10 | self.out_ds = [] |
11 | self.nas = [] | 11 | self.nas = [] |
12 | self.mpcs = [] | 12 | self.mpcs = [] |
13 | self.nts = [] | ||
13 | self.name = name | 14 | self.name = name |
14 | models = reader.readmultiplefiles(path, number, shouldShuffle) | 15 | models = reader.readmultiplefiles(path, number, shouldShuffle) |
15 | print(len(models)) | 16 | print(len(models)) |
@@ -19,6 +20,8 @@ class GraphCollection: | |||
19 | self.out_ds.append(out_d) | 20 | self.out_ds.append(out_d) |
20 | self.nas.append(na) | 21 | self.nas.append(na) |
21 | self.mpcs.append(mpc) | 22 | self.mpcs.append(mpc) |
23 | if(constants.Node_TYPE_KEY in contents): | ||
24 | self.nts.append(contents[constants.Node_TYPE_KEY]) | ||
22 | 25 | ||
23 | #Graph stat for one graph | 26 | #Graph stat for one graph |
24 | class GraphStat: | 27 | class GraphStat: |