From 945f487a08b643392a5d5918c631640b9a0e4605 Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Tue, 3 Nov 2020 22:52:26 -0500 Subject: add realistic solver --- .../mcgill/ecse/socialnetwork/plugin/Queries.vql | 54 ++++++ .../ca/mcgill/ecse/socialnetwork/runner/Main.java | 203 +++++++++++++++++++++ .../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, 452 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..e4e5b61f --- /dev/null +++ b/Metrics/Metrics-Calculation/SocialNetwork_plugin/src/ca/mcgill/ecse/socialnetwork/runner/Main.java @@ -0,0 +1,203 @@ +package ca.mcgill.ecse.socialnetwork.runner; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Map; +import java.util.Scanner; + +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.io.RepMetricsReader; +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.yakindumm.YakindummPackage; +import socialnetwork.Person; + +public class Main { + + private static String runWithPath(String path) { + String message = StandaloneScriptExecutor.executeScript(path); + return message; + } + + private static String configFolder = "yakinduum/config22/"; + private static String configFileName = configFolder + "info_old_metric.csv"; + private static String aggregateViolationMeasureFileName = configFolder + "aggregateInfo.csv"; + private static String fileReadFolder = "output/Ecore_100/"; + + public static void main(String args[]) { + String ecoreFile = args[0]; + System.out.println("Generation Started"); + + System.out.println(System.getProperty("java.library.path")); + + long begin = System.currentTimeMillis(); + String message = runWithPath(ecoreFile); + long elapsed = System.currentTimeMillis() - begin; + + if(message != null) { + System.out.println(message); + return; + } +// ArrayList> output = new ArrayList>(); +// String time = formatTime(elapsed); +// ArrayList infoOutput = new ArrayList(); +// infoOutput.add(time); +// output.add(infoOutput); +// System.out.println(time); +// CsvFileWriter.write(output, configFileName); +// +// +// output = new ArrayList>(); +// output.add(prepareInfo()); +// CsvFileWriter.append(output, configFileName); +// +// for(int i = 0; i < 50; i++) { +// generateModel(i+1); +// } +// aggregateViolationMeasure(50); + System.out.println("Finished"); + } + +// public static void generateModel(int run) { +// String filename = run+"_1.xmi"; +// //prepare initial info +// ArrayList> output = new ArrayList>(); +// ArrayList infoOutput = new ArrayList(); +// infoOutput.add(run+ ""); +// infoOutput.addAll(calculateMetric(run)); +// +// YakinduumModel model = new YakinduumModel(fileReadFolder +"run" +run + "/" + filename); +// int violationCount = ViolationCheck.calculateViolationCounts(model.yakinduum); +// infoOutput.add(violationCount + ""); +// +// +// +// //save model to another directory +// model.save(configFolder + run + ".xmi"); +// output.add(infoOutput); +// CsvFileWriter.append(output, configFileName); +// } +// +// public static void singleModelViolationMeasure(int run) { +// String filename = run+"_1.xmi"; +// //prepare initial info +// ArrayList> output = new ArrayList>(); +// ArrayList infoOutput = new ArrayList(); +// infoOutput.add(run+ ""); +// +// YakinduumModel model = new YakinduumModel(fileReadFolder+"/run"+run+"/"+ filename); +// +// //parse map of violation counts to two list and add them to the result list +// Map map = ViolationCheck.violationMaps(model.yakinduum); +// ArrayList counts = new ArrayList(); +// ArrayList violationNames = new ArrayList(map.keySet()); +// for(int i = 0; i < violationNames.size(); i++) { +// String name = violationNames.get(i); +// int total = map.get(name); +// counts.add(total + ""); +// } +// output.add(infoOutput); +// output.add(violationNames); +// output.add(counts); +// +// CsvFileWriter.append(output, configFileName); +// } +// +// public static void aggregateViolationMeasure(int size) { +// ArrayList> output = new ArrayList>(); +// ArrayList counts = new ArrayList(); +// ArrayList violationNames = null; +// for(int run = 1; run < size+1; run++) { +// String filename = run+"_1.xmi"; +// YakinduumModel model = new YakinduumModel(fileReadFolder+"/run"+run+"/"+ filename); +// +// Map map = ViolationCheck.violationMaps(model.yakinduum); +// if(run == 1) { +// violationNames = new ArrayList(map.keySet()); +// for(int i = 0; i < violationNames.size(); i++) { +// String name = violationNames.get(i); +// int total = map.get(name); +// counts.add(total + ""); +// } +// }else { +// for(int i = 0; i < violationNames.size(); i++) { +// int count = Integer.parseInt(counts.get(i)); +// String name = violationNames.get(i); +// int total = count + map.get(name); +// counts.set(i, total + ""); +// } +// } +// } +// +// for(int i = 0; i < counts.size(); i++) { +// double count = Integer.parseInt(counts.get(i)) / (double) size; +// counts.set(i, count + ""); +// } +// +// output.add(violationNames); +// output.add(counts); +// CsvFileWriter.write(output, aggregateViolationMeasureFileName); +// } +// + public static ArrayList calculateMetric(int run) { + //read model and metric + ArrayList output = new ArrayList(); + GraphReader reader = new GraphReader(YakindummPackage.eINSTANCE, ".xmi"); + EMFGraph graph = reader.readModel(fileReadFolder+"/run"+run, run + "_1.xmi"); + MetricSampleGroup metrics = RepMetricsReader.read(Domain.Yakindumm); + //KS distance + KSDistance ks = new KSDistance(metrics); + + //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) + ""); + output.add(ks.typedOutDegreeDistance(samples.typedOutDegreeSamples) + ""); + return output; + } + + public static ArrayList prepareInfo() { + ArrayList info = new ArrayList(); + info.add("ID"); + info.add("# of Nodes"); + info.add("Out Degree"); + info.add("Node Activity"); + info.add("MPC"); + info.add("Typed Out Degree"); + 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