/**
  * An actor is a quasi-static actor if 1) it has a tree-structured FSM. 2) all feedback
  * transitions return back to the initial state. 3) a state does not terminate.
  *
  * @return
  */
 private boolean isQuasiStaticActor() {
   ActorSchedule schedule = mActor.getImplementation().getSchedule();
   State initialState = schedule.getInitialState();
   for (Transition transition : initialState.getTransitions()) {
     State dstState = transition.getTargetState();
     List<State> visitedStates = new ArrayList<State>();
     visitedStates.add(dstState);
     if (!isQuasiStaticBranch(initialState, dstState, visitedStates)) return false;
   }
   return true;
 }
 /**
  * Checks if the guards of those non-deterministic actions matches the following format. Guards
  * are of the form <M "op" C [ (and/or) M "op" C]> where M is a port variable, "op" is "=, !=, <=,
  * >=, <, >" and C is a constant.
  */
 public boolean areNonDeterministicStatesSimplyGuarded() {
   ActorSchedule schedule = mActor.getImplementation().getSchedule();
   for (State state : schedule.getStates()) {
     if (state.getTransitions().size() > 1) {
       for (Transition transition : state.getTransitions()) {
         Action action = transition.getAction();
         if (!action.hasGuard()) return false;
         Guard guard = action.getGuard();
         Map<InputLookAhead, UnionOfDisjointIntervals> modeSet = guard.matchScenarioAwareGuard();
         if (modeSet == null) return false;
       }
     }
   }
   return true;
 }
  private boolean isQuasiStaticBranch(State initialState, State state, List<State> visitedStates) {
    // Trivial case is a one-state FSM.
    if (state == initialState) return true;

    // Check if state does not terminate.
    // This should actually check if the guards of the actions
    // of a state fully cover the test space.
    if (getPotentiallyTerminalStates().contains(state)) return false;

    // Check for tree-like topology.
    for (Transition transition : state.getTransitions()) {
      State dstState = transition.getTargetState();
      if (dstState == initialState) {
        continue;
      } else if (visitedStates.contains(dstState)) {
        return false;
      } else {
        List<State> newBranch = new ArrayList<State>(visitedStates);
        newBranch.add(dstState);
        if (!isQuasiStaticBranch(initialState, dstState, newBranch)) return false;
      }
    }
    return true;
  }