aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
diff options
context:
space:
mode:
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java')
-rw-r--r--Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java110
1 files changed, 60 insertions, 50 deletions
diff --git a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
index 148cb243..d9f6f2aa 100644
--- a/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
+++ b/Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src/hu/bme/mit/inf/dslreasoner/viatrasolver/reasoner/dse/HillClimbingOnRealisticMetricStrategyForModelGeneration.java
@@ -26,6 +26,7 @@ import org.eclipse.viatra.query.runtime.api.ViatraQueryMatcher;
26 26
27import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.MetricDistanceGroup; 27import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.MetricDistanceGroup;
28import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.PartialInterpretationMetric; 28import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.PartialInterpretationMetric;
29import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.PartialInterpretationMetricDistance;
29import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; 30import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel;
30import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner; 31import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner;
31import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem; 32import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem;
@@ -62,12 +63,12 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
62 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> mayMatchers; 63 private Collection<ViatraQueryMatcher<? extends IPatternMatch>> mayMatchers;
63 private Map<Object, List<Object>> stateAndActivations; 64 private Map<Object, List<Object>> stateAndActivations;
64 private Map<TrajectoryWithFitness, Double> trajectoryFit; 65 private Map<TrajectoryWithFitness, Double> trajectoryFit;
65
66 // Statistics 66 // Statistics
67 private int numberOfStatecoderFail = 0; 67 private int numberOfStatecoderFail = 0;
68 private int numberOfPrintedModel = 0; 68 private int numberOfPrintedModel = 0;
69 private int numberOfSolverCalls = 0; 69 private int numberOfSolverCalls = 0;
70 70 private PartialInterpretationMetricDistance metricDistance;
71
71 public HillClimbingOnRealisticMetricStrategyForModelGeneration( 72 public HillClimbingOnRealisticMetricStrategyForModelGeneration(
72 ReasonerWorkspace workspace, 73 ReasonerWorkspace workspace,
73 ViatraReasonerConfiguration configuration, 74 ViatraReasonerConfiguration configuration,
@@ -112,7 +113,7 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
112 this.solutionStoreWithCopy = new SolutionStoreWithCopy(); 113 this.solutionStoreWithCopy = new SolutionStoreWithCopy();
113 this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement); 114 this.solutionStoreWithDiversityDescriptor = new SolutionStoreWithDiversityDescriptor(configuration.diversityRequirement);
114 115
115 final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper(); 116 //final ObjectiveComparatorHelper objectiveComparatorHelper = context.getObjectiveComparatorHelper();
116 trajectoryFit = new HashMap<TrajectoryWithFitness, Double>(); 117 trajectoryFit = new HashMap<TrajectoryWithFitness, Double>();
117 118
118 this.comparator = new Comparator<TrajectoryWithFitness>() { 119 this.comparator = new Comparator<TrajectoryWithFitness>() {
@@ -124,6 +125,7 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
124 125
125 trajectoiresToExplore = new PriorityQueue<TrajectoryWithFitness>(11, comparator); 126 trajectoiresToExplore = new PriorityQueue<TrajectoryWithFitness>(11, comparator);
126 stateAndActivations = new HashMap<Object, List<Object>>(); 127 stateAndActivations = new HashMap<Object, List<Object>>();
128 metricDistance = new PartialInterpretationMetricDistance();
127 } 129 }
128 130
129 @Override 131 @Override
@@ -145,11 +147,11 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
145 TrajectoryWithFitness currentTrajectoryWithFittness = new TrajectoryWithFitness(firstTrajectory, firstFittness); 147 TrajectoryWithFitness currentTrajectoryWithFittness = new TrajectoryWithFitness(firstTrajectory, firstFittness);
146 trajectoryFit.put(currentTrajectoryWithFittness, Double.MAX_VALUE); 148 trajectoryFit.put(currentTrajectoryWithFittness, Double.MAX_VALUE);
147 trajectoiresToExplore.add(currentTrajectoryWithFittness); 149 trajectoiresToExplore.add(currentTrajectoryWithFittness);
150 Object lastState = null;
148 151
149 //if(configuration) 152 //if(configuration)
150 visualiseCurrentState(); 153 visualiseCurrentState();
151 154
152 PartialInterpretationMetric.initPaths();
153 //create matcher 155 //create matcher
154 int count = 0; 156 int count = 0;
155 mainLoop: while (!isInterrupted && !configuration.progressMonitor.isCancelled()) { 157 mainLoop: while (!isInterrupted && !configuration.progressMonitor.isCancelled()) {
@@ -165,6 +167,9 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
165 logger.debug("New trajectory is chosen: " + currentTrajectoryWithFittness); 167 logger.debug("New trajectory is chosen: " + currentTrajectoryWithFittness);
166 } 168 }
167 context.getDesignSpaceManager().executeTrajectoryWithMinimalBacktrackWithoutStateCoding(currentTrajectoryWithFittness.trajectory); 169 context.getDesignSpaceManager().executeTrajectoryWithMinimalBacktrackWithoutStateCoding(currentTrajectoryWithFittness.trajectory);
170
171 // reset the regression for this trajectory
172 metricDistance.getLinearModel().resetRegression(context.getCurrentStateId());
168 } 173 }
169 } 174 }
170 175
@@ -178,10 +183,10 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
178 //init epsilon and draw 183 //init epsilon and draw
179 double epsilon = 0; 184 double epsilon = 0;
180 double draw = 1; 185 double draw = 1;
181 MetricDistanceGroup heuristics = PartialInterpretationMetric.calculateMetricDistanceKS(model); 186 MetricDistanceGroup heuristics = metricDistance.calculateMetricDistanceKS(model);
182 187
183 if(!stateAndActivations.containsKey(model)) { 188 if(!stateAndActivations.containsKey(context.getCurrentStateId())) {
184 stateAndActivations.put(model, new ArrayList<Object>()); 189 stateAndActivations.put(context.getCurrentStateId(), new ArrayList<Object>());
185 } 190 }
186 191
187 //Output intermediate model 192 //Output intermediate model
@@ -190,41 +195,26 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
190 draw = Math.random(); 195 draw = Math.random();
191 count++; 196 count++;
192 // cut off the trajectory for bad graph 197 // cut off the trajectory for bad graph
193 double distance = heuristics.getMPCDistance();
194 System.out.println("KS"); 198 System.out.println("KS");
195 System.out.println("NA distance: " + heuristics.getNADistance()); 199 System.out.println("NA distance: " + heuristics.getNADistance());
196 System.out.println("MPC distance: " + heuristics.getMPCDistance()); 200 System.out.println("MPC distance: " + heuristics.getMPCDistance());
197 System.out.println("Out degree distance:" + heuristics.getOutDegreeDistance()); 201 System.out.println("Out degree distance:" + heuristics.getOutDegreeDistance());
198 202
199 MetricDistanceGroup lsHeuristic = PartialInterpretationMetric.calculateMetricDistance(model); 203// MetricDistanceGroup lsHeuristic = metricDistance.calculateMetricDistance(model);
200 System.out.println("LS"); 204// System.out.println("LS");
201 System.out.println("NA distance: " + lsHeuristic.getNADistance()); 205// System.out.println("NA distance: " + lsHeuristic.getNADistance());
202 System.out.println("MPC distance: " + lsHeuristic.getMPCDistance()); 206// System.out.println("MPC distance: " + lsHeuristic.getMPCDistance());
203 System.out.println("Out degree distance:" + lsHeuristic.getOutDegreeDistance()); 207// System.out.println("Out degree distance:" + lsHeuristic.getOutDegreeDistance());
204
205 if(distance <= 0.23880597014925373 + 0.00001 && distance >= 0.23880597014925373 - 0.00001) {
206 context.backtrack();
207 final Fitness nextFitness = context.calculateFitness();
208 currentTrajectoryWithFittness = new TrajectoryWithFitness(context.getTrajectory().toArray(), nextFitness);
209 continue;
210 }
211 208
212 //check for next value when doing greedy move 209 //check for next value when doing greedy move
210
213 valueMap = sortWithWeight(activationIds, currentTrajectoryWithFittness.trajectory.length+1); 211 valueMap = sortWithWeight(activationIds, currentTrajectoryWithFittness.trajectory.length+1);
214// if(activationIds.isEmpty() || (model.getNewElements().size() >= 20 && valueMap.get(activationIds.get(0)) > currentValue && epsilon < draw)) {
215// context.backtrack();
216// final Fitness nextFitness = context.calculateFitness();
217// currentTrajectoryWithFittness = new TrajectoryWithFitness(context.getTrajectory().toArray(), nextFitness);
218// continue;
219// }
220 } 212 }
213 lastState = context.getCurrentStateId();
221 while (!isInterrupted && !configuration.progressMonitor.isCancelled() && activationIds.size() > 0) { 214 while (!isInterrupted && !configuration.progressMonitor.isCancelled() && activationIds.size() > 0) {
222 final Object nextActivation = drawWithEpsilonProbabilty(activationIds, valueMap, epsilon, draw); 215 final Object nextActivation = drawWithEpsilonProbabilty(activationIds, valueMap, epsilon, draw);
223// if (!iterator.hasNext()) { 216
224// logger.debug("Last untraversed activation of the state."); 217 stateAndActivations.get(context.getCurrentStateId()).add(nextActivation);
225// trajectoiresToExplore.remove(currentTrajectoryWithFittness);
226// }
227 stateAndActivations.get(context.getModel()).add(nextActivation);
228 logger.debug("Executing new activation: " + nextActivation); 218 logger.debug("Executing new activation: " + nextActivation);
229 context.executeAcitvationId(nextActivation); 219 context.executeAcitvationId(nextActivation);
230 visualiseCurrentState(); 220 visualiseCurrentState();
@@ -242,15 +232,17 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
242 logger.debug("Global contraint is not satisifed."); 232 logger.debug("Global contraint is not satisifed.");
243 context.backtrack(); 233 context.backtrack();
244 } else*/// { 234 } else*/// {
245 if(getNumberOfViolations(mustMatchers) > 8) { 235 /*if(getNumberOfViolations(mustMatchers) > 0) {
236 context.backtrack();
237 }else*/ if(model.getNewElements().size() > 90 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.3) {
246 context.backtrack(); 238 context.backtrack();
247 }else if(model.getNewElements().size() > 90 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.18) { 239 }else if(model.getNewElements().size() > 70 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.45) {
248 context.backtrack(); 240 context.backtrack();
249 }else if(model.getNewElements().size() > 70 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.36) { 241 } else if(model.getNewElements().size() > 50 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.60) {
250 context.backtrack(); 242 context.backtrack();
251 } else if(model.getNewElements().size() > 50 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.72) { 243 } else if(model.getNewElements().size() > 30 && heuristics.getNADistance() + heuristics.getMPCDistance() + heuristics.getOutDegreeDistance() > 0.70) {
252 context.backtrack(); 244 context.backtrack();
253 } else { 245 }else {
254 final Fitness nextFitness = context.calculateFitness(); 246 final Fitness nextFitness = context.calculateFitness();
255 247
256 // the only hard objectives are the size 248 // the only hard objectives are the size
@@ -271,9 +263,14 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
271 continue; 263 continue;
272 } 264 }
273 265
266
274 TrajectoryWithFitness nextTrajectoryWithFittness = new TrajectoryWithFitness( 267 TrajectoryWithFitness nextTrajectoryWithFittness = new TrajectoryWithFitness(
275 context.getTrajectory().toArray(), nextFitness); 268 context.getTrajectory().toArray(), nextFitness);
276 trajectoryFit.put(nextTrajectoryWithFittness, calculateCurrentStateValue(nextTrajectoryWithFittness.trajectory.length)); 269 int step = nextTrajectoryWithFittness.trajectory.length;
270 int violation = getNumberOfViolations(mustMatchers) + getNumberOfViolations(mayMatchers);
271 metricDistance.getLinearModel().feedData(context.getCurrentStateId(), metricDistance.calculateFeature(step, violation), calculateCurrentStateValue(step, violation), lastState);
272
273 trajectoryFit.put(nextTrajectoryWithFittness, calculateCurrentStateValue(step, violation));
277 trajectoiresToExplore.add(nextTrajectoryWithFittness); 274 trajectoiresToExplore.add(nextTrajectoryWithFittness);
278 275
279 int compare = objectiveComparatorHelper.compare(currentTrajectoryWithFittness.fitness, 276 int compare = objectiveComparatorHelper.compare(currentTrajectoryWithFittness.fitness,
@@ -298,9 +295,9 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
298 currentTrajectoryWithFittness = null; 295 currentTrajectoryWithFittness = null;
299 context.backtrack(); 296 context.backtrack();
300 } 297 }
301 PartialInterpretation model = (PartialInterpretation) context.getModel(); 298// PartialInterpretation model = (PartialInterpretation) context.getModel();
302 PartialInterpretationMetric.calculateMetric(model, "debug/metric/output", context.getCurrentStateId().toString(), count); 299// PartialInterpretationMetric.calculateMetric(model, "debug/metric/output", context.getCurrentStateId().toString(), count);
303 count++; 300// count++;
304 logger.info("Interrupted."); 301 logger.info("Interrupted.");
305 } 302 }
306 303
@@ -314,8 +311,8 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
314 // do hill climbing 311 // do hill climbing
315 for(Object id : activationIds) { 312 for(Object id : activationIds) {
316 context.executeAcitvationId(id); 313 context.executeAcitvationId(id);
317 314 int violation = getNumberOfViolations(mayMatchers) + getNumberOfViolations(mustMatchers);
318 valueMap.put(id, calculateCurrentStateValue(factor)); 315 valueMap.put(id, calculateFutureStateValue(factor, violation));
319 context.backtrack(); 316 context.backtrack();
320 } 317 }
321 318
@@ -323,14 +320,27 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
323 return valueMap; 320 return valueMap;
324 } 321 }
325 322
326 private double calculateCurrentStateValue(int factor) { 323 private double calculateFutureStateValue(int step, int violation) {
324 double currentValue = calculateCurrentStateValue(step, violation);
325 if(step > 40) {
326 double[] toPredict = metricDistance.calculateFeature(200, violation);
327 try {
328 return metricDistance.getLinearModel().getPredictionForNextDataSample(metricDistance.calculateFeature(step, violation), currentValue, toPredict);
329 }catch(IllegalArgumentException e) {
330 return currentValue;
331 }
332 }else {
333 return currentValue;
334 }
335 }
336
337 private double calculateCurrentStateValue(int factor, int violation) {
327 PartialInterpretation model = (PartialInterpretation) context.getModel(); 338 PartialInterpretation model = (PartialInterpretation) context.getModel();
328 MetricDistanceGroup g = PartialInterpretationMetric.calculateMetricDistanceKS(model); 339 MetricDistanceGroup g = metricDistance.calculateMetricDistanceKS(model);
329 340
330 int violations = getNumberOfViolations(mayMatchers); 341 double consistenceWeights = 1- 1.0/(1+violation);
331 double consistenceWeights = 1.0/(1+violations);
332 342
333 return(2.5 / Math.log(factor) * (g.getNADistance() + g.getMPCDistance() + g.getOutDegreeDistance()) + 1-consistenceWeights); 343 return( /*/ Math.log(factor)*/(g.getNADistance() + g.getMPCDistance() + g.getOutDegreeDistance()) + consistenceWeights);
334 } 344 }
335 345
336 private int getNumberOfViolations(Collection<ViatraQueryMatcher<? extends IPatternMatch>> matchers) { 346 private int getNumberOfViolations(Collection<ViatraQueryMatcher<? extends IPatternMatch>> matchers) {
@@ -379,8 +389,8 @@ public class HillClimbingOnRealisticMetricStrategyForModelGeneration implements
379 List<Object> activationIds; 389 List<Object> activationIds;
380 try { 390 try {
381 activationIds = new ArrayList<Object>(context.getCurrentActivationIds()); 391 activationIds = new ArrayList<Object>(context.getCurrentActivationIds());
382 if(stateAndActivations.containsKey(context.getModel())) { 392 if(stateAndActivations.containsKey(context.getCurrentStateId())) {
383 activationIds.removeAll(stateAndActivations.get(context.getModel())); 393 activationIds.removeAll(stateAndActivations.get(context.getCurrentStateId()));
384 } 394 }
385 Collections.shuffle(activationIds); 395 Collections.shuffle(activationIds);
386 } catch (NullPointerException e) { 396 } catch (NullPointerException e) {