Search in sources :

Example 1 with RoleEdge

use of org.batfish.datamodel.RoleEdge in project batfish by batfish.

the class InferRoles method computeRoleScore.

private double computeRoleScore(String regex) {
    SortedMap<String, SortedSet<String>> nodeRolesMap = regexToRoleSpecifier(regex).createNodeRolesMap(new TreeSet<>(_nodes));
    Topology topology = _batfish.getEnvironmentTopology();
    // produce a role-level topology and the list of nodes in each edge's source role
    // that have an edge to some node in the edge's target role
    SortedMap<RoleEdge, SortedSet<String>> roleEdges = new TreeMap<>();
    for (Edge e : topology.getEdges()) {
        String n1 = e.getNode1();
        String n2 = e.getNode2();
        SortedSet<String> roles1 = nodeRolesMap.get(n1);
        SortedSet<String> roles2 = nodeRolesMap.get(n2);
        if (roles1 != null && roles2 != null && roles1.size() == 1 && roles2.size() == 1) {
            String role1 = roles1.first();
            String role2 = roles2.first();
            // ignore self-edges
            if (role1.equals(role2)) {
                continue;
            }
            RoleEdge redge = new RoleEdge(role1, role2);
            SortedSet<String> roleEdgeNodes = roleEdges.getOrDefault(redge, new TreeSet<>());
            roleEdgeNodes.add(n1);
            roleEdges.put(redge, roleEdgeNodes);
        }
    }
    int numEdges = roleEdges.size();
    if (numEdges == 0) {
        return 0.0;
    }
    // compute the "support" of each edge in the role-level topology:
    // the percentage of nodes playing the source role that have an edge
    // to a node in the target role.
    // the score of this regex is then the average support across all role edges
    SortedMap<String, SortedSet<String>> roleNodesMap = regexToRoleSpecifier(regex).createRoleNodesMap(_configurations.keySet());
    double supportSum = 0.0;
    for (Map.Entry<RoleEdge, SortedSet<String>> roleEdgeCount : roleEdges.entrySet()) {
        RoleEdge redge = roleEdgeCount.getKey();
        int count = roleEdgeCount.getValue().size();
        supportSum += (double) count / roleNodesMap.get(redge.getRole1()).size();
    }
    return supportSum / numEdges;
}
Also used : Topology(org.batfish.datamodel.Topology) TreeMap(java.util.TreeMap) SortedSet(java.util.SortedSet) ImmutableSortedSet(com.google.common.collect.ImmutableSortedSet) RoleEdge(org.batfish.datamodel.RoleEdge) RoleEdge(org.batfish.datamodel.RoleEdge) Edge(org.batfish.datamodel.Edge) Map(java.util.Map) NavigableMap(java.util.NavigableMap) TreeMap(java.util.TreeMap) SortedMap(java.util.SortedMap)

Aggregations

ImmutableSortedSet (com.google.common.collect.ImmutableSortedSet)1 Map (java.util.Map)1 NavigableMap (java.util.NavigableMap)1 SortedMap (java.util.SortedMap)1 SortedSet (java.util.SortedSet)1 TreeMap (java.util.TreeMap)1 Edge (org.batfish.datamodel.Edge)1 RoleEdge (org.batfish.datamodel.RoleEdge)1 Topology (org.batfish.datamodel.Topology)1