From 70c86c76a13283d432361d381cf467f67ee7d454 Mon Sep 17 00:00:00 2001 From: 20001LastOrder Date: Mon, 17 Jun 2019 12:21:39 -0400 Subject: estimate value function with simple linear regression --- .../app/PartialInterpretationMetric.xtend | 58 ---------- .../app/PartialInterpretationMetricDistance.xtend | 122 +++++++++++++++++++++ .../metrics/calculator/distance/CostDistance.xtend | 29 +++++ 3 files changed, 151 insertions(+), 58 deletions(-) create mode 100644 Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend create mode 100644 Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/CostDistance.xtend (limited to 'Metrics') 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 index 71fa5fed..5e62b586 100644 --- 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 @@ -24,40 +24,6 @@ class PartialInterpretationMetric { def static void initPaths(){ new File("debug/metric/").mkdir(); new File("debug/metric/trajectories/").mkdir(); - ks = new KSDistance(Domain.Yakinduum); - js = new JSDistance(Domain.Yakinduum); - } - - def static MetricDistanceGroup calculateMetricDistance(PartialInterpretation partial){ - val metrics = new ArrayList(); - metrics.add(new OutDegreeMetric()); - metrics.add(new NodeActivityMetric()); - metrics.add(new MultiplexParticipationCoefficientMetric()); - - val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); - var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); - - var mpc = js.mpcDistance(metricSamples.mpcSamples); - var na = js.naDistance(metricSamples.naSamples); - var outDegree = js.outDegreeDistance(metricSamples.outDegreeSamples); - - return new MetricDistanceGroup(mpc, na, outDegree); - } - - def static MetricDistanceGroup calculateMetricDistanceKS(PartialInterpretation partial){ - val metrics = new ArrayList(); - metrics.add(new OutDegreeMetric()); - metrics.add(new NodeActivityMetric()); - metrics.add(new MultiplexParticipationCoefficientMetric()); - - 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); - - return new MetricDistanceGroup(mpc, na, outDegree); } // calculate the metrics for a state @@ -116,28 +82,4 @@ class PartialInterpretationMetric { } } } -} - -class MetricDistanceGroup{ - var double mpcDistance; - var double naDistance; - var double outDegreeDistance; - - new(double mpcDistance, double naDistance, double outDegreeDistance){ - this.mpcDistance = mpcDistance; - this.naDistance = naDistance; - this.outDegreeDistance = outDegreeDistance; - } - - def double getMPCDistance(){ - return this.mpcDistance - } - - def double getNADistance(){ - return this.naDistance - } - - def double getOutDegreeDistance(){ - return this.outDegreeDistance - } } \ 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/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 new file mode 100644 index 00000000..b63451e8 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/app/PartialInterpretationMetricDistance.xtend @@ -0,0 +1,122 @@ +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.distance.StateData +import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.graph.PartialInterpretationGraph +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.util.ArrayList +import java.util.HashMap +import java.util.Map +import org.apache.commons.math3.stat.regression.SimpleRegression +import java.util.stream.DoubleStream.Builder + +class PartialInterpretationMetricDistance { + + var KSDistance ks; + var JSDistance js; + var Map stateAndHistory; + var SimpleRegression regression; + + + new(){ + ks = new KSDistance(Domain.Yakinduum); + js = new JSDistance(Domain.Yakinduum); + regression = new SimpleRegression(); + stateAndHistory = new HashMap(); + } + + def MetricDistanceGroup calculateMetricDistanceKS(PartialInterpretation partial){ + val metrics = new ArrayList(); + metrics.add(new OutDegreeMetric()); + metrics.add(new NodeActivityMetric()); + metrics.add(new MultiplexParticipationCoefficientMetric()); + + 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); + + return new MetricDistanceGroup(mpc, na, outDegree); + } + + def MetricDistanceGroup calculateMetricDistance(PartialInterpretation partial){ + val metrics = new ArrayList(); + metrics.add(new OutDegreeMetric()); + metrics.add(new NodeActivityMetric()); + metrics.add(new MultiplexParticipationCoefficientMetric()); + + val metricCalculator = new PartialInterpretationGraph(partial, metrics, null); + var metricSamples = metricCalculator.evaluateAllMetricsToSamples(); + + var mpc = js.mpcDistance(metricSamples.mpcSamples); + var na = js.naDistance(metricSamples.naSamples); + var outDegree = js.outDegreeDistance(metricSamples.outDegreeSamples); + + return new MetricDistanceGroup(mpc, na, outDegree); + } + + def resetRegression(Object state){ + regression = new SimpleRegression(); + + if(stateAndHistory.containsKey(state)){ + var data = stateAndHistory.get(state); + regression.addData(data.numOfNodeFeature, data.value); + + while(stateAndHistory.containsKey(data.lastState)){ + data = stateAndHistory.get(data.lastState); + regression.addData(data.numOfNodeFeature, data.value); + } + } + } + + def feedData(Object state, int numOfNodes, double value, Object lastState){ + var data = new StateData(numOfNodes, value, lastState); + stateAndHistory.put(state, data); + regression.addData(data.numOfNodeFeature, data.value); + } + + def getPredictionForNextDataSample(int numOfNodes, double value, int numberOfNodesToPredict){ + var data = new StateData(numOfNodes, value, null); + regression.addData(data.numOfNodeFeature, data.value); + + var prediction = predict(numberOfNodesToPredict); + regression.removeData(data.numOfNodeFeature, data.value); + return prediction; + } + + def predict(int numOfNodes){ + var data = new StateData(numOfNodes, 0, null); + return regression.predict(data.numOfNodeFeature); + } +} + +class MetricDistanceGroup{ + var double mpcDistance; + var double naDistance; + var double outDegreeDistance; + + new(double mpcDistance, double naDistance, double outDegreeDistance){ + this.mpcDistance = mpcDistance; + this.naDistance = naDistance; + this.outDegreeDistance = outDegreeDistance; + } + + def double getMPCDistance(){ + return this.mpcDistance + } + + def double getNADistance(){ + return this.naDistance + } + + def double getOutDegreeDistance(){ + return this.outDegreeDistance + } +} \ 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/CostDistance.xtend b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/CostDistance.xtend new file mode 100644 index 00000000..ee856201 --- /dev/null +++ b/Metrics/Metrics-Calculation/ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator/src/ca/mcgill/ecse/dslreasoner/realistic/metrics/calculator/distance/CostDistance.xtend @@ -0,0 +1,29 @@ +package ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.distance + +import org.apache.commons.math3.stat.regression.SimpleRegression +import org.eclipse.xtend.lib.annotations.Accessors + +class CostDistance { + + var SimpleRegression regression; + + new(){ + regression = new SimpleRegression(true); + } + +} + +class StateData{ + @Accessors(PUBLIC_GETTER) + var double numOfNodeFeature; + @Accessors(PUBLIC_GETTER) + var double value; + @Accessors(PUBLIC_GETTER) + var Object lastState; + + new(int numOfNode, double value, Object lastState){ + this.numOfNodeFeature = 1.0 / numOfNode; + this.value = value + this.lastState = lastState; + } +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf