protected void initialNodes(
      SymmetricGame base,
      Queue<FormationSearchNode<SymmetricGame, Set<Action>>> queue,
      Map<Set<Action>, FormationSearchNode<SymmetricGame, Set<Action>>> nodes,
      int bound) {

    for (Action action : actions) {

      Set<Action> strategySpace = new HashSet<Action>();

      strategySpace.add(action);

      SymmetricGame game = new ActionReducedSymmetricGame(base, strategySpace);

      if (1 <= bound) {
        double epsilon = rationalizableFinder.rationalizableEpsilon(game, base);
        epsilon = Math.round(epsilon / tolerance) * tolerance;

        FormationSearchNode<SymmetricGame, Set<Action>> node =
            new FormationSearchNode<SymmetricGame, Set<Action>>(game, strategySpace, epsilon, 1);

        queue.offer(node);
        nodes.put(strategySpace, node);
      }
    }
  }
  protected void expandNode(
      FormationSearchNode<SymmetricGame, Set<Action>> node,
      Queue<FormationSearchNode<SymmetricGame, Set<Action>>> queue,
      Map<Set<Action>, FormationSearchNode<SymmetricGame, Set<Action>>> nodes,
      int bound) {

    Set<Action> currentPlayerActions = node.getGame().getActions();

    if (currentPlayerActions.size() != actions.length) {

      for (Action action : actions) {

        if (!currentPlayerActions.contains(action)) {

          Set<Action> key = new HashSet<Action>(currentPlayerActions);

          key.add(action);

          if (!nodes.containsKey(key)) {
            double tau = rationalizableFinder.rationalizableTau(action, node.getGame(), getBase());

            if (tau > 0) {
              FormationSearchNode<SymmetricGame, Set<Action>> child = createNode(key, bound);

              if (child != null) {
                queue.offer(child);
                nodes.put(key, child);
              }
            }
          }
        }
      }
    }
  }
  protected FormationSearchNode<SymmetricGame, Set<Action>> createNode(Set<Action> strategySpace) {
    SymmetricGame game = new ActionReducedSymmetricGame(getBase(), strategySpace);

    int total = calculateGameSize(strategySpace.size(), game.players().size());

    double epsilon = rationalizableFinder.rationalizableEpsilon(game, getBase());
    epsilon = Math.round(epsilon / tolerance) * tolerance;

    FormationSearchNode<SymmetricGame, Set<Action>> node =
        new FormationSearchNode<SymmetricGame, Set<Action>>(game, strategySpace, epsilon, total);

    return node;
  }