diff --git a/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java b/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java index 5075d42..ad2a402 100644 --- a/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java +++ b/api/server/src/main/java/org/softwareheritage/graph/algo/Stats.java @@ -1,59 +1,74 @@ package org.softwareheritage.graph.algo; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import org.softwareheritage.graph.Graph; /* TODO: - merge the two stats files (.properties and .stats) into one */ public class Stats { - public long nbNodes; - public long nbEdges; - public double compressionRatio; - public double bitsPerNode; - public double bitsPerEdge; - public double avgLocality; - public long minIndegree; - public long maxIndegree; - public double avgIndegree; - public long minOutdegree; - public long maxOutdegree; - public double avgOutdegree; + public class Counts { + public long nodes; + public long edges; + } + + public class Ratios { + public double compression; + public double bitsPerNode; + public double bitsPerEdge; + public double avgLocality; + } + + public class Degree { + public long min; + public long max; + public double avg; + } + + public Counts counts; + public Ratios ratios; + public Degree indegree; + public Degree outdegree; public Stats(String graphPath) throws IOException { HashMap statsMap = new HashMap<>(); // Parse statistics from generated files Path dotProperties = Paths.get(graphPath + ".properties"); Path dotStats = Paths.get(graphPath + ".stats"); List lines = Files.readAllLines(dotProperties); lines.addAll(Files.readAllLines(dotStats)); for (String line : lines) { String[] parts = line.split("="); if (parts.length == 2) { statsMap.put(parts[0], parts[1]); } } - this.nbNodes = Long.parseLong(statsMap.get("nodes")); - this.nbEdges = Long.parseLong(statsMap.get("arcs")); - this.compressionRatio = Double.parseDouble(statsMap.get("compratio")); - this.bitsPerNode = Double.parseDouble(statsMap.get("bitspernode")); - this.bitsPerEdge = Double.parseDouble(statsMap.get("bitsperlink")); - this.avgLocality = Double.parseDouble(statsMap.get("avglocality")); - this.minIndegree = Long.parseLong(statsMap.get("minindegree")); - this.maxIndegree = Long.parseLong(statsMap.get("maxindegree")); - this.avgIndegree = Double.parseDouble(statsMap.get("avgindegree")); - this.minOutdegree = Long.parseLong(statsMap.get("minoutdegree")); - this.maxOutdegree = Long.parseLong(statsMap.get("maxoutdegree")); - this.avgOutdegree = Double.parseDouble(statsMap.get("avgoutdegree")); + this.counts = new Counts(); + this.ratios = new Ratios(); + this.indegree = new Degree(); + this.outdegree = new Degree(); + + this.counts.nodes = Long.parseLong(statsMap.get("nodes")); + this.counts.edges = Long.parseLong(statsMap.get("arcs")); + this.ratios.compression = Double.parseDouble(statsMap.get("compratio")); + this.ratios.bitsPerNode = Double.parseDouble(statsMap.get("bitspernode")); + this.ratios.bitsPerEdge = Double.parseDouble(statsMap.get("bitsperlink")); + this.ratios.avgLocality = Double.parseDouble(statsMap.get("avglocality")); + this.indegree.min = Long.parseLong(statsMap.get("minindegree")); + this.indegree.max = Long.parseLong(statsMap.get("maxindegree")); + this.indegree.avg = Double.parseDouble(statsMap.get("avgindegree")); + this.outdegree.min = Long.parseLong(statsMap.get("minoutdegree")); + this.outdegree.max = Long.parseLong(statsMap.get("maxoutdegree")); + this.outdegree.avg = Double.parseDouble(statsMap.get("avgoutdegree")); } }