From 775e76368b8826ec74b17196b5079c7a06a035ed Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Mon, 24 Jun 2019 10:19:53 -0400 Subject: add sample domain for measuring realistic metrics --- .../mcgill/ecse/socialnetwork/plugin/Queries.vql | 54 +++++++++ .../ca/mcgill/ecse/socialnetwork/runner/Main.java | 128 +++++++++++++++++++++ .../ecse/socialnetwork/runner/Persisitence.java | 63 ++++++++++ .../ecse/socialnetwork/runner/RunnerTests.java | 18 +++ .../socialnetwork/runner/SocialNetworkModel.java | 62 ++++++++++ .../ecse/socialnetwork/runner/YakinduumModel.java | 52 +++++++++ 6 files changed, 377 insertions(+) create mode 100644 Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/plugin/Queries.vql create mode 100644 Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java create mode 100644 Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Persisitence.java create mode 100644 Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/RunnerTests.java create mode 100644 Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/SocialNetworkModel.java create mode 100644 Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/YakinduumModel.java (limited to 'Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill') diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/plugin/Queries.vql b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/plugin/Queries.vql new file mode 100644 index 00000000..3e7fc68c --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/plugin/Queries.vql @@ -0,0 +1,54 @@ +package ca.mcgill.ecse.socialnetwork.plugin + +import epackage "http://ecse.mcgill.ca/socialnetwork" + +//@Constraint(message="terminatorAndInformation", severity="error", key={T}) +//pattern terminatorAndInformation(T : FAMTerminator, I : InformationLink) = { +// FunctionalOutput.outgoingLinks(Out,I); +// FunctionalOutput.terminator(Out,T); +//} or { +// InformationLink.to(I,In); +// FunctionalInput.terminator(In,T); +//} + +@Constraint(message="singleFriendship", severity="error", key={p1}) +pattern singleFriendship(p1: Person) { + find friendship(p1, p); + neg find friendship(p, p1); +} + +//@Constraint(message="cycle", severity="error", key={p}) +//pattern cycleInParenthood(p: Person) { +// find isAncestor(p, p); +//} + +@Constraint(message="noFriend", severity="error", key={p}) +pattern noFriend(p: Person){ + neg find friendship(p, _); +} + +//@Constraint(message="brothhoodParent", severity="error", key={p1,p2}) +//pattern brothhoodParent(p1: Person, p2: Person){ +// Person.parents(p1, parent1); +// Person.parents(p2, parent2); +// parent1 == parent2; +// find isAncestor(p1, p2); +//} +@Constraint(message="selfFriend", severity="error", key={p}) +pattern selfFriend(p: Person){ + Person.friends(p,p); +} + +pattern friendship(p1: Person, p2: Person){ + Person.friends(p1,p2); +} + +//pattern isAncestor(person : Person, ancestor : Person){ +// Person.parents(person, ancestor); +//} or { +// Person.parents(person, parent); +// find isAncestor(parent, ancestor); +//} + + + diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java new file mode 100644 index 00000000..72ea45d1 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java @@ -0,0 +1,128 @@ +package ca.mcgill.ecse.socialnetwork.runner; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintStream; +import java.util.ArrayList; + +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.Domain; +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance; +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.EMFGraph; +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter; +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.GraphReader; +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.metrics.MetricSampleGroup; +import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.validation.ViolationCheck; +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage; +import socialnetwork.Person; + +public class Main { + + private static String runWithPath(String path) { + String message = StandaloneScriptExecutor.executeScript(path); + return message; + } + + public static void main(String args[]) { +// try { + + ArrayList> output = new ArrayList>(); + output.add(prepareInfo()); + CsvFileWriter.write(output, "yakinduum/info.csv"); + //YakinduumModel.init(); + generateModel(1); +// }catch(Exception e) { +// e.printStackTrace(); +// }finally { +// outDegreeStatistic(); +// } +// outDegreeStatistic(); + + } + + public static void generateModel(int run) { + //prepare initial info + long begin = System.currentTimeMillis(); + String message = runWithPath("yakinduGeneration.vsconfig"); + + + + if(message == null) { + ArrayList> output = new ArrayList>(); + long elapsed = System.currentTimeMillis() - begin; + String time = formatTime(elapsed); + + ArrayList infoOutput = new ArrayList(); + infoOutput.add(run+ ""); + infoOutput.add(time); + infoOutput.addAll(calculateMetric()); + + YakinduumModel model = new YakinduumModel("output/Viatra_100/1.xmi"); + int violationCount = ViolationCheck.calculateViolationCounts(model.yakinduum); + infoOutput.add(violationCount + ""); + + //save model to another directory + model.save("yakinduum/" + run + ".xmi"); + + output.add(infoOutput); + CsvFileWriter.append(output, "yakinduum/info.csv"); + System.out.println("Finished"); + } + + } + + public static ArrayList calculateMetric() { + //read model and metric + ArrayList output = new ArrayList(); + GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE); + EMFGraph graph = reader.readModels("output/Viatra_100/").get(0); + + //KS distance + KSDistance ks = new KSDistance(Domain.Yakinduum); + + //calculate and put metric data to output array + MetricSampleGroup samples = graph.evaluateAllMetricsToSamples(); + output.add(graph.getStatistic().getAllNodes().size() + ""); + output.add(ks.outDegreeDistance(samples.outDegreeSamples) + ""); + output.add(ks.naDistance(samples.naSamples)+ ""); + output.add(ks.mpcDistance(samples.mpcSamples) + ""); + return output; + } + + public static ArrayList prepareInfo() { + ArrayList info = new ArrayList(); + info.add("ID"); + info.add("Time"); + info.add("# of Nodes"); + info.add("Out Degree"); + info.add("Node Activity"); + info.add("MPC"); + info.add("Violations"); + return info; + } + + public static String formatTime(long time) { + long mili = time % 1000; + long second = (time / 1000) % 60; + long minute = (time / (1000 * 60)); + return String.format("%d : %d.%d", minute, second, mili); + } + + public static void statistics() { + String uri = "output/1.xmi"; + SocialNetworkModel socialNetwork = new SocialNetworkModel(uri); + System.out.println(socialNetwork.getPersons().size()); + + File file = new File("model/statistics/output.txt"); + try { + @SuppressWarnings("resource") + PrintStream out = new PrintStream(file); + for(Person p : socialNetwork.getPersons()) { + out.println(p.getFriends().size()); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + System.out.println("Output Finished"); + } +} diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Persisitence.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Persisitence.java new file mode 100644 index 00000000..3ebede25 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Persisitence.java @@ -0,0 +1,63 @@ +package ca.mcgill.ecse.socialnetwork.runner; +import java.io.IOException; +import java.util.Collections; +import java.util.Map; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +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; + +public class Persisitence { + private String uri; + + public Persisitence (String suffix, String uri){ + //prepare to save + Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; + Map m = reg.getExtensionToFactoryMap(); + m.put(suffix, new XMIResourceFactoryImpl()); + this.uri = uri; + } + + + /** + * Save the model + * @return whether the model has saved successfully + */ + public boolean save(G model) { + //create resource + ResourceSet resSet = new ResourceSetImpl(); + Resource resource = resSet.createResource(URI.createURI(uri)); + resource.getContents().add(model); + try { + resource.save(Collections.EMPTY_MAP); + return true; + }catch(IOException e) { + e.printStackTrace(); + return false; + } + } + + /** + * load the model from persistent + * @return: the model loaded + */ + @SuppressWarnings("unchecked") + public G load() { + G model = null; +// try { + ResourceSet resSet = new ResourceSetImpl(); + Resource resource = resSet.getResource(URI.createURI(uri), true); + model = (G) resource.getContents().get(0); +// }catch (org.eclipse.emf.common.util.WrappedException e) { +// // if the file cannot be found then return null +// if(e.getCause().getClass() == java.io.FileNotFoundException.class) { +// return null; +// } +// } + + return model; + } +} diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/RunnerTests.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/RunnerTests.java new file mode 100644 index 00000000..c09c55be --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/RunnerTests.java @@ -0,0 +1,18 @@ +package ca.mcgill.ecse.socialnetwork.runner; + +import org.junit.Test; + +import hu.bme.mit.inf.dslreasoner.application.execution.StandaloneScriptExecutor; + +public class RunnerTests { + private static String runWithPath(String path) { + String message = StandaloneScriptExecutor.executeScript(path); + return message; + } + + @Test + public void generateModel() { + String message = runWithPath("SocialNetworkGeneration.vsconfig"); + System.out.println(message); + } +} diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/SocialNetworkModel.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/SocialNetworkModel.java new file mode 100644 index 00000000..51c50b11 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/SocialNetworkModel.java @@ -0,0 +1,62 @@ +package ca.mcgill.ecse.socialnetwork.runner; + +import org.eclipse.emf.common.util.EList; + +import socialnetwork.Person; +import socialnetwork.SocialNetwork; +import socialnetwork.SocialnetworkFactory; +import socialnetwork.SocialnetworkPackage; +import socialnetwork.impl.SocialnetworkFactoryImpl; + + + +public class SocialNetworkModel { + private final static String SUFFIX = "xmi"; + + private static boolean isInit = false; + + public static void init() { + SocialnetworkFactory.eINSTANCE.eClass(); + SocialnetworkPackage.eINSTANCE.eClass(); + SocialnetworkFactoryImpl.init(); + } + + // container for the social network model + public SocialNetwork socialNetwork; + + // factory for social network model + SocialnetworkFactory factory; + + // persistent + Persisitence persistence; + + + public SocialNetworkModel(String uri){ + if(!isInit) { + init(); + } + + //create persistence + persistence = new Persisitence(SUFFIX, uri); + factory = SocialnetworkFactory.eINSTANCE; + // try load the model + this.socialNetwork = persistence.load(); + if(this.socialNetwork == null) { + this.socialNetwork = factory.createSocialNetwork(); + } + } + + public Person createPerson() { + Person p = factory.createPerson(); + socialNetwork.getPersons().add(p); + return p; + } + + public EList getPersons(){ + return socialNetwork.getPersons(); + } + + public boolean save() { + return persistence.save(socialNetwork); + } +} diff --git a/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/YakinduumModel.java b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/YakinduumModel.java new file mode 100644 index 00000000..803daff4 --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/YakinduumModel.java @@ -0,0 +1,52 @@ +package ca.mcgill.ecse.socialnetwork.runner; + +import javax.annotation.Resource; + +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.Statechart; +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummFactory; +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.YakindummPackage; +import hu.bme.mit.inf.dslreasoner.domains.yakindu.sgraph.yakindumm.impl.YakindummFactoryImpl; +import socialnetwork.SocialNetwork; +import socialnetwork.SocialnetworkFactory; + +public class YakinduumModel { + private final static String SUFFIX = "xmi"; + + private static boolean isInit = false; + + private String uri; + + public static void init() { + YakindummFactory.eINSTANCE.eClass(); + YakindummPackage.eINSTANCE.eClass(); + YakindummFactoryImpl.init(); + } + + // container for the social network model + public Statechart yakinduum; + + + // persistent + Persisitence persistence; + + + public YakinduumModel(String uri){ + if(!isInit) { + init(); + } + this.uri = uri; + //create persistence + persistence = new Persisitence(SUFFIX, uri); + // try load the model + this.yakinduum = persistence.load(); + } + + public boolean save(String uri) { + if(this.uri.equals(uri)) { + return persistence.save(yakinduum); + }else { + persistence = new Persisitence(SUFFIX, uri); + return persistence.save(yakinduum); + } + } +} -- cgit v1.2.3-54-g00ecf