/** Creates an initial marking. */
  private void createMarking() {

    HNSet set = null;

    marking = null;
    marking = new HashMap[size];

    // Building the marking data structure. This structure is an array of
    // hashmaps.
    // For a given hashmap, we have:
    // - Key: Integer = element
    // - Value: HashMap = subsets + the number of tokens associated to them
    // The idea is to keep track of which tasks fired and the number of
    // tokens at their output subsets.
    // Initially, the number of tokens is 0.
    for (int i = 0; i < size; i++) {

      set = hNet.getOutputSet(i);
      HashMap map = new HashMap();
      for (int j = 0; j < set.size(); j++) {
        map.put(set.get(j), new Integer(0));
      }
      marking[i] = map;
    }

    auxMapping = new MappingToSubsets(hNet);
    this.reset();
  }
  /**
   * Adds tokens to the output places of a given element
   *
   * @param element element to fire
   */
  private void addTokensOutputPlaces(int element) {

    /*
     * Pseudo-code: 1. Retrieve all elements in the OUT set of 'element' 2.
     * Increase the number of tokens for every output element
     */

    HNSet set = null;

    // update global counter for number of tokens
    // note that OR-situations count as a single token.

    set = hNet.getOutputSet(element);
    if (set.size() == 0) { // element is connected to the end place
      numberTokens++;
      endPlace++;
    } else {
      numberTokens += set.size();
    }

    // update marking...
    for (int iSet = 0; iSet < set.size(); iSet++) {
      increaseNumberTokens(element, set.get(iSet));
    }
  }
  /**
   * Build an initial marking for a given heuristics net.
   *
   * @param net an enhanced heuristics net to which the initial marking must be built.
   * @throws java.lang.NullPointerException whenever the net has disconnected elements. An element
   *     is disconnected when its INPUT or OUTPUT set is null.
   */
  public MarkingHeuristicsNet(HeuristicsNet net, Random generator) throws NullPointerException {

    this.generator = generator;
    size = net.size();
    hNet = net;
    // checking if all input and output sets are DIFFERENT from null...
    for (int i = 0; i < size; i++) {
      if (hNet.getInputSet(i) == null || hNet.getOutputSet(i) == null) {
        throw new NullPointerException("Net has disconnected elements!!");
      }
    }
    createMarking();
  }
  private void buildMapping(HeuristicsNet hn) {

    HNSet outputSubsets;
    HNSubSet outputSubset;
    int taskInSubset;

    mapping = new HNSet[hn.size()][hn.size()];

    for (int task = 0; task < hn.size(); task++) {
      outputSubsets = hn.getOutputSet(task);
      for (int iOutputSubsets = 0; iOutputSubsets < outputSubsets.size(); iOutputSubsets++) {
        // inserting for every element
        outputSubset = outputSubsets.get(iOutputSubsets);
        for (int iSubset = 0; iSubset < outputSubset.size(); iSubset++) {
          taskInSubset = outputSubset.get(iSubset);
          insertInMapping(taskInSubset, task, outputSubset);
        }
      }
    }
  }