private VCPENetworkModel getLogicalInfrastructureSuggestionFromCompletePhysical(
      VCPENetworkModel physicalInfrastructure) {
    VCPENetworkModel generatedLogical = MPTemplateModelBuilder.generateLogicalElements();
    VCPENetworkModel suggestedLogical =
        suggestor.getSuggestionForLogicalModel(physicalInfrastructure, generatedLogical);
    VCPENetworkModel completeSuggestion =
        MPTemplateModelBuilder.mapLogicalAndPhysical(physicalInfrastructure, suggestedLogical);

    return completeSuggestion;
  }
  /**
   * FIXME TO BE REMOVED, part of WORKAROUND
   *
   * @param initialModel model with user preferences. Without physicalInfrastructure elements
   * @return given initialModel merged with suggested physical one.
   */
  private VCPENetworkModel buildModelWithPhyInfrastructureWorkaround(
      VCPENetworkModel initialModelLogical) {
    // Merge initialModelLogical with suggested physical
    VCPENetworkModel phy = MPTemplateModelBuilder.generatePhysicalElements();
    phy = suggestor.getSuggestionForPhysicalModel(phy);

    VCPENetworkModel logical = MPTemplateModelBuilder.generateLogicalElements();
    logical = partialCopy(initialModelLogical, logical);

    VCPENetworkModel logicalWithSuggestedPhysical =
        MPTemplateModelBuilder.mapLogicalAndPhysical(phy, logical);
    return logicalWithSuggestedPhysical;
  }
  @Override
  public VCPENetworkModel getPhysicalInfrastructureSuggestion() throws VCPENetworkManagerException {

    VCPENetworkModel generated = MPTemplateModelBuilder.generatePhysicalElements();
    VCPENetworkModel suggestion = suggestor.getSuggestionForPhysicalModel(generated);
    return suggestion;
  }
  /**
   * @param initialModel model with user preferences. It MAY not contain all elements, but MUST
   *     contain every configurable element (including physical infrastructure)
   * @return complete model with all required values.
   */
  @Override
  public VCPENetworkModel buildModel(VCPENetworkModel initialModel) {

    // WORKAROUND starts here
    // When given initialModel does not contain physical elements, this workaround must be executed
    if (APPLY_WORKAROUND) {
      initialModel = buildModelWithPhyInfrastructureWorkaround(initialModel);
    }
    // WORKAROUND ends here

    VCPENetworkModel model = MPTemplateModelBuilder.generateModel();
    model = partialCopy(initialModel, model);
    model = hierarchicalLRnames(model);
    model = configureRouting(model);
    return model;
  }