docs: @Nonnull
      public Set<Relationship> addImplicitRelationships() {
          Set<Relationship> implicitRelationships = new HashSet<>();
  
          String descriptionKey = "D";
          String technologyKey = "T";
          Map<Element, Map<Element, Map<String, HashSet<String>>>> candidateRelationships = new HashMap<>();
  
          for (Relationship relationship : getRelationships()) {
              Element source = relationship.getSource();
              Element destination = relationship.getDestination();
  
              while (source != null) {
                  while (destination != null) {
                      if (!source.hasEfferentRelationshipWith(destination)) {
                          if (propagatedRelationshipIsAllowed(source, destination)) {
  
                              if (!candidateRelationships.containsKey(source)) {
                                  candidateRelationships.put(source, new HashMap<>());
                              }
  
                              if (!candidateRelationships.get(source).containsKey(destination)) {
                                  candidateRelationships.get(source).put(destination, new HashMap<>());
                                  candidateRelationships.get(source).get(destination).put(descriptionKey, new HashSet<>());
                                  candidateRelationships.get(source).get(destination).put(technologyKey, new HashSet<>());
                              }
  
                              if (relationship.getDescription() != null) {
                                  candidateRelationships.get(source).get(destination).get(descriptionKey).add(relationship.getDescription());
                              }
  
                              if (relationship.getTechnology() != null) {
                                  candidateRelationships.get(source).get(destination).get(technologyKey).add(relationship.getTechnology());
                              }
                          }
                      }
  
                      destination = destination.getParent();
                  }
  
                  destination = relationship.getDestination();
                  source = source.getParent();
              }
          }
  
          for (Element source : candidateRelationships.keySet()) {
              for (Element destination : candidateRelationships.get(source).keySet()) {
                  Set<String> possibleDescriptions = candidateRelationships.get(source).get(destination).get(descriptionKey);
                  Set<String> possibleTechnologies = candidateRelationships.get(source).get(destination).get(technologyKey);
  
                  String description = "";
                  if (possibleDescriptions.size() == 1) {
                      description = possibleDescriptions.iterator().next();
                  }
  
                  String technology = "";
                  if (possibleTechnologies.size() == 1) {
                      technology = possibleTechnologies.iterator().next();
                  }
  
                  // todo ... this defaults to being a synchronous relationship
                  Relationship implicitRelationship = addRelationship(source, destination, description, technology, InteractionStyle.Synchronous);
                  if (implicitRelationship != null) {
                      implicitRelationships.add(implicitRelationship);
                  }
              }
          }
  
          return implicitRelationships;
      }