package org.mitre.provenance.simulate; import java.util.HashSet; import java.util.List; import org.mitre.provenance.plusobject.PLUSEdge; import org.mitre.provenance.plusobject.PLUSInvocation; import org.mitre.provenance.plusobject.PLUSObject; import org.mitre.provenance.plusobject.PLUSString; public class GraphSim extends SyntheticGraph { public GraphSim(SyntheticGraphProperties p) { super(p); generateNodes(); generateEdges(); guaranteeConnectivity(); protectAtRandom(); } protected void protectAtRandom() { HashSet<String> prots = new HashSet<String>(); List<PLUSObject> l = getNodesInOrderedList(); for(int x=0; x<props.protectN; x++) { String id = null; while(id == null || prots.contains(id)) { id = l.get(Math.abs(rand.nextInt(l.size()))).getId(); } prots.add(id); if(props.getSGF() != null) getNode(id).useSurrogateComputation(props.getSGF()); if(props.getPrivilegeSet() != null) getNode(id).setPrivileges(props.getPrivilegeSet()); } } protected void guaranteeConnectivity() { List<PLUSObject> l = getNodesInOrderedList(); for(int x=0; x<l.size()-1; x++) { if(getOutboundEdgesByNode(l.get(x).getId()).size() == 0) { addEdge(new PLUSEdge(l.get(x), l.get(x+1))); } } } protected void generateNodes() { for(int x=0; x<props.getComponents(); x++) { PLUSObject o = null; if(Math.abs(rand.nextDouble()) < props.pctData) { o = new PLUSString("Node " + x); } else { o = new PLUSInvocation("Inv " + x); } try { Thread.sleep(2); } catch (InterruptedException e) { ; } addNode(o); } } protected PLUSEdge makeRandomEdge(List<PLUSObject> l, int idx) { int otherIdx = -1; PLUSEdge e = null; int futility = 0; while(e == null || contains(e)) { if(idx > 0 && rand.nextBoolean()) { otherIdx = Math.abs(rand.nextInt(idx)); e = new PLUSEdge(l.get(otherIdx), l.get(idx)); } else if(idx < (l.size() - 1)) { otherIdx = idx + Math.abs(rand.nextInt(l.size() - idx)); e = new PLUSEdge(l.get(idx), l.get(otherIdx)); } futility++; if(futility > 5) break; } addEdge(e); return e; } protected void generateEdges() { List<PLUSObject> l = getNodesInOrderedList(); for(int x=0; x<l.size(); x++) { while(rand.nextDouble() <= props.getConnectivity()) { makeRandomEdge(l, x); } } } // End generateEdges }