public BigDecimal getAvailability() {
    LinkedHashSet<PhysicalLink> uniqPhysicalLinks =
      new LinkedHashSet<PhysicalLink>();
    LinkedHashSet<PhysicalNode> uniqIntermediaryNodes =
      new LinkedHashSet<PhysicalNode>();
    for(VirtualLink virtualLink : linksMapping.keySet()) {
      PhysicalNode sourcePhysicalNode = getHostingNodeFor(
        (VirtualNode) virtualLink.getSourceNode());
      PhysicalNode destinyPhysicalNode = getHostingNodeFor(
        (VirtualNode) virtualLink.getDestinyNode());
      ArrayList<PhysicalLink> hostingLinks = linksMapping.get(virtualLink);
      for(PhysicalLink hostingLink : hostingLinks) {
        uniqPhysicalLinks.add(hostingLink);
        PhysicalNode hostingLinkSourceNode =
          (PhysicalNode) hostingLink.getSourceNode();
        PhysicalNode hostingLinkDestinyNode =
          (PhysicalNode) hostingLink.getDestinyNode();
        PhysicalNode[] hostingLinkNodes = { hostingLinkSourceNode,
          hostingLinkDestinyNode };
        for(PhysicalNode hostingLinkNode : hostingLinkNodes) {
          if(!hostingLinkNode.equals(sourcePhysicalNode)
             && !hostingLinkNode.equals(destinyPhysicalNode)) {
            uniqIntermediaryNodes.add(hostingLinkNode);
          }
        }
      }
    }

    BigDecimal availability = new BigDecimal(1);
    for(PhysicalNode hostingNode : uniqPhysicalNodes()) {
      availability = availability.multiply(hostingNode.getNodeAvailability(),
        MathContext.DECIMAL64);
    }
    for(PhysicalLink hostingLink : uniqPhysicalLinks) {
      availability = availability.multiply(hostingLink.getAvailability(),
        MathContext.DECIMAL64);
    }
    for(PhysicalNode intermediaryNode : uniqIntermediaryNodes) {
      availability = availability.multiply(intermediaryNode.
        getIntermediaryNodeAvailability(), MathContext.DECIMAL64);
    }

    return availability;
  }