From 945f487a08b643392a5d5918c631640b9a0e4605 Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Tue, 3 Nov 2020 22:52:26 -0500 Subject: add realistic solver --- .../app/PartialInterpretationMetric.xtend | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend (limited to 'Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend') diff --git a/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend new file mode 100644 index 00000000..5e62b586 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetric.xtend @@ -0,0 +1,85 @@ +package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app + +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.JSDistance +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance.KSDistance +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.io.CsvFileWriter +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.OutDegreeMetric +import hu.bme.mit.inf.dslreasoner.viatrasolver.partialinterpretationlanguage.partialinterpretation.PartialInterpretation +import java.io.File +import java.io.FileNotFoundException +import java.io.PrintWriter +import java.util.ArrayList +import java.util.List +import org.eclipse.emf.ecore.util.EcoreUtil +import org.eclipse.viatra.dse.api.Solution + +class PartialInterpretationMetric { + var static KSDistance ks; + var static JSDistance js; + + def static void initPaths(){ + new File("debug/metric/").mkdir(); + new File("debug/metric/trajectories/").mkdir(); + } + + // calculate the metrics for a state + def static void calculateMetric(PartialInterpretation partial, String path, String currentStateId, Integer counter){ + val metrics = new ArrayList(); + metrics.add(new OutDegreeMetric()); + metrics.add(new NodeActivityMetric()); + metrics.add(new MultiplexParticipationCoefficientMetric()); + + //make dir since the folder can be none existing + new File(path).mkdir(); + val filename = path + "/state_"+currentStateId+"-"+counter+".csv"; + val metricCalculator = new PartialInterpretationGraph(partial, metrics, currentStateId); + + CsvFileWriter.write(metricCalculator.evaluateAllMetrics(), filename); + } + + def static void outputTrajectories(PartialInterpretation empty, List solutions){ + for(solution : solutions){ + + //need to copy the empty solution because the transition directly worked on the graph + val emptySolutionCopy = EcoreUtil.copy(empty) + val trajectory = solution.shortestTrajectory; + trajectory.model = emptySolutionCopy + + // state codes that will record the trajectory + val stateCodes = newArrayList() + var counter = 0 + + //transform and record the state codes for each state + while(trajectory.doNextTransformation){ + //println(trajectory.stateCoder.createStateCode) + val stateId = trajectory.stateCoder.createStateCode.toString + val interpretation = trajectory.getModel(); + println(stateId) + //calculate metrics of current state + calculateMetric(interpretation as PartialInterpretation, "debug/metric/output", stateId, counter) + stateCodes.add(stateId) + counter++ + } + + + //output the trajectory + try{ + new File("debug/metric/trajectories/").mkdir(); + val path = "debug/metric/trajectories/trajectory"+trajectory.stateCoder.createStateCode.toString+".csv" + val PrintWriter writer = new PrintWriter(new File(path)) + val output = new StringBuilder + for(stateCode : stateCodes){ + output.append(stateCode+'\n') + } + writer.write(output.toString()) + writer.close() + }catch(FileNotFoundException e) { + e.printStackTrace() + } + } + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf