/* * File: RunPpr.java * Authors: Jeremy D. Wendt * Company: Sandia National Laboratories * Project: Cognitive Foundry * * Copyright 2016, Sandia Corporation. Under the terms of Contract * DE-AC04-94AL85000, there is a non-exclusive license for use of this work by * or on behalf of the U.S. Government. Export of this program may require a * license from the United States Government. See CopyrightHistory.txt for * complete details. */ package examples; import examples.io.GraphFileIo; import gov.sandia.cognition.collection.DoubleArrayList; import gov.sandia.cognition.graph.DirectedNodeEdgeGraph; import gov.sandia.cognition.graph.community.PersonalizedPageRank; import gov.sandia.cognition.util.DefaultKeyValuePair; import gov.sandia.cognition.util.Pair; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; /** * Runs node-centric community identification via Personalized Page Rank * * @author jdwendt */ public class RunPpr { /** * Arguments for this example */ private static class Arguments { String inputFilename; String probeNodes; boolean scoresOnly; Long randomSeed; int numRunsScores = 20; int numRunsComm = 10; double tolerance = 0.01; public Arguments() { inputFilename = "example.dot"; probeNodes = "A"; randomSeed = null; scoresOnly = false; } List<String> getProbeNodes() { return Arrays.asList(probeNodes.split(",")); } }; /** * Takes in the command line args and sets up the flags for running this * * @param args * @return */ private static Arguments handleArgs(String[] args) { Arguments ret = new Arguments(); if (args.length == 1) { ret.inputFilename = args[0]; } if (ret.inputFilename == null) { System.err.println("Requires an input filename"); return null; } return ret; } public static void main(String[] args) { Arguments a = handleArgs(args); if (a == null) { return; } // Read in the specified file DirectedNodeEdgeGraph<String> graph; String extension = a.inputFilename.substring( a.inputFilename.lastIndexOf(".")); switch (extension.toLowerCase()) { case ".dot": graph = GraphFileIo.readDotFile(a.inputFilename); break; case ".csv": case ".el": case ".txt": graph = GraphFileIo.readEdgeListFile(a.inputFilename); break; default: throw new RuntimeException("Unknown file extension: " + extension); } // Run personalized page rank ego-community detection PersonalizedPageRank<String> ppr = new PersonalizedPageRank<>(graph, a.tolerance); if (a.randomSeed != null) { ppr.setRandomSet(a.randomSeed); } if (a.scoresOnly) { DoubleArrayList scores = ppr.getScoresForAllNodesMultirun( a.getProbeNodes(), a.numRunsScores); List<Pair<String, Double>> sorted = new ArrayList<>(scores.size()); for (int i = 0; i < scores.size(); ++i) { sorted.add(new DefaultKeyValuePair<>(graph.getNode(i), scores.get(i))); } Collections.sort(sorted, new Comparator<Pair<String, Double>>() { @Override public int compare(Pair<String, Double> o1, Pair<String, Double> o2) { return Double.compare(o2.getSecond(), o1.getSecond()); } }); // Print out resulting ppr scores System.out.println("NodeId,PprSimilarityScore"); for (Pair<String, Double> node : sorted) { System.out.println(node.getFirst() + "," + node.getSecond()); } } else { Set<Integer> ids = ppr.getCommunityForNodes(a.getProbeNodes(), a.numRunsScores, a.numRunsComm); // Print out the resulting nodes in probe's communitys System.out.println("Node Names in Community"); for (int id : ids) { System.out.println(graph.getNode(id)); } } } }