diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/hu.bme.mit.inf.dslreasoner.viatrasolver.reasoner/src')
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 | ||
27 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.MetricDistanceGroup; | 27 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.MetricDistanceGroup; |
28 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.PartialInterpretationMetric; | 28 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.PartialInterpretationMetric; |
29 | import ca.mcgill.ecse.dslreasoner.realistic.metrics.calculator.app.PartialInterpretationMetricDistance; | ||
29 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; | 30 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.DocumentationLevel; |
30 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner; | 31 | import hu.bme.mit.inf.dslreasoner.logic.model.builder.LogicReasoner; |
31 | import hu.bme.mit.inf.dslreasoner.logic.model.logicproblem.LogicProblem; | 32 | import 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) { |