// TODO: investigate, if it's worth to make this internally synchronized and virtually thread-safe
  public void addWord(String word) {
    if (!vocabulary.containsKey(word)) {
      VocabularyWord vw = new VocabularyWord(word);

      /*
        TODO: this should be done in different way, since this implementation causes minWordFrequency ultimate ignoral if markAsSpecial set to TRUE

        Probably the best way to solve it, is remove markAsSpecial option here, and let this issue be regulated with minWordFrequency
      */
      // vw.setSpecial(markAsSpecial);

      // initialize frequencyShift only if hugeModelExpected. It's useless otherwise :)
      if (hugeModelExpected) vw.setFrequencyShift(new byte[retentionDelay]);

      vocabulary.put(word, vw);

      if (hugeModelExpected
          && minWordFrequency > 1
          && hiddenWordsCounter.incrementAndGet() % scavengerThreshold == 0) activateScavenger();

      return;
    }
  }