From 5e8b8c3a817dd9f7ae46338b6dbd3684dfb885fe Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Wed, 31 Jul 2019 14:45:06 -0400 Subject: Further development of realistic solver, create generation config for ecore models --- .../realistic/metrics/calculator/app/Main.xtend | 6 ++-- .../app/PartialInterpretationMetricDistance.xtend | 28 ++++++++++-------- .../calculator/distance/EuclideanDistance.xtend | 11 ++++---- .../metrics/calculator/distance/JSDistance.xtend | 18 +++++++----- .../metrics/calculator/distance/KSDistance.xtend | 33 +++++++++++++++++----- .../metrics/calculator/graph/EMFGraph.xtend | 12 +++----- .../graph/PartialInterpretationGraph.xtend | 17 ++++++----- .../metrics/calculator/io/GraphReader.xtend | 12 ++++---- .../metrics/calculator/io/RepMetricsReader.xtend | 18 ++++++++++-- 9 files changed, 99 insertions(+), 56 deletions(-) (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill') 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 b1986d50..062d69fa 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 @@ -5,6 +5,7 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl import java.util.ArrayList +import org.eclipse.emf.ecore.EcorePackage //import yakindumm2.impl.Yakindumm2PackageImpl @@ -24,18 +25,19 @@ class Main { def static void main(String[] args){ //init model YakindummPackageImpl.eINSTANCE.eClass; + EcorePackage.eINSTANCE.eClass; // Yakindumm2PackageImpl.eINSTANCE.eClass; //val infos = initData(); println("Start Reading Models..."); - var reader = new GraphReader(YakindummPackageImpl.eINSTANCE); + var reader = new GraphReader(EcorePackage.eINSTANCE, ".xmi"); // for(info : infos){ // calculateAllModels(info.inputFolder, info.outputFolder,info.numRuns, reader); // } //human input has different package declaration // reader = new GraphReader(Yakindumm2PackageImpl.eINSTANCE); - val human = new RWInformation("Inputs/config15/", "outputs/", 1); + val human = new RWInformation("Inputs/viatra75/", "outputs/", 50); 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 d68eb9d2..66dcdff6 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 @@ -5,11 +5,13 @@ import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.JSDistan import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.StateData import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.Metric +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup 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 ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.predictor.LinearModel import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation import java.util.ArrayList @@ -18,7 +20,6 @@ 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 { @@ -28,15 +29,17 @@ class PartialInterpretationMetricDistance { var Map stateAndHistory; var OLSMultipleLinearRegression regression; List samples; - + var MetricSampleGroup g; @Accessors(PUBLIC_GETTER) var LinearModel linearModel; new(){ - ks = new KSDistance(Domain.Yakinduum); - js = new JSDistance(Domain.Yakinduum); - ed = new EuclideanDistance(Domain.Yakinduum); + var metrics = RepMetricsReader.read(Domain.Yakinduum); + this.g = metrics; + ks = new KSDistance(g); + js = new JSDistance(g); + ed = new EuclideanDistance(g); regression = new OLSMultipleLinearRegression(); regression.noIntercept = false; stateAndHistory = new HashMap(); @@ -56,8 +59,9 @@ class PartialInterpretationMetricDistance { var mpc = ks.mpcDistance(metricSamples.mpcSamples); var na = ks.naDistance(metricSamples.naSamples); var outDegree = ks.outDegreeDistance(metricSamples.outDegreeSamples); + var nodeType = ks.nodeTypeDistance(metricSamples.nodeTypeSamples); //var typedOutDegree = ks.typedOutDegreeDistance(metricSamples.typedOutDegreeSamples); - var distance = new MetricDistanceGroup(mpc, na, outDegree); + var distance = new MetricDistanceGroup(mpc, na, outDegree, nodeType); distance.nodeTypeInfo = metricSamples.nodeTypeSamples; return distance; } @@ -171,14 +175,14 @@ class MetricDistanceGroup{ var double mpcDistance; var double naDistance; var double outDegreeDistance; - var double typedOutDegreeDistance; + var double nodeTypeDistance; protected var HashMap nodeTypeInfo; - new(double mpcDistance, double naDistance, double outDegreeDistance, double typedOutDegreeDistance){ + new(double mpcDistance, double naDistance, double outDegreeDistance, double nodeTypeDistance){ this.mpcDistance = mpcDistance; this.naDistance = naDistance; this.outDegreeDistance = outDegreeDistance; - this.typedOutDegreeDistance = typedOutDegreeDistance; + this.nodeTypeDistance = nodeTypeDistance; } new(double mpcDistance, double naDistance, double outDegreeDistance){ @@ -187,8 +191,8 @@ class MetricDistanceGroup{ this.outDegreeDistance = outDegreeDistance; } - def double getTypedOutDegreeDistance(){ - return this.typedOutDegreeDistance; + def double getNodeTypeDistance(){ + return this.nodeTypeDistance; } def double getMPCDistance(){ diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend index b945d97b..d6adcc9a 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/EuclideanDistance.xtend @@ -18,13 +18,12 @@ class EuclideanDistance extends CostDistance{ var HashMap outDegreePMF; var DecimalFormat formatter; - new(Domain d){ - var metrics = RepMetricsReader.read(d); - this.g = metrics; + new(MetricSampleGroup g){ + this.g = g; - var mpcSamples = metrics.mpcSamples; - var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); - var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); + var mpcSamples = g.mpcSamples; + var naSamples = g.naSamples.stream.mapToDouble([it]).toArray(); + var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray(); //needs to format the number to string avoid precision issue formatter = new DecimalFormat("#0.00000"); diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend index df65b81f..4a0a0dc3 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/JSDistance.xtend @@ -1,7 +1,6 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup import com.google.common.collect.Sets import java.text.DecimalFormat import java.util.HashMap @@ -11,13 +10,13 @@ class JSDistance extends CostDistance { var HashMap mpcPMF; var HashMap naPMF; var HashMap outDegreePMF; + var HashMap nodeTypesPMF; var DecimalFormat formatter; - new(Domain d){ - var metrics = RepMetricsReader.read(d); - var mpcSamples = metrics.mpcSamples; - var naSamples = metrics.naSamples.stream.mapToDouble([it]).toArray(); - var outDegreeSamples = metrics.outDegreeSamples.stream.mapToDouble([it]).toArray(); + new(MetricSampleGroup g){ + var mpcSamples = g.mpcSamples; + var naSamples = g.naSamples.stream.mapToDouble([it]).toArray(); + var outDegreeSamples = g.outDegreeSamples.stream.mapToDouble([it]).toArray(); //needs to format the number to string avoid precision issue formatter = new DecimalFormat("#0.00000"); @@ -25,6 +24,7 @@ class JSDistance extends CostDistance { mpcPMF = pmfFromSamples(mpcSamples, formatter); naPMF = pmfFromSamples(naSamples, formatter); outDegreePMF = pmfFromSamples(outDegreeSamples, formatter); + nodeTypesPMF = g.nodeTypeSamples; } def private combinePMF(HashMap pmf1, HashMap pmf2){ @@ -81,4 +81,8 @@ class JSDistance extends CostDistance { if(map.size < 2) return 1; return jsDivergence(map, outDegreePMF); } + + def nodeTypeDistance(HashMap samples){ + return klDivergence(samples, nodeTypesPMF); + } } \ 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/distance/KSDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend index 86f5f23c..08d8704a 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/KSDistance.xtend @@ -1,22 +1,18 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain -import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.RepMetricsReader import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup import java.util.HashMap import java.util.HashSet import java.util.List -import java.util.Set import org.apache.commons.math3.stat.inference.KolmogorovSmirnovTest class KSDistance extends CostDistance { var static ksTester = new KolmogorovSmirnovTest(); var MetricSampleGroup g; - new(Domain d){ - var metrics = RepMetricsReader.read(d); - this.g = metrics; - } + new(MetricSampleGroup g){ + this.g = g; + } override double mpcDistance(List samples){ //if the size of array is smaller than 2, ks distance cannot be performed, simply return 1 if(samples.size < 2) return 1; @@ -63,4 +59,27 @@ class KSDistance extends CostDistance { return value; } + + def nodeTypeDistance(HashMap samples){ + var typesDistMap = g.nodeTypeSamples; + var sourceDist = newArrayList(); + var instanceDist = newArrayList(); + + for(key : typesDistMap.keySet()){ + sourceDist.add(typesDistMap.get(key)); + instanceDist.add(samples.getOrDefault(key, 0.0)); + } + + // Since we already know the pdf, we compute the ks-test manully + var ksStatistics = 0.0; + var sum1 = 0.0; + var sum2 = 0.0; + for(var i = 0; i < sourceDist.size(); i++){ + sum1 += sourceDist.get(i); + sum2 += instanceDist.get(i); + + ksStatistics = Math.max(ksStatistics, Math.abs(sum1 - sum2)); + } + return ksStatistics; + } } \ 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 4ebd59b7..959006f4 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 @@ -24,7 +24,8 @@ class EMFGraph extends Graph{ */ def void init(List objects, List metrics, String name, List referenceTypes){ objects.forEach[it| - var types = new HashSet(it.eClass.EAllSuperTypes.map[it|it.name]); + // TODO: Maybe want to consider all the super types as well + var types = new HashSet(); types.add(it.eClass.name); statistic.addNodeWithAllTypes(it, types); ] @@ -38,18 +39,13 @@ class EMFGraph extends Graph{ // )){ // typeToAdd = it.EOpposite; // } - //if(!typeToAdd.name.equals('incomingTransitions')){ - statistic.addEdgeType(typeToAdd.name); - //} +// + 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); 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 bb679bf6..ef68f366 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 @@ -21,16 +21,19 @@ class PartialInterpretationGraph extends Graph{ //only need the name of the reference type (remove everything with and after "reference") 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')*/){ + if(!n.equals('target') && !n.equals('source') /* && !n.equals('incomingTransitions')*/){ this.statistic.addEdgeType(n); - //} + } ] // add all elements val typeInterpretations = getTypes(partial); for(type : typeInterpretations){ - var typeName = type.interpretationOf.name.replace(classSuffix, ''); - for(node : type.elements){ - this.statistic.addNodeWithType(node, typeName); + //Only consider the most concrete class + if(type.interpretationOf.subtypes.size == 0){ + var typeName = type.interpretationOf.name.replace(classSuffix, ''); + for(node : type.elements){ + this.statistic.addNodeWithType(node, typeName); + } } } @@ -38,11 +41,11 @@ class PartialInterpretationGraph extends Graph{ //only need the name of the reference type (remove everything with and after "reference") val type = relationInterpretation.interpretationOf.name.split(" ").get(0); // TODO: Here is to only consider one part of opposite edges - //if(!type.equals('target') && !type.equals('source') /*&& !type.equals('incomingTransitions')*/){ + 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 ffec372b..491501b0 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 @@ -24,9 +24,11 @@ import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl class GraphReader{ val ResourceSet resSet = new ResourceSetImpl(); val referenceTypes = new ArrayList(); + var String suffix; - new(EPackage metaModel) { + new(EPackage metaModel, String suffix) { Resource.Factory.Registry.INSTANCE.extensionToFactoryMap.put("*",new XMIResourceFactoryImpl) + this.suffix = suffix; //find all reference types in the meta model metaModel.eAllContents.forEach[ @@ -52,14 +54,14 @@ class GraphReader{ metrics.add(new NodeTypeMetric()); metrics.add(new EdgeTypeMetric()); - //check all files in the directory with xmi - for(String name : dir.list.filter[it| it.endsWith(".xmi")]){ + //check all files in the directory with suffix + for(String name : dir.list.filter[it| it.endsWith(suffix)]){ val file = new File(name); val roots = readModel(EObject, path, file.name); //add a list of metrics val g = new EMFGraph(); for(root : roots){ - g.init(root, metrics, name.replaceFirst(".xmi", ""), referenceTypes); + g.init(root, metrics, name.replaceFirst(suffix, ""), referenceTypes); } graphs.add(g); @@ -82,7 +84,7 @@ class GraphReader{ //add a list of metrics val g = new EMFGraph(); for(root : roots){ - g.init(root, metrics, filename.replaceFirst(".xmi", ""), referenceTypes); + g.init(root, metrics, filename.replaceFirst(suffix, ""), referenceTypes); } return g } diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend index 2ea12581..6af0b6c7 100644 --- a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/io/RepMetricsReader.xtend @@ -3,13 +3,14 @@ package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummPackageImpl +import java.util.HashMap /** * Read the sample of the distribution of a metric provided the csv file of the metric */ class RepMetricsReader { static def read(Domain d){ - var reader = new GraphReader(YakindummPackageImpl.eINSTANCE); + var reader = new GraphReader(YakindummPackageImpl.eINSTANCE, '.xmi'); var domainRepPath = DataName.REP_PATH + d.name + '/'; @@ -20,7 +21,20 @@ class RepMetricsReader { rep.naSamples = readMetrics(reader, domainRepPath + DataName.NA_REP).naSamples; rep.typedOutDegreeSamples = out_d.typedOutDegreeSamples; rep.edgeTypeSamples = out_d.edgeTypeSamples; - rep.nodeTypeSamples = out_d.nodeTypeSamples; + + //TODO: Parameterize the prior node distribution + var nodeTypeSamples = new HashMap(); + nodeTypeSamples.put('Entry', 0.04257802080554814); + nodeTypeSamples.put('Choice', 0.1267671379034409); + nodeTypeSamples.put('State', 0.1596092291277674); + nodeTypeSamples.put('Transition', 0.6138636969858629); + nodeTypeSamples.put('Statechart', 0.010136036276340358); + nodeTypeSamples.put('Region', 0.04467858095492131); + nodeTypeSamples.put('Exit', 0.0018338223526273673); + nodeTypeSamples.put('FinalState', 0.0005334755934915977); + + + rep.nodeTypeSamples = nodeTypeSamples; return rep; } -- cgit v1.2.3-54-g00ecf