private HashSet<ObjectHandle> calculateOutsideBoundaryElementsToPlacementAdjacentToCurrent(
      IAdjacentFragment adjacentCurrent, FromPlacement fromPlacementAdjacentCurrent) {
    HashSet<ObjectHandle> insideBoundaryElements = new HashSet<ObjectHandle>();
    FragmentSubstitutionHolder fragmentHolderCurrent =
        (FragmentSubstitutionHolder) adjacentCurrent.getFragmentHolder();
    HashMap<FromPlacement, HashSet<ObjectHandle>> insideBoundaryElementsFromPlacementMap =
        fragmentHolderCurrent.getFromPlacementInsideBoundaryElementMap();
    HashSet<IAdjacentFragment> twins = adjacentCurrent.getTwinFragments();
    if (twins.isEmpty()) {
      insideBoundaryElements.addAll(
          insideBoundaryElementsFromPlacementMap.get(fromPlacementAdjacentCurrent));
    } else {
      Iterator<IAdjacentFragment> iterator = twins.iterator();
      while (iterator.hasNext()) {
        IAdjacentFragment twin = iterator.next();
        HashMap<FromPlacement, FromPlacement> fromPlacementMap =
            adjacentCurrent.getTwinFromPlacement(twin);
        if (fromPlacementMap == null) {
          throw new UnexpectedOperationFailure("twin fromPlacement boundary map is null");
        }
        FromPlacement fromPlacementTwin = fromPlacementMap.get(fromPlacementAdjacentCurrent);
        if (fromPlacementTwin == null) {
          throw new UnexpectedOperationFailure("can not find a twin fromPlacement boundary");
        }
        FragmentSubstitutionHolder fragmentHolderTwin =
            (FragmentSubstitutionHolder) twin.getFragmentHolder();
        HashMap<FromPlacement, HashSet<ObjectHandle>> insideBoundaryElementsFromPlacementMapTwin =
            fragmentHolderTwin.getFromPlacementInsideBoundaryElementMap();

        insideBoundaryElements.addAll(
            insideBoundaryElementsFromPlacementMap.get(fromPlacementAdjacentCurrent));
        insideBoundaryElements.addAll(
            insideBoundaryElementsFromPlacementMapTwin.get(fromPlacementTwin));
      }
    }
    return insideBoundaryElements;
  }