Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
peersimgrid release 1.0
[simgrid.git] / contrib / psg / src / peersim / graph / GraphIO.java
diff --git a/contrib/psg/src/peersim/graph/GraphIO.java b/contrib/psg/src/peersim/graph/GraphIO.java
new file mode 100644 (file)
index 0000000..9d928d3
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * Copyright (c) 2003-2005 The BISON Project
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+               
+package peersim.graph;
+
+import java.util.*;
+import java.io.*;
+
+/**
+* Implements static methods to load and write graphs.
+*/
+public class GraphIO {
+private GraphIO() {}
+
+
+// ================== public static methods =========================
+// ==================================================================
+
+
+/**
+* Prints graph in edge list format. Each line contains exactly two
+* node IDs separated by whitespace.
+*/
+public static void writeEdgeList( Graph g, PrintStream out ) {
+
+       for(int i=0; i<g.size(); ++i)
+       {
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       out.println(i+" "+it.next());
+               }
+       }
+}
+
+// ------------------------------------------------------------------
+
+/**
+* Prints graph in neighbor list format. Each line starts with the
+* id of a node followed by the ids of its neighbors separated by space.
+*/
+public static void writeNeighborList( Graph g, PrintStream out ) {
+
+       out.println("# "+g.size());
+       
+       for(int i=0; i<g.size(); ++i)
+       {
+               out.print(i+" ");
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       out.print(it.next()+" ");
+               }
+               out.println();
+       }
+}
+
+// ------------------------------------------------------------------
+
+/**
+* Saves the given graph to
+* the given stream in DOT format. Good for the graphviz package.
+*/
+public static void writeDOT( Graph g, PrintStream out ) {
+
+       out.println((g.directed()?"digraph":"graph")+" {");
+       
+       for(int i=0; i<g.size(); ++i)
+       {
+               Iterator<Integer> it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       final int j = it.next();
+                       if(g.directed())
+                               out.println(i+" -> "+j+";");
+                       else if( i<=j )
+                               out.println(i+" -- "+j+";");
+               }
+       }
+       
+       out.println("}");
+}
+
+// ------------------------------------------------------------------
+
+/**
+* Saves the given graph to
+* the given stream in GML format.
+*/
+public static void writeGML( Graph g, PrintStream out ) {
+
+       out.println("graph [ directed "+(g.directed()?"1":"0"));
+       
+       for(int i=0; i<g.size(); ++i)
+               out.println("node [ id "+i+" ]");
+       
+       for(int i=0; i<g.size(); ++i)
+       {
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       out.println(
+                               "edge [ source "+i+" target "+it.next()+" ]");
+               }
+       }
+       
+       out.println("]");
+}
+
+// --------------------------------------------------------------------
+
+/**
+* Saves the given graph to
+* the given stream to be read by NETMETER. It should be ok also for Pajek.
+*/
+public static void writeNetmeter( Graph g, PrintStream out ) {
+
+       out.println("*Vertices "+g.size());
+       for(int i=0; i<g.size(); ++i)
+               out.println((i+1)+" \""+(i+1)+"\"");
+       
+       out.println("*Arcs");
+       for(int i=0; i<g.size(); ++i)
+       {
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       out.println((i+1)+" "+
+                               (((Integer)it.next()).intValue()+1)+" 1");
+               }
+       }
+       out.println("*Edges");
+}
+
+// --------------------------------------------------------------------
+
+/**
+* Saves the given graph to
+* the given stream in UCINET DL nodelist format.
+*/
+public static void writeUCINET_DL( Graph g, PrintStream out ) {
+
+       out.println("DL\nN="+g.size()+"\nFORMAT=NODELIST\nDATA:");
+       
+       for(int i=0; i<g.size(); ++i)
+       {
+               out.print(" " + (i+1));
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       out.print(" "+(((Integer)it.next()).intValue()+1));
+               }
+               out.println();
+       }
+       out.println();
+}
+
+// --------------------------------------------------------------------
+
+/**
+* Saves the given graph to
+* the given stream in UCINET DL matrix format.
+*/
+public static void writeUCINET_DLMatrix( Graph g, PrintStream out ) {
+
+       out.println("DL\nN="+g.size()+"\nDATA:");
+       
+       for(int i=0; i<g.size(); ++i)
+       {
+               BitSet bs = new BitSet(g.size());
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       bs.set( ((Integer)it.next()).intValue() );
+               }
+               for(int j=0; j<g.size(); ++j)
+               {
+                       out.print(bs.get(j)?" 1":" 0");
+               }
+               out.println();
+       }
+       out.println();
+}
+
+// --------------------------------------------------------------------
+
+/**
+* Saves the given graph to
+* the given stream in Chaco format. We need to output the number of edges
+* so they have to be counted first which might not be very efficient.
+* Note that this format is designed for undirected graphs only.
+*/
+public static void writeChaco( Graph g, PrintStream out ) {
+
+       if( g.directed() ) System.err.println(
+               "warning: you're saving a directed graph in Chaco format");
+       
+       long edges = 0;
+       for(int i=0; i<g.size(); ++i) edges += g.getNeighbours(i).size();
+       
+       out.println( g.size() + " " + edges/2 );
+       
+       for(int i=0; i<g.size(); ++i)
+       {
+               Iterator it=g.getNeighbours(i).iterator();
+               while(it.hasNext())
+               {
+                       out.print((((Integer)it.next()).intValue()+1)+" ");
+               }
+               out.println();
+       }
+       
+       out.println();
+}
+
+// -------------------------------------------------------------------
+
+/**
+* Read a graph in newscast graph format.
+* The format depends on mode, the parameter.
+* The file begins with the three byte latin 1 coded "NCG" string followed
+* by the int MODE which is the
+* given parameter. The formats are the following as a function of mode:
+* <ul>
+* <li> 1: Begins with cacheSize in binary format (int), followed by the
+*     numberOfNodes (int), and then a continuous series of exactly
+*     numberOfNodes records, where a record describes a node's
+*     neighbours and their timestamps.
+*     A record is a series of exactly cacheSize (int,long) pairs where
+*     the int is the node id, and the long is the timestamp.
+*     Node id-s start from 1. Node id 0 means no node and used if the parent
+*     node has less that cacheSize nodes.</li>
+* </ul>
+* @param file Filename to read
+* @param direction If 0, the original directionality is preserved, if 1,
+* than each edge is reversed, if 2 then directionality is dropped and the
+* returned graph will be undirected.
+*/
+public static Graph readNewscastGraph( String file, int direction )
+throws IOException {
+       
+       NeighbourListGraph gr = new NeighbourListGraph( direction != 2 );
+       FileInputStream fis = new FileInputStream(file);
+       DataInputStream dis = new DataInputStream(fis);
+
+       dis.readByte();
+       dis.readByte();
+       dis.readByte();
+       
+       final int MODE = dis.readInt();
+       if( MODE != 1 ) throw new IOException("Unknown mode "+MODE);
+       
+       final int CACHESIZE = dis.readInt(); 
+       final int GRAPHSIZE = dis.readInt(); 
+       
+//System.out.println("header: "+MODE+" "+CACHESIZE+" "+GRAPHSIZE);
+       
+       for(int i=1; i<=GRAPHSIZE; ++i)
+       {
+               int iind = gr.addNode(i);
+               
+               for(int j=0; j<CACHESIZE; ++j)
+               {
+                       int a = dis.readInt();
+                       dis.readLong();
+                       
+                       int agentIndex = gr.addNode(a);
+                       if( direction == 0 ) gr.setEdge(iind,agentIndex);
+                       else gr.setEdge(agentIndex,iind);
+               }
+       }
+       
+       dis.close();
+
+       return gr;
+}
+
+
+}
+