Advertisement
Guest User

Jarrad's

a guest
May 25th, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 19.69 KB | None | 0 0
  1. package graphs.freshcode;
  2.  
  3. //exported project
  4.  
  5. import static org.junit.Assert.assertEquals;
  6. import static org.junit.Assert.assertTrue;
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13. import java.io.BufferedReader;
  14. import java.io.FileReader;
  15. import java.io.IOException;
  16. import java.math.BigDecimal;
  17. import java.math.RoundingMode;
  18. import java.util.*;
  19.  
  20. import org.jgrapht.Graph;
  21. import org.jgrapht.Graphs;
  22. import org.jgrapht.graph.*;
  23.  
  24. public class PageRankGraph extends BaseGraph<Integer, DefaultWeightedEdge> {
  25.  
  26.         private static final long serialVersionUID = 1L;
  27.  
  28.         public PageRankGraph() {
  29.                 super(DefaultWeightedEdge.class);
  30.         } // ensure non-instantiability.
  31.  
  32.         // // START OF PAGERANK CODE
  33.         //
  34.  
  35.         public Integer getRandomLink(Integer v) {
  36.                 // ADDED
  37.                 // PRE: vertex v has non-empty adjacency list
  38.                 // POST: returns a vertex ID randomly selected from adjacent vertices,
  39.                 // according to distribution of edge weights
  40.                 // adapted from Sedgewick:
  41.                 // http://introcs.cs.princeton.edu/java/16pagerank/RandomSurfer.java.html
  42.  
  43.                 // TODO
  44.                 double totalWeight = 0;
  45.                 DefaultWeightedEdge e = null;
  46.  
  47.                 Set<DefaultWeightedEdge> s = outgoingEdgesOf(v);
  48.  
  49.                 Iterator<DefaultWeightedEdge> iter = s.iterator();
  50.  
  51.                 // First iteration finds the total weight
  52.                 while (iter.hasNext()) {
  53.                         e = (DefaultWeightedEdge)iter.next();
  54.                         totalWeight += getEdgeWeight(e);
  55.                 }
  56.  
  57.                 Random r = new Random();
  58.  
  59.                 // Generates the (somewhat) random vertex that we want
  60.                 int result = r.nextInt((int) totalWeight) + 1;
  61.  
  62.                 totalWeight = 0;
  63.                 e = null;
  64.                 Integer nextVertex = null;
  65.  
  66.                 Iterator<DefaultWeightedEdge> iter2 = s.iterator();
  67.                 ;
  68.  
  69.                 // Finds the correct vertex
  70.                 while (iter2.hasNext()) {
  71.                         e = (DefaultWeightedEdge) iter2.next();
  72.                         nextVertex = getEdgeTarget(e);
  73.                         totalWeight += getEdgeWeight(e);
  74.  
  75.                         if (result <= totalWeight)
  76.                                 break;
  77.                 }
  78.                 return nextVertex;
  79.         }
  80.  
  81.         public Integer surfWithJump(Integer v, Integer n, Double jumpThreshold) {
  82.                 // PRE: v is vertex to start surf; n >= 0; 0 <= jumpThreshold <= 1.0
  83.                 // POST: surfs the graph randomly for n moves,
  84.                 //       choosing adjacent vertex according to distribution of edge weights if random number is below jumpThreshold,
  85.                 //       choosing any vertex uniformly randomly otherwise;
  86.                 //       modifies # visits in vertices
  87.                 //       returns last visited vertex at end of surfing
  88.  
  89.                 // TODO
  90.  
  91.                
  92.                 Random r = new Random();
  93.                 Integer vertex = v;
  94.                
  95.                 Set<Integer> s = vertexSet();
  96.                
  97.                 //Continue to surf n times
  98.                 for(; n > 0; n--){
  99.            
  100.                         //If the vertex is a sink, choose a random vertex
  101.                         if(outgoingEdgesOf(v).size() == 0) {
  102.                             vertex = r.nextInt(s.size());
  103.                         }
  104.                    
  105.                         double willJump = Math.random();
  106.                        
  107.                         //Path taken to jump to a (somewhat) random adjacent vertex if the random number is below the jumpThreshold
  108.                         if(willJump < jumpThreshold) {        
  109.                                 vertex = getRandomLink(vertex);
  110.                         }
  111.                
  112.                         //Path take to a select a random vertex otherwise
  113.                         else {
  114.                                 vertex = r.nextInt(s.size());
  115.                         }
  116.                        
  117.                         setVisits(vertex, (getVisits(vertex)+1));
  118.                        
  119.                 }
  120.                 return vertex;
  121.         }
  122.  
  123.         public ArrayList<Integer> topN(Integer N) {
  124.                 // PRE: none
  125.                 // POST: returns N vertices with highest number of visits, in order;
  126.                 // returns all vertices if <N in the graph;
  127.                 // returns vertices ranked 1,..,N,N+1,..,N+k if these k have the
  128.                 // same number of visits as vertex N
  129.  
  130.                 // TODO
  131.            
  132.             Set<Integer> s = vertexSet();
  133.            
  134.             Iterator<Integer> iter = s.iterator();
  135.            
  136.             ArrayList<Integer> a = new ArrayList<Integer>();
  137.            
  138.             if(N <= 0) {
  139.                 return new ArrayList<Integer>();
  140.             }
  141.            
  142.             //Adding an initial element to the list so that we have something to compare to
  143.             a.add((Integer)iter.next());
  144.  
  145.             Integer temp = 0;
  146.  
  147.             //Generates a sorted list
  148.             while(iter.hasNext()) {
  149.        
  150.                 temp = (Integer)iter.next();
  151.                
  152.                 for(int i = 0; i < a.size(); i++) {
  153.                    
  154.                     //Insert temp if its number of visits is greater than element at i
  155.                     if(getVisits(temp) > getVisits(a.get(i))) {
  156.                         a.add(i, temp);
  157.                         break;
  158.  
  159.                     }
  160.                     //temp.visits is not greater than any others and we have reached the end of the list
  161.                     else if(i == a.size()-1) {
  162.                         a.add(temp);
  163.                         break;
  164.  
  165.                     }
  166.                 }
  167.             }
  168.                        
  169.             //Return entire list
  170.             if(a.size() <= N) {
  171.                 return a;
  172.             }
  173.  
  174.             //Else return truncated list
  175.             else {
  176.                 ArrayList<Integer> smallA = new ArrayList<Integer>();
  177.                
  178.                 for(int i = 0; i < N; i++) {
  179.                     smallA.add(a.get(i));
  180.                 }
  181.                
  182.                 return smallA;
  183.  
  184.             }
  185.         }
  186.  
  187.         public void setVertexWeights() {
  188.                 // PRE: -
  189.                 // POST: set weights of each vertex v to be v.visits divided by
  190.                 // the total of visits for all vertices
  191.  
  192.                 // TODO
  193.            
  194.             Set<Integer> s = vertexSet();
  195.            
  196.             Iterator<Integer> iter = s.iterator();
  197.            
  198.             int totalVisits = 0;
  199.             Integer vertex = 0;
  200.            
  201.             //Calculate total number of visits
  202.             while(iter.hasNext()) {
  203.                 vertex = (Integer)iter.next();
  204.                 totalVisits += getVisits(vertex);
  205.             }
  206.            
  207.             iter = s.iterator();
  208.            
  209.             //Setting weight for all vertices
  210.             while(iter.hasNext()) {
  211.                 vertex = (Integer)iter.next();
  212.                 setWeight(vertex, getVisits(vertex)/(double)totalVisits);
  213.             }
  214.             return;
  215.         }
  216.  
  217.         public void convergenceWeights(Integer dp, Double jumpThreshold) {
  218.                 // PRE: dp >= 0 representing number of decimal places
  219.                 // POST: web is surfed until all weights are constant to dp decimal
  220.                 // places,
  221.                 // for at least one iteration
  222.  
  223.                 // TODO
  224.            
  225.             Set<Integer> s = vertexSet();      
  226.            
  227.             Integer surfVertex = getFirstVertex();
  228.             Integer vertex = null;
  229.            
  230.             BigDecimal a1[] = new BigDecimal[s.size()];
  231.             BigDecimal a2[] = new BigDecimal[s.size()];
  232.  
  233.             for(int i = 0; i < a2.length; i++) {
  234.                 a2[i] = new BigDecimal(-1);
  235.             }
  236.            
  237.             int counter;
  238.            
  239.             boolean switched = true;
  240.            
  241.             Iterator<Integer> iter = null;
  242.            
  243.             while(true) {
  244.                
  245.                 surfVertex = surfWithJump(surfVertex, 1, jumpThreshold);
  246.                
  247.                 setVertexWeights();
  248.                
  249.                 iter = s.iterator();
  250.                
  251.                 counter = 0;
  252.                
  253.                 while(iter.hasNext()) {
  254.                     vertex = (Integer)iter.next();
  255.                     if(switched) {
  256.                         a1[counter] = new BigDecimal(getWeight(vertex)).setScale(dp, RoundingMode.DOWN);
  257.                         switched = false;
  258.                     }
  259.                     else {
  260.                         a2[counter] = new BigDecimal(getWeight(vertex)).setScale(dp, RoundingMode.DOWN);
  261.                         switched = true;
  262.  
  263.                     }
  264.                     counter++;
  265.                 }
  266.                
  267.                 for(int i = 0; i < a1.length; i++) {
  268.                     if(a1[i].compareTo(a2[i]) != 0) {
  269.                         break;
  270.                     }
  271.                     else if(i == a1.length-1) {
  272.                         return;
  273.                     }
  274.                 }
  275.             }
  276.         }
  277.  
  278.         public Integer surfWithJumpUntilHit(Integer v, Integer n,
  279.                         Double jumpThreshold) {
  280.                 // PRE: v is vertex to start surf; n >= 0; 0 <= jumpThreshold <= 1.0
  281.                 // POST: surfs the graph randomly until visit v for second time (maximum
  282.                 // n moves),
  283.                 // choosing adjacent vertex according to distribution of edge weights if
  284.                 // random number is below jumpThreshold,
  285.                 // choosing any vertex uniformly randomly otherwise;
  286.                 // modifies # visits in vertices
  287.                 // returns number of vertices visited
  288.  
  289.                 // TODO
  290.  
  291.             Random r = new Random();
  292.             Integer initialVertex = v;
  293.             Integer vertex = v;
  294.             Set<Integer> s = vertexSet();
  295.            
  296.             Iterator<Integer> iter = s.iterator();
  297.  
  298.             //Continue to surf n times
  299.             for(; n > 0; n--){
  300.        
  301.                     //If the vertex is a sink, choose a random vertex
  302.                     if(outgoingEdgesOf(v).size() == 0) {
  303.                         vertex = r.nextInt(s.size());
  304.                     }
  305.                
  306.                     double willJump = Math.random();
  307.                    
  308.                     //Path taken to jump to a (somewhat) random adjacent vertex if the random number is below the jumpThreshold
  309.                     if(willJump < jumpThreshold) {        
  310.                             vertex = getRandomLink(vertex);
  311.                     }
  312.            
  313.                     //Path take to a select a random vertex otherwise
  314.                     else {
  315.                         vertex = r.nextInt(s.size());
  316.                     }
  317.                    
  318.                     setVisits(vertex, (getVisits(vertex)+1));
  319.                    
  320.                     if(vertex == initialVertex) {
  321.                        
  322.                         iter = s.iterator();
  323.                        
  324.                         int totalVisits = 0;
  325.                        
  326.                        
  327.                         while(iter.hasNext()) {
  328.                             vertex = (Integer)iter.next();
  329.                             totalVisits += getVisits(vertex);  
  330.                         }
  331.                        
  332.                         return totalVisits;
  333.                     }                  
  334.             }
  335.            
  336.             return 0;
  337.         }
  338.  
  339.         public Integer surfWithJumpUntilCover(Integer v, Integer n,
  340.                         Double jumpThreshold) {
  341.                 // PRE: v is vertex to start surf; n >= 0; 0 <= jumpThreshold <= 1.0
  342.                 // POST: surfs the graph randomly until all vertices visited (with
  343.                 // maximum n vertices visited),
  344.                 // choosing adjacent vertex according to distribution of edge weights if
  345.                 // random number is below jumpThreshold,
  346.                 // choosing any vertex uniformly randomly otherwise;
  347.                 // modifies # visits in vertices
  348.                 // returns number of vertices visited
  349.  
  350.                 // TODO
  351.                
  352.             Random r = new Random();
  353.             Integer vertex = v;
  354.             setMarked(v);
  355.            
  356.             Set<Integer> s = vertexSet();
  357.             Iterator<Integer> iter = s.iterator();
  358.            
  359.             boolean allVisited = false;
  360.                        
  361.             //Continue to surf n times
  362.             for(; n > 0; n--){
  363.        
  364.                     //If the vertex is a sink, choose a random vertex
  365.                     if(outgoingEdgesOf(v).size() == 0) {
  366.                         vertex = r.nextInt(s.size());
  367.                     }
  368.                
  369.                     double willJump = Math.random();
  370.                    
  371.                     //Path taken to jump to a (somewhat) random adjacent vertex if the random number is below the jumpThreshold
  372.                     if(willJump < jumpThreshold) {        
  373.                             vertex = getRandomLink(vertex);
  374.                     }
  375.            
  376.                     //Path take to a select a random vertex otherwise
  377.                     else {
  378.                         vertex = r.nextInt(s.size());
  379.                     }
  380.                    
  381.                     setVisits(vertex, (getVisits(vertex)+1));
  382.                    
  383.                     iter = s.iterator();
  384.                    
  385.                     allVisited = true;
  386.                    
  387.                     while(iter.hasNext()) {
  388.                         vertex = (Integer)iter.next();
  389.                         if(isMarked(vertex) == false)
  390.                             allVisited = false;
  391.                     }
  392.                    
  393.                     if(allVisited) {
  394.                         iter = s.iterator();
  395.                        
  396.                         int totalVisits = 0;
  397.                        
  398.                         while(iter.hasNext()) {
  399.                             vertex = (Integer)iter.next();
  400.                             totalVisits += getVisits(vertex);
  401.                            
  402.                         }
  403.                        
  404.                         return totalVisits;
  405.                     }
  406.                    
  407.             }
  408.            
  409.             return 0;
  410.  
  411.         }
  412.  
  413.         public Double averageHittingTime(Integer v, Integer n, Integer maxHits,
  414.                         Double jumpThreshold) {
  415.                 // PRE: n >= 1 is number of iterations for averaging; maxHits >= 0; 0 <=
  416.                 // jumpThreshold <= 1.0
  417.                 // POST: returns average number of vertices visited until hitting,
  418.                 // across n iterations,
  419.                 // (not including those which stopped because they reached maxHits)
  420.                 // returns 0 if all iterations reached maxVisits
  421.  
  422.                 // TODO
  423.            
  424.                 Double averageVisits = 0.0;
  425.                
  426.                 Set<Integer> s = vertexSet();
  427.                 Iterator<Integer> iter = null;
  428.                 Integer vertex = null;
  429.                
  430.                 Integer[] a = new Integer[s.size()];
  431.                 int counter = 0;
  432.                
  433.                 for(int i = 0; i < n; i++) {
  434.                    
  435.                     iter = s.iterator();
  436.                    
  437.                     counter = 0 ;
  438.                     while(iter.hasNext()) {
  439.                         vertex = (Integer)iter.next();
  440.                         a[counter] = getVisits(vertex);
  441.                         setVisits(vertex, 0);
  442.                         counter++;
  443.  
  444.                     }
  445.                                    
  446.                     averageVisits += surfWithJumpUntilHit(v, maxHits, jumpThreshold);
  447.    
  448.                     counter = 0;
  449.                     iter = s.iterator();
  450.                     while(iter.hasNext()) {
  451.                         vertex = (Integer)iter.next();
  452.                         setVisits(vertex, getVisits(vertex) + a[counter]);
  453.                         counter++;
  454.                        
  455.                     }  
  456.                 }
  457.  
  458.                 averageVisits = averageVisits/n;
  459.  
  460.                 return averageVisits; // TODO: REPLACE THIS WITH AN APPROPRIATE RETURN VALUE
  461.  
  462.         }
  463.  
  464.         public Double averageCoverTime(Integer n, Integer maxVisits,
  465.                         Double jumpThreshold) {
  466.                 // PRE: n >= 1 is number of iterations for averaging; maxVisits >= 0; 0
  467.                 // <= jumpThreshold <= 1.0
  468.                 // POST: returns average number of vertices visited until cover, across
  469.                 // n iterations,
  470.                 // (not including those which stopped because they reached maxVisits)
  471.                 // randomly selecting start vertex each iteration
  472.                 // returns 0 if all iterations reached maxVisits
  473.  
  474.                 // TODO
  475.            
  476.             Double averageVisits = 0.0;
  477.            
  478.             Set<Integer> s = vertexSet();
  479.             Iterator<Integer> iter = null;
  480.            
  481.             Random r = new Random();
  482.             Integer vertex = null;
  483.            
  484.             Integer[] a = new Integer[s.size()];
  485.             int counter = 0;
  486.            
  487.             for(int i = 0; i < n; i++) {
  488.                
  489.                 vertex = r.nextInt(s.size());
  490.                
  491.                 iter = s.iterator();
  492.                
  493.                 counter = 0 ;
  494.                 while(iter.hasNext()) {
  495.                     vertex = (Integer)iter.next();
  496.                     a[counter] = getVisits(vertex);
  497.                     setVisits(vertex, 0);
  498.                     counter++;
  499.  
  500.                 }
  501.                                
  502.                 averageVisits += surfWithJumpUntilCover(n, maxVisits, jumpThreshold);
  503.  
  504.                 counter = 0;
  505.                 iter = s.iterator();
  506.                 while(iter.hasNext()) {
  507.                     vertex = (Integer)iter.next();
  508.                     setVisits(vertex, getVisits(vertex) + a[counter]);
  509.                     counter++;
  510.                    
  511.                 }  
  512.             }
  513.  
  514.             averageVisits = averageVisits/n;
  515.  
  516.             return averageVisits; // TODO: REPLACE THIS WITH AN APPROPRIATE RETURN VALUE
  517.  
  518.         }
  519.  
  520.         public Integer boostVertex(Integer v, Integer dp) {
  521.                 // PRE: v is a vertex in the graph
  522.                 // POST: returns a vertex v2 (!= v) such that when edge (v,v2,1.0) is
  523.                 // added to the graph,
  524.                 // the weight of v is larger than when edge (v,v3,1.0) is added to the
  525.                 // graph
  526.                 // (for any v3), when the graph is surfed to convergence
  527.                 // if there is no such vertex v2 (i.e. v is already connected to all
  528.                 // other vertices),
  529.                 // return v
  530.                 // edges are only added if they do not already exist in the graph
  531.  
  532.                 // TODO
  533.  
  534.                 return -1; // TODO: REPLACE THIS WITH AN APPROPRIATE RETURN VALUE
  535.  
  536.         }
  537.  
  538.         public void setWeightedIntFromFile(String fInName) throws IOException {
  539.                 // Reads list of edges from a file, one pair of integers plus weight per
  540.                 // line
  541.                 BufferedReader fIn = new BufferedReader(new FileReader(fInName));
  542.                 String s;
  543.                 Integer x, y;
  544.                 Double w;
  545.  
  546.                 while ((s = fIn.readLine()) != null) {
  547.                         java.util.StringTokenizer line = new java.util.StringTokenizer(s);
  548.                         while (line.hasMoreTokens()) {
  549.                                 x = Integer.parseInt(line.nextToken());
  550.                                 y = Integer.parseInt(line.nextToken());
  551.                                 w = Double.parseDouble(line.nextToken());
  552.                                 this.addVertex(x);
  553.                                 this.addVertex(y);
  554.                                 DefaultWeightedEdge e = this.addEdge(x, y);
  555.                                 this.setEdgeWeight(e, w);
  556.                         }
  557.                 }
  558.                 fIn.close();
  559.  
  560.                 unsetAllMarked();
  561.         }
  562.  
  563.         public static void main(String[] args) {
  564.                 PageRankGraph g = new PageRankGraph();
  565.  
  566.                 try {
  567.                         String PATH = "/home/madras/teaching/15comp225/assignments/a2/assignment-sample-graphs/";
  568.                         g.setWeightedIntFromFile(PATH + "medium-weight.txt");
  569.                 } catch (IOException e) {
  570.                         System.out.println("in exception: " + e);
  571.                 }
  572.                 System.out.println(g.toString());
  573.                 g.print();
  574.  
  575.         }
  576. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement