@Override
  public void doWork() throws OperatorException {
    double minValue = getParameterAsDouble(PARAMETER_MIN_CONFIDENCE);
    if (getParameterAsInt(PARAMETER_CRITERION) != CONFIDENCE) {
      minValue = getParameterAsDouble(PARAMETER_MIN_CRITERION_VALUE);
    }
    double theta = getParameterAsDouble(PARAMETER_GAIN_THETA);
    double laplaceK = getParameterAsDouble(PARAMETER_LAPLACE_K);
    FrequentItemSets sets = itemSetsInput.getData(FrequentItemSets.class);
    AssociationRules rules = new AssociationRules();
    HashMap<Collection<Item>, Integer> setFrequencyMap = new HashMap<Collection<Item>, Integer>();
    int numberOfTransactions = sets.getNumberOfTransactions();

    // iterating sorted over every frequent Set, generating every possible rule and building
    // frequency map
    sets.sortSets();
    for (FrequentItemSet set : sets) {
      setFrequencyMap.put(set.getItems(), set.getFrequency());
      // generating rule by splitting set in every two parts for head and body of rule
      if (set.getItems().size() > 1) {
        PowerSet<Item> powerSet = new PowerSet<Item>(set.getItems());
        for (Collection<Item> premises : powerSet) {
          if (premises.size() > 0 && premises.size() < set.getItems().size()) {
            Collection<Item> conclusion = powerSet.getComplement(premises);
            int totalFrequency = set.getFrequency();
            int preconditionFrequency = setFrequencyMap.get(premises);
            int conclusionFrequency = setFrequencyMap.get(conclusion);

            double value =
                getCriterionValue(
                    totalFrequency,
                    preconditionFrequency,
                    conclusionFrequency,
                    numberOfTransactions,
                    theta,
                    laplaceK);
            if (value >= minValue) {
              AssociationRule rule =
                  new AssociationRule(
                      premises, conclusion, getSupport(totalFrequency, numberOfTransactions));
              rule.setConfidence(getConfidence(totalFrequency, preconditionFrequency));
              rule.setLift(
                  getLift(
                      totalFrequency,
                      preconditionFrequency,
                      conclusionFrequency,
                      numberOfTransactions));
              rule.setConviction(
                  getConviction(
                      totalFrequency,
                      preconditionFrequency,
                      conclusionFrequency,
                      numberOfTransactions));
              rule.setPs(
                  getPs(
                      totalFrequency,
                      preconditionFrequency,
                      conclusionFrequency,
                      numberOfTransactions));
              rule.setGain(
                  getGain(
                      theta,
                      totalFrequency,
                      preconditionFrequency,
                      conclusionFrequency,
                      numberOfTransactions));
              rule.setLaplace(
                  getLaPlace(
                      laplaceK,
                      totalFrequency,
                      preconditionFrequency,
                      conclusionFrequency,
                      numberOfTransactions));
              rules.addItemRule(rule);
            }
          }
        }
      }
    }
    rulesOutput.deliver(rules);
    itemSetsOutput.deliver(sets);
  }