private void defineTransformations() {

    MetaOverTwoRelation metaGroupDep = instOverTwoRelation.getMetaOverTwoRelation();
    boolean targetActiveAttribute = false;
    if (instOverTwoRelation.getTargetRelations().size() > 0)
      // TODO support multiple targets
      targetActiveAttribute =
          (boolean)
              ((InstPairwiseRelation) instOverTwoRelation.getTargetRelations().get(0))
                  .getTargetRelations()
                  .get(0)
                  .getInstAttribute("Active")
                  .getValue();
    if (targetActiveAttribute && metaGroupDep != null) {
      relationType =
          (String)
              instOverTwoRelation
                  .getInstAttribute(SemanticOverTwoRelation.VAR_RELATIONTYPE_IDEN)
                  .getValue();
      // System.out.println(relationType);

      for (String sourceName : instOverTwoRelation.getSourceAttributeNames()) {
        AbstractExpression abstractTransformation = null;
        Iterator<InstElement> instEdges1 = instOverTwoRelation.getSourceRelations().iterator();
        AbstractExpression recursiveExpression1 = null;
        AbstractExpression recursiveExpression2 = null;
        if (instEdges1.hasNext()) {
          InstElement left1 = instEdges1.next();
          while ((boolean)
                  ((InstPairwiseRelation) left1)
                      .getSourceRelations()
                      .get(0)
                      .getInstAttribute("Active")
                      .getValue()
              == false) {
            if (instEdges1.hasNext()) left1 = instEdges1.next();
            else return;
          }
          switch (relationType) {
            case "and":
              abstractTransformation = new AndBooleanExpression();
              break;
            case "or":
              abstractTransformation = new OrBooleanExpression();
              break;
            case "mutex":
              abstractTransformation = new SumNumericExpression();
              break;
            case "range":
              abstractTransformation = new SumNumericExpression();
              Iterator<InstElement> instEdges2 =
                  instOverTwoRelation.getSourceRelations().iterator();
              // instEdges2.next(); // TODO eliminate duplicated edges
              // from collection and remove this
              // line
              InstElement left2 = instEdges2.next();
              Constructor<?> constructor3 = null, constructor4 = null;
              try {
                constructor3 =
                    abstractTransformation
                        .getClass()
                        .getConstructor(
                            InstElement.class,
                            String.class,
                            Boolean.TYPE,
                            AbstractExpression.class);
                constructor4 =
                    abstractTransformation
                        .getClass()
                        .getConstructor(
                            InstElement.class, InstElement.class, String.class, String.class);
              } catch (NoSuchMethodException | SecurityException e) {
                e.printStackTrace();
              }

              recursiveExpression2 =
                  transformation(constructor3, constructor4, instEdges2, left2, sourceName);
              break;
            case "":
              return;

            default:
              return;
          }

          Constructor<?> constructor1 = null, constructor2 = null;
          try {
            constructor1 =
                abstractTransformation
                    .getClass()
                    .getConstructor(
                        InstElement.class, String.class, Boolean.TYPE, AbstractExpression.class);
            constructor2 =
                abstractTransformation
                    .getClass()
                    .getConstructor(
                        InstElement.class, InstElement.class, String.class, String.class);
          } catch (NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
          }

          switch (relationType) {
            case "and":
              // B_Satisfied #<=> ( ( A1_"attribute" #/\
              // A2_"attribute" ) #/\ ... )
            case "or":
              // B_Satisfied #<=> ( ( A1_"attribute" #\/
              // A2_"attribute" ) #\/ ... )
              recursiveExpression1 =
                  transformation(constructor1, constructor2, instEdges1, left1, sourceName);
              getTransformations()
                  .add(
                      new DoubleImplicationBooleanExpression(
                          instOverTwoRelation, sourceName, true, recursiveExpression1));
              break;
            case "mutex":
              // B_Satisfied #<=> (( ( A1_"attribute" + A2_"attribute"
              // ) + ... ) #<=> 1)
              recursiveExpression1 =
                  transformation(constructor1, constructor2, instEdges1, left1, sourceName);
              AbstractExpression transformation1 =
                  new EqualsComparisonExpression(
                      recursiveExpression1, new NumberNumericExpression(1));
              getTransformations()
                  .add(
                      new DoubleImplicationBooleanExpression(
                          instOverTwoRelation, sourceName, true, transformation1));

              break;
            case "range":

              // B_"attribute" #<=> ( ( ( ( A1_"attribute" +
              // A2_"attribute" ) + ... ) #>= GD_LowCardinality) #/\
              // ( ( ( A1_"attribute" + A2_"attribute" ) + ... ) #<=
              // GD_HighCardinality ) )
              recursiveExpression1 =
                  transformation(constructor1, constructor2, instEdges1, left1, sourceName);
              AbstractExpression transformation3 =
                  new GreaterOrEqualsBooleanExpression(
                      instOverTwoRelation, "lowCardinality", false, recursiveExpression1);

              AbstractExpression transformation4 =
                  new LessOrEqualsBooleanExpression(
                      instOverTwoRelation, "highCardinality", false, recursiveExpression2);

              AbstractExpression transformation5 =
                  new AndBooleanExpression(transformation3, transformation4);

              getTransformations()
                  .add(
                      new DoubleImplicationBooleanExpression(
                          instOverTwoRelation /*
                                               * .getTargetRelations
                                               * ().get(0)
                                               * .getToRelation()
                                               */,
                          sourceName,
                          true,
                          transformation5));

              break;

            default:
              return;
          }
        }
      }
    }
  }