From 59ef2d4560cde4954c5e1f850958c0ca59c742df Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Tue, 16 Jul 2019 10:54:25 -0400 Subject: consider node types during generation --- .../realistic/metrics/calculator/app/Main.xtend | 2 +- .../app/PartialInterpretationMetricDistance.xtend | 21 +++++++++------ .../metrics/calculator/graph/EMFGraph.xtend | 23 ++++++++++++++++- .../metrics/calculator/graph/GraphStatistic.xtend | 6 ++++- .../graph/PartialInterpretationGraph.xtend | 15 ++++++++--- .../metrics/calculator/io/GraphReader.xtend | 30 ++++++++++++++++------ .../calculator/metrics/NodeTypeMetric.xtend | 12 ++++----- 7 files changed, 79 insertions(+), 30 deletions(-) (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src') 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 58ac7aea..b1986d50 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 @@ -35,7 +35,7 @@ class Main { //human input has different package declaration // reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); - val human = new RWInformation("inputs/config7/", "outputs/", 1); + val human = new RWInformation("Inputs/config15/", "outputs/", 1); calculateAllModels(human.inputFolder, human.outputFolder,human.numRuns, reader); 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 cdce185a..d68eb9d2 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 @@ -18,6 +18,7 @@ import java.util.List import java.util.Map import org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression import org.eclipse.xtend.lib.annotations.Accessors +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric class PartialInterpretationMetricDistance { @@ -48,17 +49,17 @@ class PartialInterpretationMetricDistance { metrics.add(new OutDegreeMetric()); metrics.add(new NodeActivityMetric()); metrics.add(new MultiplexParticipationCoefficientMetric()); - metrics.add(new TypedOutDegree()); - + metrics.add(new NodeTypeMetric()); val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); var mpc = ks.mpcDistance(metricSamples.mpcSamples); var na = ks.naDistance(metricSamples.naSamples); var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples); - var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); - - return new MetricDistanceGroup(mpc, na, outDegree, typedOutDegree); + //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); + var distance = new MetricDistanceGroup(mpc, na, outDegree); + distance.nodeTypeInfo = metricSamples.nodeTypeSamples; + return distance; } def MetricDistanceGroup calculateMetricEuclidean(PartialInterpretation partial){ @@ -66,7 +67,6 @@ class PartialInterpretationMetricDistance { metrics.add(new OutDegreeMetric()); metrics.add(new NodeActivityMetric()); metrics.add(new MultiplexParticipationCoefficientMetric()); - metrics.add(new TypedOutDegree()); val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); @@ -158,8 +158,8 @@ class PartialInterpretationMetricDistance { var features = newDoubleArrayOfSize(2); //constant term features.set(0, 1); - - features.set(1, 1.0 / step); + features.set(0, Math.sqrt(step) + 30) + features.set(1, 1.0 / (step + 30) ); // features.set(2, violations); // features.set(3, Math.pow(violations, 2)); @@ -172,6 +172,7 @@ class MetricDistanceGroup{ var double naDistance; var double outDegreeDistance; var double typedOutDegreeDistance; + protected var HashMap nodeTypeInfo; new(double mpcDistance, double naDistance, double outDegreeDistance, double typedOutDegreeDistance){ this.mpcDistance = mpcDistance; @@ -201,4 +202,8 @@ class MetricDistanceGroup{ def double getOutDegreeDistance(){ return this.outDegreeDistance } + + def double getNodeTypePercentage(String typeName){ + return nodeTypeInfo.getOrDefault(typeName, 0.0); + } } \ No newline at end of file diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend index b4c57bd8..4ebd59b7 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/EMFGraph.xtend @@ -30,13 +30,26 @@ class EMFGraph extends Graph{ ] referenceTypes.forEach[it| - statistic.addEdgeType(it.name); + var typeToAdd = it; + + // TODO: Here is to only consider one part of opposite edges +// if(it.upperBound != -1 && it.EOpposite !== null && +// (it.EOpposite.upperBound == -1 || it.EOpposite.upperBound > it.upperBound +// )){ +// typeToAdd = it.EOpposite; +// } + //if(!typeToAdd.name.equals('incomingTransitions')){ + statistic.addEdgeType(typeToAdd.name); + //} ]; objects.forEach[source| source.eClass.EAllReferences.forEach[r| //add the type first (if it is not added already) //many references +// if(r.name.equals('incomingTransitions')){ +// return; +// } if(r.isMany){ source.getNeighbours(r).forEach[target| addEdge(source, target, r); @@ -85,6 +98,14 @@ class EMFGraph extends Graph{ } def addEdge(EObject source, EObject target, EReference r){ + // TODO: Here is to only consider one part of opposite edges + //check for the opposite reference and do not add if its opposite will be added +// if(r.upperBound != -1 && r.EOpposite !== null && +// (r.EOpposite.upperBound == -1 || r.EOpposite.upperBound > r.upperBound +// )){ +// return; +// } + if(target !== null && r !== null){ statistic.addEdge(source, target, r.name); } diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend index 9b8fd0e3..84071176 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/GraphStatistic.xtend @@ -8,6 +8,7 @@ import java.util.List import java.util.Map import java.util.Set import org.eclipse.emf.ecore.EObject +import org.eclipse.emf.ecore.EReference class GraphStatistic { val incomingEdges = new HashMap>; @@ -21,9 +22,12 @@ class GraphStatistic { * @param type: type to add */ def void addEdgeType(String type){ + + if(edgeTypes.contains(type)){ - return; + return; } + edgeTypes.add(type); incomingEdges.put(type, ArrayListMultimap.create()); outcomingEdges.put(type, ArrayListMultimap.create()); diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend index 91d7c5f9..bb679bf6 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/graph/PartialInterpretationGraph.xtend @@ -19,7 +19,11 @@ class PartialInterpretationGraph extends Graph{ //the edge types are defined in terms of RelationDeclaration partial.problem.relations.filter(RelationDeclaration).forEach[ //only need the name of the reference type (remove everything with and after "reference") - this.statistic.addEdgeType(it.name.split(" ").get(0)); + var n = it.name.split(" ").get(0); + // TODO: Here is to only consider one part of opposite edges + //if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){ + this.statistic.addEdgeType(n); + //} ] // add all elements val typeInterpretations = getTypes(partial); @@ -33,9 +37,12 @@ class PartialInterpretationGraph extends Graph{ for(relationInterpretation : partial.partialrelationinterpretation) { //only need the name of the reference type (remove everything with and after "reference") val type = relationInterpretation.interpretationOf.name.split(" ").get(0); - for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ - statistic.addEdge(edge.param1, edge.param2, type); - } + // TODO: Here is to only consider one part of opposite edges + //if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){ + for(edge : relationInterpretation.relationlinks.filter(BinaryElementRelationLink)){ + statistic.addEdge(edge.param1, edge.param2, type); + } + //} } this.name = name; diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend index 8f1feb9d..ffec372b 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/GraphReader.xtend @@ -1,10 +1,13 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io; import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.EdgeTypeMetric import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MultiplexParticipationCoefficientMetric import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeActivityMetric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.OutDegreeMetric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedOutDegree import java.io.File import java.io.FileNotFoundException import java.util.ArrayList @@ -17,19 +20,11 @@ import org.eclipse.emf.ecore.resource.Resource import org.eclipse.emf.ecore.resource.ResourceSet import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.NodeTypeMetric -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.EdgeTypeMetric -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.TypedOutDegree -import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage class GraphReader{ val ResourceSet resSet = new ResourceSetImpl(); val referenceTypes = new ArrayList(); - def static void main(String[] args){ - var g = new GraphReader(YakindummPackage.eINSTANCE); - } - new(EPackage metaModel) { Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl) @@ -73,6 +68,25 @@ class GraphReader{ return graphs; } + def EMFGraph readModel(String path, String filename){ + val metrics = new ArrayList(); + metrics.add(new OutDegreeMetric()); + metrics.add(new NodeActivityMetric()); + metrics.add(new MultiplexParticipationCoefficientMetric()); + metrics.add(new TypedOutDegree()); + metrics.add(new NodeTypeMetric()); + metrics.add(new EdgeTypeMetric()); + + val file = new File(filename); + val roots = readModel(EObject, path, file.name); + //add a list of metrics + val g = new EMFGraph(); + for(root : roots){ + g.init(root, metrics, filename.replaceFirst(".xmi", ""), referenceTypes); + } + return g + } + def List readModel(Class type, String path, String name) { try { val resource = resSet.getResource(getURI(path, name),true); diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/NodeTypeMetric.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/NodeTypeMetric.xtend index 94eaa445..7cec2513 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/NodeTypeMetric.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/metrics/NodeTypeMetric.xtend @@ -28,13 +28,11 @@ class NodeTypeMetric extends Metric { var map = new HashMap(); var nodes = g.allNodes; var single = 1.0 / nodes.size(); - for(node : nodes){ - var classes = new ArrayList(node.eClass.ESuperTypes); - classes.add(node.eClass); - - for(cl : classes){ - var value = map.getOrDefault(cl.name, 0.0); - map.put(cl.name, value + single); + var nodeToType = g.nodeToTypesMap; + for(node : nodes){ + for(cl : nodeToType.get(node)){ + var value = map.getOrDefault(cl, 0.0); + map.put(cl, value + single); } } -- cgit v1.2.3-54-g00ecf