public void searchGraph() {
    // Do some pre-processing to save each subthread the work
    
    List<Integer> initStates = new ArrayList<Integer>();
    for (int x = 0; x < graph.size(); x++) {
      if (graph.getInEdges(x).size() > 0 && graph.getOutEdges(x).size() > 0) {
        initStates.add(x);
      }
    }

    // Uncomment if using FastWalker
//    Set<Integer>[] fReachable = new Set[graph.size()];
//    Set<Integer>[] bReachable = new Set[graph.size()];
//    
//    for (int x = 0; x < graph.size(); x++) {
//      fReachable[x] = GraphUtils.searchForward(graph, x);
//      bReachable[x] = GraphUtils.searchBackward(graph, x);
//    }

    AtomicInteger maxLength = new AtomicInteger(INITIAL_CUTOFF);
    Lock fileLock = new ReentrantLock();

    System.out.println("Started Searching");
    for (int x = 0; x < threads; x++) {
      // Edit here to change walker type
      Walker walker;
      
      walker = new SlowWalker(graph, initStates, filename, maxLength, fileLock);
      
//      walker = new DeterministicWalker(graph, initStates, filename, maxLength, fileLock);    

//    walker = new FastWalker(graph, initStates, fReachable, bReachable,
//    filename, maxLength, fileLock);
      
      Thread search = new Thread(walker);
      search.start();
    }
  }