// //Copyright (C) 2008 United States Government as represented by the //Administrator of the National Aeronautics and Space Administration //(NASA). All Rights Reserved. // //This software is distributed under the NASA Open Source Agreement //(NOSA), version 1.3. The NOSA has been approved by the Open Source //Initiative. See the file NOSA-1.3-JPF at the top of the distribution //directory tree for the complete NOSA document. // //THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY //KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT //LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO //SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR //A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT //THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT //DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. // package gov.nasa.jpf.search.heuristic; import gov.nasa.jpf.Config; import gov.nasa.jpf.util.Predicate; import gov.nasa.jpf.vm.ThreadInfo; import gov.nasa.jpf.vm.VM; /** * a heuristic that is based on static priorities that are determined * at state storage time */ public abstract class SimplePriorityHeuristic extends HeuristicSearch { StaticPriorityQueue queue; protected Predicate<ThreadInfo> aliveThread; public SimplePriorityHeuristic (Config config, VM vm) { super(config,vm); queue = new StaticPriorityQueue(config); aliveThread = new Predicate<ThreadInfo>() { public boolean isTrue (ThreadInfo ti) { return (ti.isAlive()); } }; } protected abstract int computeHeuristicValue (); protected int computeAstarPathCost (VM vm) { return vm.getPathLength(); } protected HeuristicState queueCurrentState () { int heuristicValue; if (vm.isInterestingState()) { heuristicValue = 0; } else if (vm.isBoringState()) { heuristicValue = Integer.MAX_VALUE; } else { heuristicValue = computeHeuristicValue(); if (useAstar) { // <2do> we probably don't want this for isInteresting/isBoring? heuristicValue += computeAstarPathCost(vm); } } PrioritizedState hState = new PrioritizedState(vm,heuristicValue); queue.add(hState); return hState; } protected HeuristicState getNextQueuedState () { //HeuristicState hState = queue.pollFirst(); // only Java 1.6 //if (isBeanSearch) { queue.clear(); } //return hState; if (queue.size() == 0) { // the dreaded Java 1.5 version return null; } HeuristicState hState = queue.first(); if (isBeamSearch) { queue.clear(); } else { queue.remove(hState); } return hState; } public int getQueueSize() { return queue.size(); } public boolean isQueueLimitReached() { return queue.isQueueLimitReached(); } }