diff --git a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
index 0835c179d8dfa26d6501469e6e5cb98a7b9055c0..83bd6ab7275244e88b9bb86e7654c1bfb80eb3a0 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractAdjacencyGraph.java
@@ -42,493 +42,6 @@ public abstract class AbstractAdjacencyGraph<
> extends AbstractCloud<Object,Graph.Endpoint<?, N,E>> implements Graph<N, E, NE, EE>
{
private static final Logger LOGGER = Logger.getLogger(AbstractAdjacencyGraph.class);
-// private Set<E> edges;
-// private Map<N, Set<E>> adjacentEdges = new HashMap<N, Set<E>>();
-// private Map<N, List<N>> adjacentNodes = new HashMap<N, List<N>>();
-/*
- private Set<? extends EdgeEndpoint<? extends Object, N, E, E>> edges;
- private Map<? extends NodeEndpoint<? extends Object, E, N, N>, Set<E>> adjacentEdges = new HashMap<NodeEndpoint<? extends Object, E, N, N>, Set<E>>();
- private Map<? extends NodeEndpoint<? extends Object, E, N, N>, List<N>> adjacentNodes = new HashMap<NodeEndpoint<? extends Object, E, N, N>, List<N>>();
-*/
-// private final boolean contextEnabled;
-
-
-/*
- /**
- * Creates a new AbstractAdjacencyGraph with no edges and no adjacencies.
- * nodeContext and edgeContext is enabled.
- *
- protected AbstractAdjacencyGraph()
- {
- this(true);
- }
-
- /**
- * Creates a new AbstractAdjacencyGraph with no edges and no adjacencies.
- *
- protected AbstractAdjacencyGraph(final boolean contextEnabled)
- {
-// this.edges = new HashSet<E>();
- this.edges = new HashSet<EdgeEndpoint<? extends Object, N, E, E>>();
-// this.contextEnabled = contextEnabled;
- }
-
- /**
- * Creates a new AbstractAdjacencyGraph as a copy of the current Graph.
- * nodeContext is enabled.
- * @param copyGraph The Graph to copy
- *
- protected AbstractAdjacencyGraph(final Graph<N, E> copyGraph)
- {
- this(copyGraph.getTargets(), copyGraph.getEdges(), true);
- }
-
- /**
- * Creates a new AbstractAdjacencyGraph as a copy of the current Graph.
- * @param copyGraph The Graph to copy
- *
- protected AbstractAdjacencyGraph(final Graph<N, E> copyGraph, final boolean contextEnabled)
- {
- this(copyGraph.getTargets(), copyGraph.getEdges(), contextEnabled);
- }
-
- /**
- * Creates a new AbstractAdjacencyGraph from the given list of nodes, and
- * the given list of ourEdges.
- * The adjacency lists are created from this structure. nodeContext is
- * enabled.
- *
- * @param nodes The set of all nodes
- * @param edges The set of all ourEdges
- *
- protected AbstractAdjacencyGraph(final Set<N> nodes, final Set<E> edges)
- {
- this(nodes, edges, true);
- }
-
- /**
- * Creates a new AbstractAdjacencyGraph from the given list of nodes, and
- * the given list of ourEdges.
- * The adjacency lists are created from this structure.
- *
- * @param attemptNodes The set of all nodes
- * @param attemptEdges The set of all ourEdges
- *
- protected AbstractAdjacencyGraph(final Set<N> attemptNodes, final Set<E> attemptEdges, final boolean contextEnabled)
- {
- if(attemptNodes == null)
- throw new IllegalArgumentException("attemptNodes can not be null");
- if(attemptEdges == null)
- throw new IllegalArgumentException("attemptEdges can not be null");
- //make sure all the edges only join to contained nodes
- for( E attemptEdge : attemptEdges )
- if( !attemptNodes.containsAll(attemptEdge.getTargets()) )
- throw new IllegalArgumentException("A node that is an end point in one of the attemptEdges was not in the nodes list");
-
- this.contextEnabled = contextEnabled;
- //add all the nodes before we worry about edges. check for NodeContext
- for(final N attemptNode : attemptNodes)
- {
-
- // lets see if this ContextEdge will allow itself to join the graph
- if(this.contextEnabled
- && (attemptNode instanceof ContextGraphNode)
- && !((ContextGraphNode)attemptNode).joiningGraph(this) )
- continue;
-
- this.adjacentNodes.put(attemptNode, new ArrayList<N>());
- this.adjacentEdges.put(attemptNode, new HashSet<E>());
- }
-
- //Add the edges checking for Cloud Context.
- if( this.contextEnabled )
- {
- this.edges = new HashSet<E>(attemptEdges.size());
- for(E attemptEdge : attemptEdges)
- {
- // lets see if this ContextEdge will allow itself to join the graph
- if(this.contextEnabled
- && (attemptEdge instanceof ContextGraphNode)
- && !((ContextGraphNode)attemptEdge).joiningGraph(this) )
- continue;
-
-
- this.edges.add(attemptEdge);
- //populate adjacency maps
- for(N currentNode : attemptEdge.getTargets())
- {
- boolean passedCurrent = false;
- for(N neighborNode : attemptEdge.getTargets())
- {
- if( !passedCurrent && (neighborNode == currentNode))
- {
- passedCurrent = true;
- continue;
- }
-
- //this is a neighbor node
- if( !this.adjacentNodes.containsKey(currentNode) )
- throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
-
- this.adjacentNodes.get(currentNode).add(neighborNode);
- }
-
- //this is a neighbor edge
- if( !this.adjacentEdges.containsKey(currentNode) )
- throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
- this.adjacentEdges.get(currentNode).add(attemptEdge);
- }
- }
- }
- else
- {
- this.edges = new HashSet<E>(attemptEdges);
- }
- }
-
- /**
- * Gets the internal edges of the list.
- * @return The set of internal edges
- *
- protected Set<E> getInternalEdges()
- {
- return this.edges;
- }
-
- /**
- * Gets the map of nodes to their associated set of edges.
- * @return The internal adjacency edges to nodes
- *
- protected Map<N, Set<E>> getInternalAdjacencyEdges()
- {
- return this.adjacentEdges;
- }
-
- /**
- * Gets each node's list of adjacent nodes.
- * @return The map of nodes to adjacent nodes
- *
- protected Map<N, List<N>> getInternalAdjacencyNodes()
- {
- return this.adjacentNodes;
- }
-
- @Override
- public boolean isContextEnabled()
- {
- return this.contextEnabled;
- }
-
- /**
- * Gets all nodes in the map.
- * @return The unmodifiable set of nodes
- *
- @Override
- public Set<N> getTargets()
- {
- return Collections.unmodifiableSet(this.adjacentEdges.keySet());
- }
-
- /**
- * Gets all edges in the map.
- * @return The unmodifiable set of edges
- *
- @Override
- public Set<E> getEdges()
- {
- return Collections.unmodifiableSet(this.edges);
- }
-
- /**
- * Gets all edges adjacent to a given node.
- * @param node the end point for all edges to retrieve.
- * @return The edges adjacent to that node.
- *
- @Override
- public Set<E> getAdjacentEdges(final N node)
- {
- if( this.adjacentEdges.containsKey(node) )
- return Collections.unmodifiableSet(this.adjacentEdges.get(node));
- else
- return Collections.<E>emptySet();
- }
-
- /**
- * Gets all nodes adjacent to the given node.
- * @param node The whose neighbors are to be returned.
- * @return All adjacent nodes to the given node
- *
- @Override
- public List<N> getAdjacentNodes(final N node)
- {
- return Collections.unmodifiableList(new ArrayList<N>(this.adjacentNodes.get(node)));
- }
-
- /**
- * Gets the traversable nodes adjacent to the given node.
- * @param node The whose traversable neighbors are to be returned.
- * @return The traversable nodes adjacent to the given node
- * @see com.syncleus.dann.graph.Cloud#getTraversableNodes(Object)
- *
- @Override
- public List<N> getTraversableAdjacentNodes(final N node)
- {
- final List<N> traversableNodes = new ArrayList<N>();
- for(final E adjacentEdge : this.getAdjacentEdges(node))
- traversableNodes.addAll(adjacentEdge.getTraversableNodes(node));
- return Collections.unmodifiableList(traversableNodes);
- }
-
- /**
- * Gets the traversable edges from this node.
- * @param node edges returned will be traversable from this node.
- * @return The traversable edges from the given node
- * @see com.syncleus.dann.graph.Cloud#isTraversable(Object)
- *
- @Override
- public Set<E> getTraversableAdjacentEdges(final N node)
- {
- final Set<E> traversableEdges = new HashSet<E>();
- for(final E adjacentEdge : this.getAdjacentEdges(node))
- if( adjacentEdge.isTraversable(node) )
- traversableEdges.add(adjacentEdge);
- return Collections.unmodifiableSet(traversableEdges);
- }
-
- protected boolean add(final E newEdge)
- {
- if( newEdge == null )
- throw new IllegalArgumentException("newEdge can not be null");
- if( !this.getTargets().containsAll(newEdge.getTargets()) )
- throw new IllegalArgumentException("newEdge has a node as an end point that is not part of the graph");
-
- // if context is enabled lets check if it can join
- if( this.isContextEnabled() && (newEdge instanceof ContextGraphNode)
- && !((ContextGraphNode)newEdge).joiningGraph(this) )
- return false;
-
- if( this.getInternalEdges().add(newEdge) )
- {
- for(final N currentNode : newEdge.getTargets())
- {
- this.getInternalAdjacencyEdges().get(currentNode).add(newEdge);
-
- final List<N> newAdjacentNodes = new ArrayList<N>(newEdge.getTargets());
- newAdjacentNodes.remove(currentNode);
- for(final N newAdjacentNode : newAdjacentNodes)
- this.getInternalAdjacencyNodes().get(currentNode).add(newAdjacentNode);
- }
- return true;
- }
-
- return false;
- }
-
- public boolean add(final N newNode)
- {
- if( newNode == null )
- throw new IllegalArgumentException("newNode can not be null");
-
- if( this.getInternalAdjacencyEdges().containsKey(newNode) )
- return false;
-
- // if context is enabled lets check if it can join
- if( this.isContextEnabled() && (newNode instanceof ContextGraphNode)
- && !((ContextGraphNode)newNode).joiningGraph(this) )
- return false;
-
- this.getInternalAdjacencyEdges().put(newNode, new HashSet<E>());
- this.getInternalAdjacencyNodes().put(newNode, new ArrayList<N>());
- return true;
- }
-
- protected boolean remove(final E edgeToRemove)
- {
- if( edgeToRemove == null )
- throw new IllegalArgumentException("removeSynapse can not be null");
-
- if( !this.getInternalEdges().contains(edgeToRemove) )
- return false;
-
- // if context is enabled lets check if it can join
- if( this.isContextEnabled()
- && (edgeToRemove instanceof ContextGraphNode)
- && !((ContextGraphNode)edgeToRemove).leavingGraph(this) )
- return false;
-
- if( !this.getInternalEdges().remove(edgeToRemove) )
- throw new IllegalStateException("could not remove edge even though it is present");
-
- for(final N removeNode : edgeToRemove.getTargets())
- {
- this.getInternalAdjacencyEdges().get(removeNode).remove(edgeToRemove);
-
- final List<N> removeAdjacentNodes = new ArrayList<N>(edgeToRemove.getTargets());
- removeAdjacentNodes.remove(removeNode);
- for(final N removeAdjacentNode : removeAdjacentNodes)
- this.getInternalAdjacencyNodes().get(removeNode).remove(removeAdjacentNode);
- }
- return true;
- }
-
- protected boolean remove(final N nodeToRemove)
- {
- if( nodeToRemove == null )
- throw new IllegalArgumentException("node can not be null");
-
- if( !this.getInternalAdjacencyEdges().containsKey(nodeToRemove) )
- return false;
-
- // if context is enabled lets check if it can join
- if( this.isContextEnabled()
- && (nodeToRemove instanceof ContextGraphNode)
- && !((ContextGraphNode)nodeToRemove).leavingGraph(this) )
- return false;
-
- final Set<E> removeEdges = this.getInternalAdjacencyEdges().get(nodeToRemove);
-
- //remove all the edges
- for(final E removeEdge : removeEdges)
- this.remove(removeEdge);
-
- //modify edges by removing the node to remove
- final Set<E> newEdges = new HashSet<E>();
- for(final E removeEdge : removeEdges)
- {
- E newEdge = (E) removeEdge.disconnect(nodeToRemove);
- while( (newEdge != null) && (newEdge.getTargets().contains(nodeToRemove)) )
- newEdge = (E) removeEdge.disconnect(nodeToRemove);
- if( newEdge != null )
- newEdges.add(newEdge);
- }
-
- //add the modified edges
- for(final E newEdge : newEdges)
- this.add(newEdge);
-
- //remove the node itself
- this.getInternalAdjacencyEdges().remove(nodeToRemove);
- this.getInternalAdjacencyNodes().remove(nodeToRemove);
-
- return true;
- }
-
- protected boolean clear()
- {
- boolean removedSomething = false;
-
- //first lets remove all the edges
- for(E edge : this.getEdges())
- {
- //lets just make sure we arent some how getting an we dont actually own, this shouldnt be possible so its
- //an assert. This ensures that if remove() comes back false it must be because the context didnt allow it.
- assert this.getInternalEdges().contains(edge);
-
- if( !this.remove(edge) )
- throw new IllegalStateException("one of the edges will not allow itself to leave this graph");
-
- removedSomething = true;
- }
-
- //now lets remove all the nodes
- for(N node : this.getTargets())
- {
- //lets just make sure we arent some how getting an we dont actually own, this shouldnt be possible so its
- //an assert. This ensures that if remove() comes back false it must be because the context didnt allow it.
- assert ( !this.getInternalAdjacencyEdges().containsKey(node) );
-
- if( !this.remove(node) )
- throw new IllegalStateException("one of the nodes will not allow itself to leave this graph");
-
- removedSomething = true;
- }
-
- return removedSomething;
- }
-
-
- /**
- * Clones the current object.
- * @return A clone of the current object, with no changes
- *
- @Override
- protected AbstractAdjacencyGraph<N, E> clone()
- {
- try
- {
- final AbstractAdjacencyGraph<N, E> cloneGraph = (AbstractAdjacencyGraph<N, E>) super.clone();
-
- //lets instantiate some new datastructurs for our clone
- cloneGraph.adjacentEdges = new HashMap<N, Set<E>>();
- cloneGraph.adjacentNodes = new HashMap<N, List<N>>();
-
- //add all the nodes before we worry about edges. check for NodeContext
- for(N attemptNode : this.getTargets())
- {
- // lets see if this ContextEdge will allow itself to join the graph
- if(this.contextEnabled
- && (attemptNode instanceof ContextGraphNode)
- && !((ContextGraphNode)attemptNode).joiningGraph(cloneGraph) )
- continue;
-
- cloneGraph.adjacentNodes.put(attemptNode, new ArrayList<N>());
- cloneGraph.adjacentEdges.put(attemptNode, new HashSet<E>());
- }
-
- //Add the edges checking for Cloud Context.
- if( this.contextEnabled )
- {
- cloneGraph.edges = new HashSet<E>(this.getEdges().size());
- for(E attemptEdge : this.getEdges())
- {
- // lets see if this ContextEdge will allow itself to join the graph
- if(this.contextEnabled
- && (attemptEdge instanceof ContextGraphNode)
- && !((ContextGraphNode)attemptEdge).joiningGraph(cloneGraph) )
- continue;
-
- cloneGraph.edges.add(attemptEdge);
- //populate adjacency maps
- for(N currentNode : attemptEdge.getTargets())
- {
- boolean passedCurrent = false;
- for(N neighborNode : attemptEdge.getTargets())
- {
- if( !passedCurrent && (neighborNode == currentNode))
- {
- passedCurrent = true;
- continue;
- }
-
- //this is a neighbor node
- if( !cloneGraph.adjacentNodes.containsKey(currentNode) )
- throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
-
- cloneGraph.adjacentNodes.get(currentNode).add(neighborNode);
- }
-
- //this is a neighbor edge
- if( !cloneGraph.adjacentEdges.containsKey(currentNode) )
- throw new IllegalStateException("After edges and nodes have applied their context restrictions an edge remained connected to a node not in this graph");
- cloneGraph.adjacentEdges.get(currentNode).add(attemptEdge);
- }
- }
- }
- else
- {
- cloneGraph.edges = new HashSet<E>(this.getEdges());
- }
-
- return cloneGraph;
- }
- catch(CloneNotSupportedException caught)
- {
- LOGGER.error("Unexpectedly could not clone Graph.", caught);
- throw new UnexpectedDannError("Unexpectedly could not clone graph", caught);
- }
- }
-*/
-
protected abstract Set<EdgeEndpoint<N,E>> getAdjacentEdgeEndpoints(Graph.NodeEndpoint<?, ?> nodeEndpoint);
protected PathFinder<N,E> getPathFinder()
diff --git a/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
index a42d832d37141b816b6ca02daec7a1d9d981d16c..c0fe3ff47535fc1c83683a173fbea250b031f4b3 100644
--- a/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AbstractMutableAdjacencyGraph.java
@@ -36,8 +36,6 @@ public abstract class AbstractMutableAdjacencyGraph<
{
}
-
-
protected void internalJoinNode(final MutableGraph.NodeEndpoint<N, E> endpoint) throws InvalidGraphException
{
if(endpoint == null)
@@ -203,95 +201,6 @@ public abstract class AbstractMutableAdjacencyGraph<
return false;
}
-/*
- private class NodeTargetSet extends AbstractTargetSet<N>
- {
- @Override
- public int size()
- {
- return nodeAdjacency.size();
- }
-
- @Override
- public boolean isEmpty()
- {
- return nodeAdjacency.isEmpty();
- }
-
- @Override
- public boolean contains(N o)
- {
- return nodeAdjacency.containsKey(o);
- }
-
- @Override
- public Iterator<N> iterator()
- {
- return Collections.unmodifiableSet(nodeAdjacency.keySet()).iterator();
- }
-
- @Override
- public Object[] toArray()
- {
- Object[] array = new Object[this.size()];
- int arrayIndex = 0;
- for(NEP nodeEndpoint : nodeAdjacency.keySet())
- {
- array[arrayIndex] = nodeEndpoint.getTarget();
- arrayIndex++;
- }
- return array;
- }
-
- @Override
- public <T> T[] toArray(T[] a)
- {
- return nodeAdjacency.keySet().toArray(a);
- }
-
- @Override
- public boolean add(N n)
- {
- throw new UnsupportedOperationException("This set is read-only!");
- }
-
- @Override
- public boolean remove(Object o)
- {
- throw new UnsupportedOperationException("This set is read-only!");
- }
-
- @Override
- public boolean containsAll(Collection<?> c)
- {
- return nodeAdjacency.keySet()
- }
-
- @Override
- public boolean addAll(Collection<? extends N> c)
- {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean retainAll(Collection<?> c)
- {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public boolean removeAll(Collection<?> c)
- {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- @Override
- public void clear()
- {
- //To change body of implemented methods use File | Settings | File Templates.
- }
- };
-*/
protected abstract class AbstractNodeEndpoint extends AbstractAdjacencyGraph<N,E,NE,EE>.AbstractNodeEndpoint implements MutableGraph.NodeEndpoint<N, E>
{
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
index 02d28d21964db6724c2664eb967151bcf41a2129..9be50dc7c6e4db61e4166d77f173f5ddf913d5a2 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
@@ -23,30 +23,13 @@ public interface AssignableGraph<
E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>,
NEP extends AssignableGraph.NodeEndpoint<N, E>,
EEP extends AssignableGraph.EdgeEndpoint<N, E>
- > extends Graph<N,E,NEP,EEP>, MutableEdge<Object,Graph.Endpoint<?, N,E>>
-//public interface AssignableGraph<P extends Cloud<N>, N extends P, E extends P> extends Graph<N,E>, Cloud<P>, MutableEdge<P>
-//public interface AssignableGraph<P extends AssignableGraph.Foo, N extends P, E extends Cloud<N> & AssignableGraph.Foo> extends Graph<N,E>, Cloud<P>, MutableEdge<P>
+ > extends Graph<N,E,NEP,EEP>
{
-/*
- @Override
- Set<? extends Graph.EdgeEndpoint<? extends Foo, N, E, E>> getEdgeEndpoints();
-
- void test()
- {
- Graph.EdgeEndpoint<? extends Object, N, E, E> test = ((Graph<N,E>)this).getEdgeEndpoints().iterator().next();
- Graph.EdgeEndpoint<? extends Foo, N, E, E> test2 = this.getEdgeEndpoints().iterator().next();
- }
-
- interface Foo
- {
- }
-*/
-
interface NodeEndpoint<
ON,
OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
- > extends Graph.NodeEndpoint<ON,OE>, MutableEdge.Endpoint<ON>
+ > extends Graph.NodeEndpoint<ON,OE>, Cloud.AssignableEndpoint<ON>
{
void setTarget(ON newTarget) throws InvalidGraphException;
};
@@ -54,14 +37,8 @@ public interface AssignableGraph<
interface EdgeEndpoint<
ON,
OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
- > extends Graph.EdgeEndpoint<ON,OE>, MutableEdge.Endpoint<OE>
+ > extends Graph.EdgeEndpoint<ON,OE>, Cloud.AssignableEndpoint<OE>
{
void setTarget(OE newTarget) throws InvalidGraphException;
};
-
-/*
- interface Endpoint<PN, EN extends PN, NN extends PN, MN extends PN> extends Graph.Endpoint<MN,EN,NN,PN>, MutableEdge.Endpoint<PN, MN>
- {
- };
-*/
}
diff --git a/src/main/java/com/syncleus/dann/graph/Cloud.java b/src/main/java/com/syncleus/dann/graph/Cloud.java
index 053fb050f4fdeb199d1c7c2c13f4c41dee28f512..094c4cac65fa3d7a075847823726d28eb61971e1 100644
--- a/src/main/java/com/syncleus/dann/graph/Cloud.java
+++ b/src/main/java/com/syncleus/dann/graph/Cloud.java
@@ -40,6 +40,11 @@ public interface Cloud<
T getTarget();
};
+ interface AssignableEndpoint<T> extends Cloud.Endpoint<T>
+ {
+ void setTarget(T newTarget) throws InvalidEdgeException;
+ };
+
Set<EP> getEndpoints();
Set<EP> getEndpoints(Object target);
Set<T> getTargets();
diff --git a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
index 4971ff0a02ab6f2695d5246e8df964577cc19dee..747fca123ef073074041c8e859eba5ee2b466c28 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableAdjacencyGraph.java
@@ -18,9 +18,6 @@
******************************************************************************/
package com.syncleus.dann.graph;
-import java.util.Set;
-import com.syncleus.dann.xml.Namer;
-
public final class MutableAdjacencyGraph<
N,
E extends Cloud<N,? extends Cloud.Endpoint<N>>
diff --git a/src/main/java/com/syncleus/dann/graph/MutableEdge.java b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
index 021d4c6251bc848bc5e976d03e21a366cd6adfc5..9559255572bac270b033af6feb084ef7be06af20 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
@@ -20,11 +20,10 @@ package com.syncleus.dann.graph;
public interface MutableEdge<
T,
- EP extends Edge.Endpoint<? extends T>
- > extends Edge<T, EP>
+ EP extends MutableEdge.Endpoint<? extends T>
+ > extends Edge<T, EP>, AssignableCloud<T,EP>
{
- interface Endpoint<T> extends Cloud.Endpoint<T>
+ interface Endpoint<T> extends Edge.Endpoint<T>, AssignableCloud.Endpoint<T>
{
- void setTarget(T newTarget) throws InvalidEdgeException;
};
}