/* * Author: tdanford * Date: Dec 4, 2008 */ package org.seqcode.ml.bayesnets; import org.seqcode.gseutils.graphs.DirectedGraph; /** * A GraphStep is a reversible transformation to a DirectedGraph. * * Finding a graph step for a graph is a necessary part of doing the random graph search, * which will let us determine structure. * * @author tdanford */ public interface GraphStep { public void forward(DirectedGraph g); public void reverse(DirectedGraph g); } class FlipEdgeStep implements GraphStep { private String v1, v2; public FlipEdgeStep(String vf, String vs) { v1 = vf; v2 = vs; } public void forward(DirectedGraph g) { if(!g.containsEdge(v1, v2)) { throw new IllegalArgumentException(); } g.removeEdge(v1, v2); g.addEdge(v2, v1); } public void reverse(DirectedGraph g) { if(!g.containsEdge(v2, v1)) { throw new IllegalArgumentException(); } g.removeEdge(v2, v1); g.addEdge(v1, v2); } public String toString() { return String.format("FLIP %s->%s", v1, v2); } } class AddEdgeStep implements GraphStep { private String v1, v2; public AddEdgeStep(String vf, String vs) { v1 = vf; v2 = vs; } public void forward(DirectedGraph g) { if(g.containsEdge(v1, v2)) { throw new IllegalArgumentException(); } g.addEdge(v1, v2); } public void reverse(DirectedGraph g) { if(!g.containsEdge(v1, v2)) { throw new IllegalArgumentException(); } g.removeEdge(v1, v2); } public String toString() { return String.format("ADD %s->%s", v1, v2); } } class RemoveEdgeStep implements GraphStep { private String v1, v2; public RemoveEdgeStep(String vf, String vs) { v1 = vf; v2 = vs; } public void reverse(DirectedGraph g) { if(g.containsEdge(v1, v2)) { throw new IllegalArgumentException(); } g.addEdge(v1, v2); } public void forward(DirectedGraph g) { if(!g.containsEdge(v1, v2)) { throw new IllegalArgumentException(); } g.removeEdge(v1, v2); } public String toString() { return String.format("REMOVE %s->%s", v1, v2); } }