From a97ee33a8b298fdfa743a465b668c7c16a698f6e Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com> Date: Wed, 28 Sep 2011 13:11:43 -0400 Subject: [PATCH] Refactored the graph package so generics are minimized with a focus on gneerifying the endpoints, major milestone in the design. --- .../dann/graph/AssignableBidirectedCloud.java | 9 +- .../dann/graph/AssignableBidirectedEdge.java | 7 +- .../syncleus/dann/graph/AssignableCloud.java | 9 +- .../dann/graph/AssignableCloudGraph.java | 29 ++-- .../dann/graph/AssignableDirectedEdge.java | 7 +- .../syncleus/dann/graph/AssignableEdge.java | 7 +- .../AssignableMixableBidirectedEdge.java | 14 +- .../graph/AssignableMixableDirectedEdge.java | 15 +- .../dann/graph/AssignableMixableEdge.java | 17 +-- .../syncleus/dann/graph/BidirectedCloud.java | 7 +- .../syncleus/dann/graph/BidirectedEdge.java | 7 +- .../syncleus/dann/graph/BidirectedGraph.java | 38 ++--- .../java/com/syncleus/dann/graph/Cloud.java | 26 ++-- .../com/syncleus/dann/graph/CloudGraph.java | 143 +++--------------- .../com/syncleus/dann/graph/DirectedEdge.java | 7 +- .../syncleus/dann/graph/DirectedGraph.java | 25 ++- .../dann/graph/DynamicBidirectedCloud.java | 6 +- .../dann/graph/DynamicBidirectedGraph.java | 25 ++- .../com/syncleus/dann/graph/DynamicCloud.java | 6 +- .../dann/graph/DynamicCloudGraph.java | 29 ++-- .../dann/graph/DynamicDirectedGraph.java | 25 ++- .../com/syncleus/dann/graph/DynamicGraph.java | 25 ++- .../java/com/syncleus/dann/graph/Edge.java | 7 +- ...eRootedTreeGraph.java => EndpointSet.java} | 10 +- .../java/com/syncleus/dann/graph/Graph.java | 25 ++- ...bleTreeGraph.java => HashEndpointSet.java} | 2 +- .../com/syncleus/dann/graph/HyperEdge.java | 9 +- .../com/syncleus/dann/graph/HyperGraph.java | 27 ++-- .../syncleus/dann/graph/JoinableCloud.java | 12 +- .../dann/graph/JoinableCloudGraph.java | 40 ++--- .../dann/graph/MixableBidirectedEdge.java | 13 +- .../dann/graph/MixableDirectedEdge.java | 13 +- .../com/syncleus/dann/graph/MixableEdge.java | 14 +- .../com/syncleus/dann/graph/MutableCloud.java | 6 +- .../dann/graph/MutableCloudGraph.java | 32 ++-- .../com/syncleus/dann/graph/MutableGraph.java | 25 ++- .../dann/graph/MutableHyperGraph.java | 25 ++- .../syncleus/dann/graph/PartibleCloud.java | 11 +- .../dann/graph/PartibleCloudGraph.java | 43 ++---- .../syncleus/dann/graph/TraversableCloud.java | 19 ++- .../dann/graph/TraversableCloudGraph.java | 61 +++++--- .../syncleus/dann/graph/TraversableGraph.java | 25 ++- 42 files changed, 336 insertions(+), 566 deletions(-) rename src/main/java/com/syncleus/dann/graph/{MutableRootedTreeGraph.java => EndpointSet.java} (87%) rename src/main/java/com/syncleus/dann/graph/{MutableTreeGraph.java => HashEndpointSet.java} (92%) diff --git a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java index 617dc7d5..cbceb207 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedCloud.java @@ -21,11 +21,10 @@ package com.syncleus.dann.graph; import java.util.Map; public interface AssignableBidirectedCloud< - T, - E extends AssignableBidirectedCloud.Endpoint<T, ? extends T> - > extends AssignableCloud<T,E>, BidirectedCloud<T,E> + E extends AssignableBidirectedCloud.Endpoint<?> + > extends AssignableCloud<E>, BidirectedCloud<E> { - interface Endpoint<P, T extends P> extends AssignableCloud.Endpoint<P, T>, BidirectedCloud.Endpoint<P, T> + interface Endpoint<T> extends AssignableCloud.Endpoint<T>, BidirectedCloud.Endpoint<T> { } @@ -35,5 +34,5 @@ public interface AssignableBidirectedCloud< Endpoint.Direction getDirection(); } - void reassignDirection(Map<? extends E, ReassignmentPair<? extends T>> reassignments) throws InvalidGraphException; + <T, TE extends AssignableBidirectedCloud.Endpoint<? super T>> void reassignDirection(Map<TE,? extends ReassignmentPair<? extends T>> reassignments) throws InvalidGraphException; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java index d9d8025b..1ecd6c84 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableBidirectedEdge.java @@ -19,11 +19,10 @@ package com.syncleus.dann.graph; public interface AssignableBidirectedEdge< - T, - E extends AssignableBidirectedEdge.Endpoint<T> - > extends AssignableMixableBidirectedEdge<T,T,T,E,E,E>, AssignableEdge<T,E> + E extends AssignableBidirectedEdge.Endpoint<?> + > extends AssignableMixableBidirectedEdge<E,E,E>, AssignableEdge<E> { - interface Endpoint<T> extends AssignableMixableBidirectedEdge.Endpoint<T, T, T>, AssignableEdge.Endpoint<T> + interface Endpoint<T> extends AssignableMixableBidirectedEdge.Endpoint<T>, AssignableEdge.Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/AssignableCloud.java b/src/main/java/com/syncleus/dann/graph/AssignableCloud.java index 7aeaeb99..47b7b1d9 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableCloud.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableCloud.java @@ -21,14 +21,13 @@ package com.syncleus.dann.graph; import java.util.Map; public interface AssignableCloud< - T, - E extends AssignableCloud.Endpoint<T, ? extends T> - > extends Cloud<T,E> + E extends AssignableCloud.Endpoint<?> + > extends Cloud<E> { - interface Endpoint<P, T> extends Cloud.Endpoint<P, T> + interface Endpoint<T> extends Cloud.Endpoint<T> { void setTarget(T newTarget) throws InvalidEdgeException; } - void reassign(Map<? extends E,? extends T> reassignments) throws InvalidGraphException; + <T, TE extends AssignableCloud.Endpoint<? super T>> void reassign(Map<TE,? extends T> reassignments) throws InvalidGraphException; } diff --git a/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java index e69d0bfb..50c721c8 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableCloudGraph.java @@ -19,37 +19,26 @@ package com.syncleus.dann.graph; public interface AssignableCloudGraph< - A, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends AssignableCloudGraph.Endpoint<A, A, N, E>, - NE extends AssignableCloudGraph.NodeEndpoint<A, N, E>, - EE extends AssignableCloudGraph.EdgeEndpoint<A, N, E> - > extends CloudGraph<A,N,E,AE,NE,EE>, AssignableCloud<A, AE> + NE extends AssignableCloudGraph.NodeEndpoint<?>, + EE extends AssignableCloudGraph.EdgeEndpoint<? extends Cloud<?>> + > extends CloudGraph<NE,EE>, AssignableCloud<NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends CloudGraph.Endpoint<P,T,N,E>, AssignableCloud.Endpoint<P,T> + extends CloudGraph.Endpoint<T>, AssignableCloud.Endpoint<T> { }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.NodeEndpoint<P,N,E>, AssignableCloud.Endpoint<P,N>, Endpoint<P,N,N,E> + T + > extends CloudGraph.NodeEndpoint<T>, AssignableCloud.Endpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.EdgeEndpoint<P,N,E>, AssignableCloud.Endpoint<P,E>, Endpoint<P,E,N,E> + T extends Cloud<?> + > extends CloudGraph.EdgeEndpoint<T>, AssignableCloud.Endpoint<T>, Endpoint<T> { }; } diff --git a/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java index 1f199721..5556cddd 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableDirectedEdge.java @@ -19,11 +19,10 @@ package com.syncleus.dann.graph; public interface AssignableDirectedEdge< - T, - E extends AssignableDirectedEdge.Endpoint<T> - > extends AssignableMixableDirectedEdge<T,T,T,E,E,E>, AssignableBidirectedEdge<T,E> + E extends AssignableDirectedEdge.Endpoint<?> + > extends AssignableMixableDirectedEdge<E,E,E>, AssignableBidirectedEdge<E> { - interface Endpoint<T> extends AssignableMixableDirectedEdge.Endpoint<T, T, T>, AssignableBidirectedEdge.Endpoint<T> + interface Endpoint<T> extends AssignableMixableDirectedEdge.Endpoint<T>, AssignableBidirectedEdge.Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/AssignableEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableEdge.java index 590d9564..a7ce62e5 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableEdge.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableEdge.java @@ -19,11 +19,10 @@ package com.syncleus.dann.graph; public interface AssignableEdge< - T, - E extends AssignableEdge.Endpoint<T> - > extends AssignableMixableEdge<T,T,T,E,E,E> + E extends AssignableEdge.Endpoint<?> + > extends AssignableMixableEdge<E,E,E> { - interface Endpoint<T> extends AssignableMixableEdge.Endpoint<T, T, T> + interface Endpoint<T> extends AssignableMixableEdge.Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java index 78290fc2..11606f4e 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableMixableBidirectedEdge.java @@ -19,18 +19,14 @@ package com.syncleus.dann.graph; public interface AssignableMixableBidirectedEdge< - T, - LT extends T, - RT extends T, - E extends AssignableMixableBidirectedEdge.Endpoint<T, ? extends T, ? extends T>, - LE extends AssignableMixableBidirectedEdge.Endpoint<T, LT, RT>, - RE extends AssignableMixableBidirectedEdge.Endpoint<T, RT, LT> - > extends MixableEdge<T, LT, RT, E, LE, RE>, AssignableCloud<T, E> + E extends AssignableMixableBidirectedEdge.Endpoint<?>, + LE extends E, + RE extends E + > extends AssignableMixableEdge<E, LE, RE>, MixableBidirectedEdge<E, LE, RE>, AssignableBidirectedCloud<E> { - interface Endpoint<P, T extends P, N extends P> extends MixableBidirectedEdge.Endpoint<P, T, N>, AssignableMixableEdge.Endpoint<P, T, N> + interface Endpoint<T> extends AssignableMixableEdge.Endpoint<T>, MixableBidirectedEdge.Endpoint<T>, AssignableBidirectedCloud.Endpoint<T> { }; void invertDirection() throws InvalidEdgeDirectionException; - void reassign(LT newLeftNode, Endpoint.Direction newLeftDirection, RT newRightNode, Endpoint.Direction newRightDirection) throws InvalidEdgeException; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java index 1d964a30..19d8b0cf 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableMixableDirectedEdge.java @@ -19,17 +19,12 @@ package com.syncleus.dann.graph; public interface AssignableMixableDirectedEdge< - T, - ST extends T, - DT extends T, - E extends AssignableMixableDirectedEdge.Endpoint<T, ? extends T, ? extends T>, - SE extends AssignableMixableDirectedEdge.Endpoint<T, ST, DT>, - DE extends AssignableMixableDirectedEdge.Endpoint<T, DT, ST> - > extends AssignableMixableBidirectedEdge<T, ST, DT, E, SE, DE>, MixableDirectedEdge<T, ST, DT, E, SE, DE> + E extends AssignableMixableDirectedEdge.Endpoint<?>, + SE extends E, + DE extends E + > extends AssignableMixableBidirectedEdge<E, SE, DE>, MixableDirectedEdge<E, SE, DE> { - interface Endpoint<P, T extends P, N extends P> extends AssignableMixableBidirectedEdge.Endpoint<P, T, N>, MixableDirectedEdge.Endpoint<P, T, N> + interface Endpoint<T> extends AssignableMixableBidirectedEdge.Endpoint<T>, MixableDirectedEdge.Endpoint<T> { }; - - void reassign(ST newSourceNode, DT newDestinationNode) throws InvalidEdgeException; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java index 64e376a9..b35bfac8 100644 --- a/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java +++ b/src/main/java/com/syncleus/dann/graph/AssignableMixableEdge.java @@ -18,18 +18,15 @@ ******************************************************************************/ package com.syncleus.dann.graph; +import java.util.Map; + public interface AssignableMixableEdge< - T, - LT extends T, - RT extends T, - E extends AssignableMixableEdge.Endpoint<T, ? extends T, ? extends T>, - LE extends AssignableMixableEdge.Endpoint<T, LT, RT>, - RE extends AssignableMixableEdge.Endpoint<T, RT, LT> - > extends MixableEdge<T, LT, RT, E, LE, RE>, AssignableCloud<T, E> + E extends AssignableMixableEdge.Endpoint<?>, + LE extends E, + RE extends E + > extends MixableEdge<E, LE, RE>, AssignableCloud<E> { - interface Endpoint<P, T extends P, N extends P> extends MixableEdge.Endpoint<P, T, N>, AssignableCloud.Endpoint<P, T> + interface Endpoint<T> extends MixableEdge.Endpoint<T>, AssignableCloud.Endpoint<T> { }; - - void reassign(LT newLeftNode, RT newRightNode) throws InvalidEdgeException; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java b/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java index 1029c8e3..6d93baba 100644 --- a/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java +++ b/src/main/java/com/syncleus/dann/graph/BidirectedCloud.java @@ -18,11 +18,10 @@ package com.syncleus.dann.graph; public interface BidirectedCloud< - T, - EP extends BidirectedCloud.Endpoint<T, ? extends T> - > extends TraversableCloud<T, EP> + E extends BidirectedCloud.Endpoint<?> + > extends TraversableCloud<E> { - interface Endpoint<P, T> extends TraversableCloud.Endpoint<P, T> + interface Endpoint<T> extends TraversableCloud.Endpoint<T> { enum Direction { diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java index 51d14528..8de0bb2c 100644 --- a/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/BidirectedEdge.java @@ -19,11 +19,10 @@ package com.syncleus.dann.graph; public interface BidirectedEdge< - T, - EP extends BidirectedEdge.Endpoint<T> - > extends MixableBidirectedEdge<T,T,T,EP,EP,EP>, Edge<T,EP> + E extends BidirectedEdge.Endpoint<?> + > extends MixableBidirectedEdge<E,E,E>, Edge<E> { - interface Endpoint<T> extends MixableBidirectedEdge.Endpoint<T, T, T>, Edge.Endpoint<T> + interface Endpoint<T> extends MixableBidirectedEdge.Endpoint<T>, Edge.Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java b/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java index a1be79bf..e7365cbd 100644 --- a/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java +++ b/src/main/java/com/syncleus/dann/graph/BidirectedGraph.java @@ -34,46 +34,26 @@ import java.util.Set; * @since 2.0 */ public interface BidirectedGraph< - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>, - AE extends BidirectedGraph.Endpoint<Object, N, E>, - NE extends BidirectedGraph.NodeEndpoint<N, E>, - EE extends BidirectedGraph.EdgeEndpoint<N, E> - > extends TraversableGraph<N, E, AE, NE, EE> + NE extends BidirectedGraph.NodeEndpoint<?>, + EE extends BidirectedGraph.EdgeEndpoint<?> + > extends TraversableGraph<NE, EE>, BidirectedCloud<NE> { interface Endpoint< - T, - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> + T > - extends TraversableGraph.Endpoint<T,N,E> + extends TraversableGraph.Endpoint<T>, BidirectedCloud.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> - > extends TraversableGraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends TraversableGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> - > extends TraversableGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends BidirectedEdge<?> + > extends TraversableGraph.EdgeEndpoint<T>, Endpoint<T> { }; - - /** - * Get all edges which traverse to the specified node. While the combination of - * out edges and in edges will usually result in all the adjacent edges for a - * node this is not strictly required. - * - * @param node The destination node the returned edges will traverse to. - * @return an unmodifiable set of all edges which traverse to the specified - * node. - * @throws IllegalArgumentException if node does not exist in the graph. - * @since 2.0 - */ - Set<E> getInEdges(N node); } diff --git a/src/main/java/com/syncleus/dann/graph/Cloud.java b/src/main/java/com/syncleus/dann/graph/Cloud.java index d1ed73f4..db47339b 100644 --- a/src/main/java/com/syncleus/dann/graph/Cloud.java +++ b/src/main/java/com/syncleus/dann/graph/Cloud.java @@ -19,32 +19,28 @@ package com.syncleus.dann.graph; import java.io.Serializable; -import java.util.Collection; -import java.util.Set; +import java.util.*; import com.syncleus.dann.graph.event.context.ContextReporter; import com.syncleus.dann.graph.xml.EdgeXml; import com.syncleus.dann.xml.XmlSerializable; public interface Cloud< - T, - EP extends Cloud.Endpoint<T, ? extends T> + E extends Cloud.Endpoint<?> > extends Serializable, Cloneable, XmlSerializable<EdgeXml, Object>, ContextReporter { - interface Endpoint<P, T> + interface Endpoint<T> { - Set<? extends Endpoint<P,P>> getNeighbors(); T getTarget(); }; - Set<EP> getEndpoints(); - Set<EP> getEndpoints(Object target); - Set<T> getTargets(); - Set<T> getNeighbors(Object target); - boolean contains( Object endpoint); - boolean containsAny(Collection<? extends Endpoint<?,?>> endpoint); - boolean containsAll(Collection<? extends Endpoint<?,?>> endpoint); + Set<E> getEndpoints(); + Set<E> getEndpoints(Object target); + Set<E> getNeighbors(Cloud.Endpoint<?> endpoint); + boolean contains( Endpoint<?> endpoint); + boolean containsAny(Collection<? extends Endpoint<?>> endpoint); + boolean containsAll(Collection<? extends Endpoint<?>> endpoint); boolean containsTarget(Object target); - boolean containsAnyTargets(Collection<?> target); - boolean containsAllTargets(Collection<?> target); + boolean containsAnyTargets(Collection<?> targets); + boolean containsAllTargets(Collection<?> targets); int getDegree(); } diff --git a/src/main/java/com/syncleus/dann/graph/CloudGraph.java b/src/main/java/com/syncleus/dann/graph/CloudGraph.java index b1902ba1..cbb19a55 100644 --- a/src/main/java/com/syncleus/dann/graph/CloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/CloudGraph.java @@ -18,6 +18,7 @@ ******************************************************************************/ package com.syncleus.dann.graph; +import java.util.Collection; import java.util.Set; /** @@ -34,139 +35,45 @@ import java.util.Set; * @param <E> The type of edge for the given node type */ public interface CloudGraph< - A, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends CloudGraph.Endpoint<A, A, N, E>, - NE extends CloudGraph.NodeEndpoint<A, N, E>, - EE extends CloudGraph.EdgeEndpoint<A, N, E> - > extends Cloud<A,AE> + NE extends CloudGraph.NodeEndpoint<?>, + EE extends CloudGraph.EdgeEndpoint<? extends Cloud<?>> + > extends Cloud<NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends Cloud.Endpoint<P,T> + extends Cloud.Endpoint<T> { - Set<? extends CloudGraph.Endpoint<P,T,N,E>> getAdjacent(); - Set<? extends CloudGraph.Endpoint<P,T,N,E>> getTraversableAdjacentTo(); - Set<? extends CloudGraph.Endpoint<P,T,N,E>> getTraversableAdjacentFrom(); - - Set<? extends CloudGraph.NodeEndpoint<P, N, E>> getAdjacentNodes(); - Set<? extends CloudGraph.NodeEndpoint<P, N, E>> getTraversableAdjacentNodesTo(); - Set<? extends CloudGraph.NodeEndpoint<P, N, E>> getTraversableAdjacentNodesFrom(); - - Set<? extends CloudGraph.EdgeEndpoint<P, N, E>> getAdjacentEdges(); - Set<? extends CloudGraph.EdgeEndpoint<P, N, E>> getTraversableAdjacentEdgesTo(); - Set<? extends CloudGraph.EdgeEndpoint<P, N, E>> getTraversableAdjacentEdgesFrom(); }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.Endpoint<P, N, N, E> + T + > extends Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.Endpoint<P, E, N, E> + T extends Cloud<?> + > extends Endpoint<T> { }; - Set<EE> getEdgeEndpoints(); - Set<EE> getEdgeEndpoints(Cloud<?,? extends Cloud.Endpoint<?,?>> cloud); - - Set<NE> getNodeEndpoints(); - Set<NE> getNodeEndpoints(Object node); - - /** - * Get a set of all nodes in the graph. - * - * @return An unmodifiable set of all nodes in the graph. - * @since 2.0 - */ - Set<N> getNodes(); - /** - * Get a set of all edges in the graph. Two edges in the set, and in the graph, - * may have the same end points unless equals in the edges used by this graph - * restrict that possiblity. - * - * @return An unmodifiable set of a all edges in the graph. - * @since 2.0 - */ - Set<E> getEdges(); - /** - * Get a list of all nodes adjacent to the specified node. All edges connected - * to this node has its other end points added to the list returned. The - * specified node itself will appear in the list once for every loop. If there - * are multiple edges connecting node with a particular end point it will - * appear multiple times in the list, once for each hop to the end point. - * - * @param node The whose neighbors are to be returned. - * @return A list of all nodes adjacent to the specified node, empty set if the - * node has no edges. - * @since 2.0 - */ - Set<N> getAdjacentNodes(Object node); - /** - * Get a set of all edges which is connected to node (adjacent). You may not be - * able to traverse from the specified node to all of these edges returned. If - * you only want edges you can traverse then see getTraversableAdjacentEdges. - * - * @param node the end point for all edges to retrieve. - * @return An unmodifiable set of all edges that has node as an end point. - * @throws IllegalArgumentException if specified node is not in the graph. - * @since 2.0 - */ - Set<E> getAdjacentEdges(Object node); - - Set<E> getTraversableEdgesFrom(Object source); - Set<E> getTraversableEdgesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source); - Set<E> getTraversableEdgesTo(Object destination); - Set<E> getTraversableEdgesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination); - - Set<N> getTraversableNodesFrom(Object source); - Set<N> getTraversableNodesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source); - Set<N> getTraversableNodesTo(Object destination); - Set<N> getTraversableNodesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination); - - Set<E> getTraversableAdjacentEdgesFrom(Object source); - Set<E> getTraversableAdjacentEdgesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source); - Set<E> getTraversableAdjacentEdgesTo(Object destination); - Set<E> getTraversableAdjacentEdgesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination); + interface EndpointSets<NE extends NodeEndpoint<?>,EE extends EdgeEndpoint<?>> extends Set<Endpoint<?>> + { + Set<NE> getNodeEndpoints(); + Set<EE> getEdgeEndpoints(); + }; - Set<N> getTraversableAdjacentNodesFrom(Object source); - Set<N> getTraversableAdjacentNodesFrom(Cloud<?,? extends Cloud.Endpoint<?,?>> source); + EndpointSets<NE,EE> getAdjacent(Endpoint<?> endpoint); - /** - * Get a list of all reachable nodes adjacent to node. All edges connected to - * node and is traversable from node will have its destination node(s) added to - * the returned list. node itself will appear in the list once for every loop. - * If there are multiple edges connecting node with a particular end point then - * the end point will appear multiple times in the list, once for each hop to - * the end point. - * - * @param destination The whose traversable neighbors are to be returned. - * @return A list of all nodes adjacent to the specified node and traversable - * from the spevified node, empty set if the node has no edges. - * @since 2.0 - */ - Set<N> getTraversableAdjacentNodesTo(Object destination); + Set<EE> getEdgeEndpoints(); + Set<EE> getEdgeEndpoints(Cloud<?> cloud); + Set<EE> getEdgeNeighbors(Endpoint<?> endpoint); - /** - * Get a set of all edges which you can traverse from node. Of course node will - * always be an end point for each edge returned. Throws an - * IllegalArgumentException if node is not in the graph. - * - * @param destination edges returned will be traversable from this node. - * @return An unmodifiable set of all edges that can be traversed from node. - * @since 2.0 - */ - Set<N> getTraversableAdjacentNodesTo(Cloud<?,? extends Cloud.Endpoint<?,?>> destination); + boolean containsEdge( EdgeEndpoint<?> endpoint); + boolean containsAnyEdge(Collection<? extends EdgeEndpoint<?>> endpoint); + boolean containsAllEdge(Collection<? extends EdgeEndpoint<?>> endpoint); + boolean containsEdgeTarget(Cloud<?> target); + boolean containsAnyEdgeTargets(Collection<? extends Cloud<?>> targets); + boolean containsAllEdgeTargets(Collection<? extends Cloud<?>> targets); } diff --git a/src/main/java/com/syncleus/dann/graph/DirectedEdge.java b/src/main/java/com/syncleus/dann/graph/DirectedEdge.java index b43d3899..cd77653c 100644 --- a/src/main/java/com/syncleus/dann/graph/DirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/DirectedEdge.java @@ -19,11 +19,10 @@ package com.syncleus.dann.graph; public interface DirectedEdge< - T, - EP extends DirectedEdge.Endpoint<T> - > extends MixableDirectedEdge<T,T,T,EP,EP,EP>, BidirectedEdge<T,EP> + E extends DirectedEdge.Endpoint<?> + > extends MixableDirectedEdge<E,E,E>, BidirectedEdge<E> { - interface Endpoint<T> extends MixableDirectedEdge.Endpoint<T, T, T>, BidirectedEdge.Endpoint<T> + interface Endpoint<T> extends MixableDirectedEdge.Endpoint<T>, BidirectedEdge.Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/DirectedGraph.java b/src/main/java/com/syncleus/dann/graph/DirectedGraph.java index f57e0b2f..c2638e10 100644 --- a/src/main/java/com/syncleus/dann/graph/DirectedGraph.java +++ b/src/main/java/com/syncleus/dann/graph/DirectedGraph.java @@ -19,33 +19,26 @@ package com.syncleus.dann.graph; public interface DirectedGraph< - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>>, - AE extends DirectedGraph.Endpoint<Object, N, E>, - NE extends DirectedGraph.NodeEndpoint<N, E>, - EE extends DirectedGraph.EdgeEndpoint<N, E> - > extends BidirectedGraph<N, E, AE, NE, EE> + NE extends DirectedGraph.NodeEndpoint<?>, + EE extends DirectedGraph.EdgeEndpoint<?> + > extends BidirectedGraph<NE, EE> { interface Endpoint< - T, - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> + T > - extends BidirectedGraph.Endpoint<T,N,E> + extends BidirectedGraph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> - > extends BidirectedGraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends BidirectedGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> - > extends BidirectedGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends DirectedEdge<?> + > extends BidirectedGraph.EdgeEndpoint<T>, Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java index 7dbcb980..5531191f 100644 --- a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java +++ b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedCloud.java @@ -20,10 +20,10 @@ package com.syncleus.dann.graph; public interface DynamicBidirectedCloud< T, - E extends DynamicBidirectedCloud.Endpoint<T, ? extends T> - > extends DynamicCloud<T,E>, AssignableBidirectedCloud<T,E> + E extends DynamicBidirectedCloud.Endpoint<T> + > extends DynamicCloud<T,E>, AssignableBidirectedCloud<E> { - interface Endpoint<P, T extends P> extends DynamicCloud.Endpoint<P, T>, AssignableBidirectedCloud.Endpoint<P, T> + interface Endpoint<T> extends DynamicCloud.Endpoint<T>, AssignableBidirectedCloud.Endpoint<T> { } } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java index 2563e3aa..4019a239 100644 --- a/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java +++ b/src/main/java/com/syncleus/dann/graph/DynamicBidirectedGraph.java @@ -20,32 +20,27 @@ package com.syncleus.dann.graph; public interface DynamicBidirectedGraph< N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>, - AE extends DynamicBidirectedGraph.Endpoint<Object, N, E>, - NE extends DynamicBidirectedGraph.NodeEndpoint<N, E>, - EE extends DynamicBidirectedGraph.EdgeEndpoint<N, E> - > extends BidirectedGraph<N, E, AE, NE, EE>, DynamicGraph<N, E, AE, NE, EE> + NE extends DynamicBidirectedGraph.NodeEndpoint<N>, + E extends BidirectedEdge<? extends BidirectedEdge.Endpoint<N>>, + EE extends DynamicBidirectedGraph.EdgeEndpoint<E> + > extends BidirectedGraph<NE, EE>, DynamicGraph<N, NE, E, EE>, DynamicBidirectedCloud<N,NE> { interface Endpoint< - T, - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> + T > - extends BidirectedGraph.Endpoint<T,N,E>, DynamicGraph.Endpoint<T,N,E> + extends BidirectedGraph.Endpoint<T>, DynamicGraph.Endpoint<T>, DynamicBidirectedCloud.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends BidirectedGraph.NodeEndpoint<N,E>, DynamicGraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends BidirectedGraph.NodeEndpoint<T>, DynamicGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends BidirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends BidirectedGraph.EdgeEndpoint<N,E>, DynamicGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends BidirectedEdge<?> + > extends BidirectedGraph.EdgeEndpoint<T>, DynamicGraph.EdgeEndpoint<T>, Endpoint<T> { }; } diff --git a/src/main/java/com/syncleus/dann/graph/DynamicCloud.java b/src/main/java/com/syncleus/dann/graph/DynamicCloud.java index 602ebe1b..abf1143b 100644 --- a/src/main/java/com/syncleus/dann/graph/DynamicCloud.java +++ b/src/main/java/com/syncleus/dann/graph/DynamicCloud.java @@ -19,10 +19,10 @@ package com.syncleus.dann.graph; public interface DynamicCloud< T, - E extends DynamicCloud.Endpoint<T, ? extends T> - > extends MutableCloud<T,E>, TraversableCloud<T,E> + E extends DynamicCloud.Endpoint<T> + > extends MutableCloud<T,E>, TraversableCloud<E> { - interface Endpoint<P, T> extends MutableCloud.Endpoint<P, T>, TraversableCloud.Endpoint<P, T> + interface Endpoint<T> extends MutableCloud.Endpoint<T>, TraversableCloud.Endpoint<T> { } } diff --git a/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java index ec1eb2cb..e870a536 100644 --- a/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/DynamicCloudGraph.java @@ -19,37 +19,28 @@ package com.syncleus.dann.graph; public interface DynamicCloudGraph< - A, N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends DynamicCloudGraph.Endpoint<A, A, N, E>, - NE extends DynamicCloudGraph.NodeEndpoint<A, N, E>, - EE extends DynamicCloudGraph.EdgeEndpoint<A, N, E> - > extends TraversableCloudGraph<A,N,E,AE,NE,EE>, DynamicCloud<A, AE> + NE extends DynamicCloudGraph.NodeEndpoint<N>, + E extends TraversableCloud<? extends TraversableCloud.Endpoint<? extends N>>, + EE extends DynamicCloudGraph.EdgeEndpoint<E> + > extends MutableCloudGraph<N,NE,E,EE>, TraversableCloudGraph<NE,EE>, DynamicCloud<N,NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends TraversableCloudGraph.Endpoint<P,T,N,E>, DynamicCloud.Endpoint<P,T> + extends MutableCloudGraph.Endpoint<T>, TraversableCloudGraph.Endpoint<T>, DynamicCloud.Endpoint<T> { }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends TraversableCloudGraph.NodeEndpoint<P,N,E>, DynamicCloud.Endpoint<P,N>, Endpoint<P,N,N,E> + T + > extends MutableCloudGraph.NodeEndpoint<T>, TraversableCloudGraph.NodeEndpoint<T>, DynamicCloud.Endpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends TraversableCloudGraph.EdgeEndpoint<P,N,E>, DynamicCloud.Endpoint<P,E>, Endpoint<P,E,N,E> + T extends TraversableCloud<?> + > extends MutableCloudGraph.EdgeEndpoint<T>, TraversableCloudGraph.EdgeEndpoint<T>, DynamicCloud.Endpoint<T>, Endpoint<T> { }; } diff --git a/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java index d421e037..96fac2fd 100644 --- a/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java +++ b/src/main/java/com/syncleus/dann/graph/DynamicDirectedGraph.java @@ -20,32 +20,27 @@ package com.syncleus.dann.graph; public interface DynamicDirectedGraph< N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>, - AE extends DynamicDirectedGraph.Endpoint<Object, N, E>, - NE extends DynamicDirectedGraph.NodeEndpoint<N, E>, - EE extends DynamicDirectedGraph.EdgeEndpoint<N, E> - > extends DirectedGraph<N, E, AE, NE, EE>, DynamicBidirectedGraph<N, E, AE, NE, EE> + NE extends DynamicDirectedGraph.NodeEndpoint<N>, + E extends DirectedEdge<? extends DirectedEdge.Endpoint<N>>, + EE extends DynamicDirectedGraph.EdgeEndpoint<E> + > extends DirectedGraph<NE, EE>, DynamicBidirectedGraph<N, NE, E, EE> { interface Endpoint< - T, - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> + T > - extends DirectedGraph.Endpoint<T,N,E>, DynamicBidirectedGraph.Endpoint<T,N,E> + extends DirectedGraph.Endpoint<T>, DynamicBidirectedGraph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends DirectedGraph.NodeEndpoint<N,E>, DynamicBidirectedGraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends DirectedGraph.NodeEndpoint<T>, DynamicBidirectedGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends DirectedEdge<N,? extends BidirectedEdge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends DirectedGraph.EdgeEndpoint<N,E>, DynamicBidirectedGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends DirectedEdge<?> + > extends DirectedGraph.EdgeEndpoint<T>, DynamicBidirectedGraph.EdgeEndpoint<T>, Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/DynamicGraph.java b/src/main/java/com/syncleus/dann/graph/DynamicGraph.java index 59f975d9..b7051d09 100644 --- a/src/main/java/com/syncleus/dann/graph/DynamicGraph.java +++ b/src/main/java/com/syncleus/dann/graph/DynamicGraph.java @@ -20,32 +20,27 @@ package com.syncleus.dann.graph; public interface DynamicGraph< N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>, - AE extends DynamicGraph.Endpoint<Object, N, E>, - NE extends DynamicGraph.NodeEndpoint<N, E>, - EE extends DynamicGraph.EdgeEndpoint<N, E> - > extends DynamicCloudGraph<Object, N, E, AE, NE, EE>, TraversableGraph<N,E,AE,NE,EE>, MutableGraph<N,E,AE,NE,EE> + NE extends DynamicGraph.NodeEndpoint<N>, + E extends Edge<? extends Edge.Endpoint<N>> & TraversableCloud<? extends TraversableCloud.Endpoint<N>>, + EE extends DynamicGraph.EdgeEndpoint<E> + > extends DynamicCloudGraph<N, NE, E, EE>, TraversableGraph<NE,EE>, MutableGraph<N,NE,E,EE> { interface Endpoint< - T, - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> + T > - extends DynamicCloudGraph.Endpoint<Object,T,N,E>, TraversableGraph.Endpoint<T,N,E>, MutableGraph.Endpoint<T,N,E> + extends DynamicCloudGraph.Endpoint<T>, TraversableGraph.Endpoint<T>, MutableGraph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends DynamicCloudGraph.NodeEndpoint<Object,N,E>, TraversableGraph.NodeEndpoint<N,E>, MutableGraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends DynamicCloudGraph.NodeEndpoint<T>, TraversableGraph.NodeEndpoint<T>, MutableGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends DynamicCloudGraph.EdgeEndpoint<Object,N,E>, TraversableGraph.EdgeEndpoint<N,E>, MutableGraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends Edge<?> & TraversableCloud<?> + > extends DynamicCloudGraph.EdgeEndpoint<T>, TraversableGraph.EdgeEndpoint<T>, MutableGraph.EdgeEndpoint<T>, Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/Edge.java b/src/main/java/com/syncleus/dann/graph/Edge.java index 64606313..5acd8954 100644 --- a/src/main/java/com/syncleus/dann/graph/Edge.java +++ b/src/main/java/com/syncleus/dann/graph/Edge.java @@ -19,11 +19,10 @@ package com.syncleus.dann.graph; public interface Edge< - T, - E extends Edge.Endpoint<T> - > extends MixableEdge<T,T,T,E,E,E> + E extends Edge.Endpoint<?> + > extends MixableEdge<E,E,E> { - interface Endpoint<T> extends MixableEdge.Endpoint<T, T, T> + interface Endpoint<T> extends MixableEdge.Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/MutableRootedTreeGraph.java b/src/main/java/com/syncleus/dann/graph/EndpointSet.java similarity index 87% rename from src/main/java/com/syncleus/dann/graph/MutableRootedTreeGraph.java rename to src/main/java/com/syncleus/dann/graph/EndpointSet.java index e40cb9de..587a87c0 100644 --- a/src/main/java/com/syncleus/dann/graph/MutableRootedTreeGraph.java +++ b/src/main/java/com/syncleus/dann/graph/EndpointSet.java @@ -18,6 +18,12 @@ ******************************************************************************/ package com.syncleus.dann.graph; -public interface MutableRootedTreeGraph<N, E extends DirectedEdge<N>> extends RootedTreeGraph<N, E>, MutableTreeGraph<N, E> +import java.util.Map; +import java.util.Set; + +interface EndpointSet<T, E extends Cloud.Endpoint<? extends T>> extends Set<E> { -} + Map<T, EndpointSet<T,E>> getTargets(); + Set<T> getTargetSet(); + int targetCount(Object target); +} \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java index 44f1fb0e..1b7abbec 100644 --- a/src/main/java/com/syncleus/dann/graph/Graph.java +++ b/src/main/java/com/syncleus/dann/graph/Graph.java @@ -19,33 +19,26 @@ package com.syncleus.dann.graph; public interface Graph< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>>, - AE extends Graph.Endpoint<Object, N, E>, - NE extends Graph.NodeEndpoint<N, E>, - EE extends Graph.EdgeEndpoint<N, E> - > extends Hypergraph<N, E, AE, NE, EE> + NE extends Graph.NodeEndpoint<?>, + EE extends Graph.EdgeEndpoint<? extends Edge<?>> + > extends Hypergraph<NE, EE> { interface Endpoint< - T, - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> + T > - extends Hypergraph.Endpoint<T,N,E> + extends Hypergraph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> - > extends Hypergraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends Hypergraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> - > extends Hypergraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends Edge<?> + > extends Hypergraph.EdgeEndpoint<T>, Endpoint<T> { }; } diff --git a/src/main/java/com/syncleus/dann/graph/MutableTreeGraph.java b/src/main/java/com/syncleus/dann/graph/HashEndpointSet.java similarity index 92% rename from src/main/java/com/syncleus/dann/graph/MutableTreeGraph.java rename to src/main/java/com/syncleus/dann/graph/HashEndpointSet.java index ed245961..9ad36909 100644 --- a/src/main/java/com/syncleus/dann/graph/MutableTreeGraph.java +++ b/src/main/java/com/syncleus/dann/graph/HashEndpointSet.java @@ -18,6 +18,6 @@ ******************************************************************************/ package com.syncleus.dann.graph; -public interface MutableTreeGraph<N, E extends BidirectedEdge<N>> extends TreeGraph<N, E>, DynamicBidirectedGraph<N, E> +final class HashEndpointSet<T, E extends Cloud.Endpoint<? extends T>> extends EndpointSet<T,E> { } diff --git a/src/main/java/com/syncleus/dann/graph/HyperEdge.java b/src/main/java/com/syncleus/dann/graph/HyperEdge.java index 7336e2bf..4694239e 100644 --- a/src/main/java/com/syncleus/dann/graph/HyperEdge.java +++ b/src/main/java/com/syncleus/dann/graph/HyperEdge.java @@ -19,13 +19,12 @@ package com.syncleus.dann.graph; public interface Hyperedge< - T, - EP extends Hyperedge.Endpoint<T, ? extends T> - > extends Cloud<T, EP> + E extends Hyperedge.Endpoint<?> + > extends Cloud<E> { - interface Endpoint<P, T> extends Cloud.Endpoint<P, T> + interface Endpoint<T> extends Cloud.Endpoint<T> { }; - boolean isSymmetric(Hyperedge<T,EP> symmetricEdge); + boolean isSymmetric(Hyperedge<? extends E> symmetricEdge); } diff --git a/src/main/java/com/syncleus/dann/graph/HyperGraph.java b/src/main/java/com/syncleus/dann/graph/HyperGraph.java index 36bf3adc..1255e926 100644 --- a/src/main/java/com/syncleus/dann/graph/HyperGraph.java +++ b/src/main/java/com/syncleus/dann/graph/HyperGraph.java @@ -26,36 +26,31 @@ package com.syncleus.dann.graph; * @since 2.0 */ public interface Hypergraph< - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>>, - AE extends Hypergraph.Endpoint<Object, N, E>, - NE extends Hypergraph.NodeEndpoint<N, E>, - EE extends Hypergraph.EdgeEndpoint<N, E> - > extends CloudGraph<Object, N, E, AE, NE, EE> + NE extends Hypergraph.NodeEndpoint<?>, + EE extends Hypergraph.EdgeEndpoint<?> + > extends CloudGraph<NE, EE> { interface Endpoint< - T, - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> + T > - extends CloudGraph.Endpoint<Object,T,N,E> + extends CloudGraph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.NodeEndpoint<Object,N,E>, Endpoint<N,N,E> + T + > extends CloudGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.EdgeEndpoint<Object,N,E>, Endpoint<E,N,E> + T extends Hyperedge<?> + > extends CloudGraph.EdgeEndpoint<T>, Endpoint<T> { }; + boolean isUniform(); + /** * True if this graph enforces its edges to have a maximum rank. * diff --git a/src/main/java/com/syncleus/dann/graph/JoinableCloud.java b/src/main/java/com/syncleus/dann/graph/JoinableCloud.java index 3b34002f..3b4113b2 100644 --- a/src/main/java/com/syncleus/dann/graph/JoinableCloud.java +++ b/src/main/java/com/syncleus/dann/graph/JoinableCloud.java @@ -23,14 +23,14 @@ import java.util.Set; public interface JoinableCloud< T, - EP extends JoinableCloud.Endpoint<T, ? extends T> - > extends Cloud<T,EP> + E extends JoinableCloud.Endpoint<T> + > extends Cloud<E> { - interface Endpoint<P, T> extends Cloud.Endpoint<P, T> + interface Endpoint<T> extends Cloud.Endpoint<T> { } - EP join(T edge) throws InvalidGraphException; - Map<T, EP> joins(Set<? extends T> edges) throws InvalidGraphException; - Map<T, Set<EP>> joins(Map<? extends T,? extends Integer> edges) throws InvalidGraphException; + E join(T target) throws InvalidGraphException; + Set<E> joins(Set<? extends T> targets) throws InvalidGraphException; + Set<E> joins(Map<? extends T,? extends Integer> targets) throws InvalidGraphException; } diff --git a/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java index 3fe396b1..25f97f60 100644 --- a/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/JoinableCloudGraph.java @@ -22,47 +22,35 @@ import java.util.Map; import java.util.Set; public interface JoinableCloudGraph< - A, N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends JoinableCloudGraph.Endpoint<A, A, N, E>, - NE extends JoinableCloudGraph.NodeEndpoint<A, N, E>, - EE extends JoinableCloudGraph.EdgeEndpoint<A, N, E> - > extends CloudGraph<A,N,E,AE,NE,EE>, JoinableCloud<A, AE> + NE extends JoinableCloudGraph.NodeEndpoint<N>, + E extends Cloud<? extends Cloud.Endpoint<? extends N>>, + EE extends JoinableCloudGraph.EdgeEndpoint<E> + > extends CloudGraph<NE,EE>, JoinableCloud<N,NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends CloudGraph.Endpoint<P,T,N,E>, JoinableCloud.Endpoint<P,T> + extends CloudGraph.Endpoint<T>, JoinableCloud.Endpoint<T> { }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.NodeEndpoint<P,N,E>, JoinableCloud.Endpoint<P,N>, Endpoint<P,N,N,E> + T + > extends CloudGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.EdgeEndpoint<P,N,E>, JoinableCloud.Endpoint<P,E>, Endpoint<P,E,N,E> + T extends Cloud<?> + > extends CloudGraph.EdgeEndpoint<T>, Endpoint<T> { }; - NE joinNode(N node) throws InvalidGraphException; - Map<N, NE> joinNodes(Set<? extends N> nodes) throws InvalidGraphException; - Map<N, Set<NE>> joinNodes(Map<? extends N,? extends Integer> nodes) throws InvalidGraphException; - EE joinEdge(E edge) throws InvalidGraphException; - Map<E, EE> joinEdges(Set<? extends E> edges) throws InvalidGraphException; - Map<E, Set<EE>> joinEdges(Map<? extends E,? extends Integer> edges) throws InvalidGraphException; + Set<EE> joinEdges(Set<? extends E> edges) throws InvalidGraphException; + Set<EE> joinEdges(Map<? extends E,? extends Integer> edges) throws InvalidGraphException; - Map<?, CloudGraph.Endpoint<?, ?, N,E>> joinAll(Set<? extends N> addNodes, Set<? extends E> addEdges) throws InvalidGraphException; + EndpointSets<NE,EE> joinAll(Set<? extends N> addNodes, Set<? extends E> addEdges) throws InvalidGraphException; + EndpointSets<NE,EE> joinAll(Map<? extends N,? extends Integer> addNodes, Map<? extends E,? extends Integer> addEdges) throws InvalidGraphException; } diff --git a/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java index bc6eb9d5..26a53f92 100644 --- a/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java @@ -19,15 +19,12 @@ package com.syncleus.dann.graph; public interface MixableBidirectedEdge< - T, - LT extends T, - RT extends T, - E extends MixableBidirectedEdge.Endpoint<T, ? extends T, ? extends T>, - LE extends MixableBidirectedEdge.Endpoint<T, LT, RT>, - RE extends MixableBidirectedEdge.Endpoint<T, RT, LT> - > extends MixableEdge<T, LT, RT, E, LE, RE>, BidirectedCloud<T, E> + E extends MixableBidirectedEdge.Endpoint<?>, + LE extends E, + RE extends E + > extends MixableEdge<E, LE, RE>, BidirectedCloud<E> { - interface Endpoint<P, T extends P, N extends P> extends MixableEdge.Endpoint<P, T, N>, BidirectedCloud.Endpoint<P, T> + interface Endpoint<T> extends MixableEdge.Endpoint<T>, BidirectedCloud.Endpoint<T> { }; diff --git a/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java b/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java index 7cd69aff..993be099 100644 --- a/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java +++ b/src/main/java/com/syncleus/dann/graph/MixableDirectedEdge.java @@ -19,15 +19,12 @@ package com.syncleus.dann.graph; public interface MixableDirectedEdge< - T, - ST extends T, - DT extends T, - E extends MixableBidirectedEdge.Endpoint<T, ? extends T, ? extends T>, - SE extends MixableBidirectedEdge.Endpoint<T, ST, DT>, - DE extends MixableBidirectedEdge.Endpoint<T, DT, ST> - > extends MixableBidirectedEdge<T, ST, DT, E, SE, DE> + E extends MixableBidirectedEdge.Endpoint<?>, + SE extends E, + DE extends E + > extends MixableBidirectedEdge<E, SE, DE> { - interface Endpoint<P, T extends P, N extends P> extends MixableBidirectedEdge.Endpoint<P, T, N> + interface Endpoint<T> extends MixableBidirectedEdge.Endpoint<T> { }; diff --git a/src/main/java/com/syncleus/dann/graph/MixableEdge.java b/src/main/java/com/syncleus/dann/graph/MixableEdge.java index b684f1d7..f8cd12bc 100644 --- a/src/main/java/com/syncleus/dann/graph/MixableEdge.java +++ b/src/main/java/com/syncleus/dann/graph/MixableEdge.java @@ -19,17 +19,13 @@ package com.syncleus.dann.graph; public interface MixableEdge< - T, - LT extends T, - RT extends T, - E extends MixableEdge.Endpoint<T, ? extends T, ? extends T>, - LE extends MixableEdge.Endpoint<T, LT, RT>, - RE extends MixableEdge.Endpoint<T, RT, LT> - > extends Hyperedge<T, E> + E extends MixableEdge.Endpoint<?>, + LE extends E, + RE extends E + > extends Hyperedge<E> { - interface Endpoint<P, T extends P, N extends P> extends Hyperedge.Endpoint<P, T> + interface Endpoint<T> extends Hyperedge.Endpoint<T> { - Endpoint<P,N,T> getNeighbor(); }; LE getLeftEndpoint(); diff --git a/src/main/java/com/syncleus/dann/graph/MutableCloud.java b/src/main/java/com/syncleus/dann/graph/MutableCloud.java index 0c3ee7c3..7943aafb 100644 --- a/src/main/java/com/syncleus/dann/graph/MutableCloud.java +++ b/src/main/java/com/syncleus/dann/graph/MutableCloud.java @@ -20,10 +20,10 @@ package com.syncleus.dann.graph; public interface MutableCloud< T, - EP extends MutableCloud.Endpoint<T, ? extends T> - > extends AssignableCloud<T,EP>, JoinableCloud<T,EP>, PartibleCloud<T, EP> + E extends MutableCloud.Endpoint<T> + > extends AssignableCloud<E>, JoinableCloud<T,E>, PartibleCloud<E> { - interface Endpoint<P, T> extends AssignableCloud.Endpoint<P, T>, JoinableCloud.Endpoint<P, T>, PartibleCloud.Endpoint<P, T> + interface Endpoint<T> extends AssignableCloud.Endpoint<T>, JoinableCloud.Endpoint<T>, PartibleCloud.Endpoint<T> { } } diff --git a/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java index 61f93fed..af675a30 100644 --- a/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/MutableCloudGraph.java @@ -22,39 +22,31 @@ import java.util.Map; import java.util.Set; public interface MutableCloudGraph< - A, N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends MutableCloudGraph.Endpoint<A, A, N, E>, - NE extends MutableCloudGraph.NodeEndpoint<A, N, E>, - EE extends MutableCloudGraph.EdgeEndpoint<A, N, E> - > extends JoinableCloudGraph<A,N,E,AE,NE,EE>, PartibleCloudGraph<A,N,E,AE,NE,EE>, AssignableCloudGraph<A,N,E,AE,NE,EE>, MutableCloud<A,AE> + NE extends MutableCloudGraph.NodeEndpoint<N>, + E extends Cloud<? extends Cloud.Endpoint<? extends N>>, + EE extends MutableCloudGraph.EdgeEndpoint<E> + > extends JoinableCloudGraph<N,NE,E,EE>, PartibleCloudGraph<NE,EE>, AssignableCloudGraph<NE,EE>, MutableCloud<N,NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends JoinableCloudGraph.Endpoint<P,T,N,E>, PartibleCloudGraph.Endpoint<P,T,N,E>, AssignableCloudGraph.Endpoint<P,T,N,E>, MutableCloud.Endpoint<P,T> + extends JoinableCloudGraph.Endpoint<T>, PartibleCloudGraph.Endpoint<T>, AssignableCloudGraph.Endpoint<T>, MutableCloud.Endpoint<T> { }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends JoinableCloudGraph.NodeEndpoint<P,N,E>, PartibleCloudGraph.NodeEndpoint<P,N,E>, AssignableCloudGraph.NodeEndpoint<P,N,E>, Endpoint<P,N,N,E> + T + > extends JoinableCloudGraph.NodeEndpoint<T>, PartibleCloudGraph.NodeEndpoint<T>, AssignableCloudGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends JoinableCloudGraph.EdgeEndpoint<P,N,E>, PartibleCloudGraph.EdgeEndpoint<P,N,E>, AssignableCloudGraph.EdgeEndpoint<P,N,E>, Endpoint<P,E,N,E> + T extends Cloud<?> + > extends JoinableCloudGraph.EdgeEndpoint<T>, PartibleCloudGraph.EdgeEndpoint<T>, AssignableCloudGraph.EdgeEndpoint<T>, Endpoint<T> { }; - Map<?, CloudGraph.Endpoint<?, ?, N,E>> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, final Set<? extends CloudGraph.Endpoint<?,?,?,?>> disconnectEndpoints) throws InvalidGraphException; + EndpointSets<NE,EE> reconfigure(Set<? extends N> addNodes, Set<? extends E> addEdges, Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException; + EndpointSets<NE,EE> reconfigure(Map<? extends N,? extends Integer> addNodes, Map<? extends E,? extends Integer> addEdges, Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException; } diff --git a/src/main/java/com/syncleus/dann/graph/MutableGraph.java b/src/main/java/com/syncleus/dann/graph/MutableGraph.java index abf11138..4d34551f 100644 --- a/src/main/java/com/syncleus/dann/graph/MutableGraph.java +++ b/src/main/java/com/syncleus/dann/graph/MutableGraph.java @@ -20,32 +20,27 @@ package com.syncleus.dann.graph; public interface MutableGraph< N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>>, - AE extends MutableGraph.Endpoint<Object, N, E>, - NE extends MutableGraph.NodeEndpoint<N, E>, - EE extends MutableGraph.EdgeEndpoint<N, E> - > extends MutableCloudGraph<Object, N, E, AE, NE, EE>, Graph<N,E,AE,NE,EE> + NE extends MutableGraph.NodeEndpoint<N>, + E extends Edge<? extends Edge.Endpoint<N>>, + EE extends MutableGraph.EdgeEndpoint<E> + > extends MutableCloudGraph<N, NE, E, EE>, Graph<NE,EE> { interface Endpoint< - T, - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> + T > - extends MutableCloudGraph.Endpoint<Object,T,N,E>, Graph.Endpoint<T,N,E> + extends MutableCloudGraph.Endpoint<T>, Graph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends MutableCloudGraph.NodeEndpoint<Object,N,E>, Graph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends MutableCloudGraph.NodeEndpoint<T>, Graph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & AssignableCloud<? extends N, ? extends AssignableCloud.Endpoint<? extends N, ? extends N>> - > extends MutableCloudGraph.EdgeEndpoint<Object,N,E>, Graph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends Edge<?> + > extends MutableCloudGraph.EdgeEndpoint<T>, Graph.EdgeEndpoint<T>, Endpoint<T> { }; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java b/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java index 227346f9..bd7c052f 100644 --- a/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java +++ b/src/main/java/com/syncleus/dann/graph/MutableHyperGraph.java @@ -20,32 +20,27 @@ package com.syncleus.dann.graph; public interface MutableHypergraph< N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>>, - AE extends MutableHypergraph.Endpoint<Object, N, E>, - NE extends MutableHypergraph.NodeEndpoint<N, E>, - EE extends MutableHypergraph.EdgeEndpoint<N, E> - > extends MutableCloudGraph<Object, N, E, AE, NE, EE>, Hypergraph<N,E,AE,NE,EE> + NE extends MutableHypergraph.NodeEndpoint<N>, + E extends Hyperedge<? extends Hyperedge.Endpoint<N>>, + EE extends MutableHypergraph.EdgeEndpoint<E> + > extends MutableCloudGraph<N, NE, E, EE>, Hypergraph<NE,EE> { interface Endpoint< - T, - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>> + T > - extends MutableCloudGraph.Endpoint<Object,T,N,E>, Hypergraph.Endpoint<T,N,E> + extends MutableCloudGraph.Endpoint<T>, Hypergraph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>> - > extends MutableCloudGraph.NodeEndpoint<Object,N,E>, Hypergraph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends MutableCloudGraph.NodeEndpoint<T>, Hypergraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends Hyperedge<N,? extends Hyperedge.Endpoint<? extends N, ? extends N>> & MutableCloud<? extends N, ? extends MutableCloud.Endpoint<? extends N, ? extends N>> - > extends MutableCloudGraph.EdgeEndpoint<Object,N,E>, Hypergraph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends Hyperedge<?> + > extends MutableCloudGraph.EdgeEndpoint<T>, Hypergraph.EdgeEndpoint<T>, Endpoint<T> { }; } diff --git a/src/main/java/com/syncleus/dann/graph/PartibleCloud.java b/src/main/java/com/syncleus/dann/graph/PartibleCloud.java index 7df21ea8..8d9b0d58 100644 --- a/src/main/java/com/syncleus/dann/graph/PartibleCloud.java +++ b/src/main/java/com/syncleus/dann/graph/PartibleCloud.java @@ -21,16 +21,15 @@ package com.syncleus.dann.graph; import java.util.Set; public interface PartibleCloud< - T, - EP extends PartibleCloud.Endpoint<T, ? extends T> - > extends Cloud<T,EP> + E extends PartibleCloud.Endpoint<?> + > extends Cloud<E> { - interface Endpoint<P, T> extends Cloud.Endpoint<P, T> + interface Endpoint<T> extends Cloud.Endpoint<T> { void part() throws InvalidEdgeException; } - void leave(PartibleCloud.Endpoint<?, ?> endpoint) throws InvalidGraphException; - void leave(Set<? extends PartibleCloud.Endpoint<?, ?>> endpoints) throws InvalidGraphException; + void leave(PartibleCloud.Endpoint<?> endpoint) throws InvalidGraphException; + void leave(Set<? extends PartibleCloud.Endpoint<?>> endpoints) throws InvalidGraphException; void clear() throws InvalidGraphException; } diff --git a/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java b/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java index 14981ae9..87387b5b 100644 --- a/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/PartibleCloudGraph.java @@ -18,52 +18,37 @@ ******************************************************************************/ package com.syncleus.dann.graph; -import java.util.Map; import java.util.Set; public interface PartibleCloudGraph< - A, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends PartibleCloudGraph.Endpoint<A, A, N, E>, - NE extends PartibleCloudGraph.NodeEndpoint<A, N, E>, - EE extends PartibleCloudGraph.EdgeEndpoint<A, N, E> - > extends CloudGraph<A,N,E,AE,NE,EE>, PartibleCloud<A, AE> + NE extends PartibleCloudGraph.NodeEndpoint<?>, + EE extends PartibleCloudGraph.EdgeEndpoint<? extends Cloud<?>> + > extends CloudGraph<NE,EE>, PartibleCloud<NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends CloudGraph.Endpoint<P,T,N,E>, PartibleCloud.Endpoint<P,T> + extends CloudGraph.Endpoint<T>, PartibleCloud.Endpoint<T> { }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.NodeEndpoint<P,N,E>, PartibleCloud.Endpoint<P,N>, Endpoint<P,N,N,E> + T + > extends CloudGraph.NodeEndpoint<T>, PartibleCloud.Endpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.EdgeEndpoint<P,N,E>, PartibleCloud.Endpoint<P,E>, Endpoint<P,E,N,E> + T extends Cloud<?> + > extends CloudGraph.EdgeEndpoint<T>, PartibleCloud.Endpoint<T>, Endpoint<T> { }; - void leaveNode(MutableCloudGraph.NodeEndpoint<?,?,?> endpoint) throws InvalidGraphException; - void leaveNodes(Set<? extends MutableCloudGraph.NodeEndpoint<?,?,?>> endpoint) throws InvalidGraphException; - - void leaveEdge(MutableCloudGraph.EdgeEndpoint<?, ?, ?> endpoint) throws InvalidGraphException; - void leaveEdges(Set<? extends MutableCloudGraph.EdgeEndpoint<?, ?, ?>> endpoints) throws InvalidGraphException; - - void clear() throws InvalidGraphException; + void leaveEdge(EdgeEndpoint<?> endpoint) throws InvalidGraphException; + void leaveEdges(Set<? extends EdgeEndpoint<?>> endpoints) throws InvalidGraphException; void clearEdges() throws InvalidGraphException; - Map<?, CloudGraph.Endpoint<?, ?, N,E>> leaveAll(final Set<? extends CloudGraph.Endpoint<?,?,?,?>> disconnectEndpoints) throws InvalidGraphException; + void leaveAll(final Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException; + Set<EE> recursiveLeaveAll(final Set<? extends Endpoint<?>> disconnectEndpoints) throws InvalidGraphException; + void clearAll() throws InvalidGraphException; } \ No newline at end of file diff --git a/src/main/java/com/syncleus/dann/graph/TraversableCloud.java b/src/main/java/com/syncleus/dann/graph/TraversableCloud.java index 7a4a0049..9c8bca6d 100644 --- a/src/main/java/com/syncleus/dann/graph/TraversableCloud.java +++ b/src/main/java/com/syncleus/dann/graph/TraversableCloud.java @@ -21,18 +21,17 @@ package com.syncleus.dann.graph; import java.util.Set; public interface TraversableCloud< - T, - EP extends TraversableCloud.Endpoint<T, ? extends T> - > extends Cloud<T,EP> + E extends TraversableCloud.Endpoint<?> + > extends Cloud<E> { - interface Endpoint<P, T> extends Cloud.Endpoint<P, T> + interface Endpoint<T> extends Cloud.Endpoint<T> { - Set<Endpoint<P,P>> getTraversableNeighborsTo(); - Set<Endpoint<P,P>> getTraversableNeighborsFrom(); - boolean isTraversable(Cloud.Endpoint<?,?> destination); } - Set<T> getTraversableFrom(Object target); - Set<T> getTraversableTo(Object target); - boolean isTraversable(Object sourceTarget, Object destinationTarget); + Set<E> getTraversableFrom(Endpoint<?> target); + Set<E> getTraversableTo(Endpoint<?> target); + boolean isTraversable(Endpoint<?> sourceTarget, Endpoint<?> destinationTarget); + + Set<E> getTraversableNeighborsTo(Endpoint<?> fromEndpoint); + Set<E> getTraversableNeighborsFrom(Endpoint<?> toEndpoint); } diff --git a/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java b/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java index 29125980..d0c66f56 100644 --- a/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java +++ b/src/main/java/com/syncleus/dann/graph/TraversableCloudGraph.java @@ -18,38 +18,59 @@ ******************************************************************************/ package com.syncleus.dann.graph; +import java.util.Set; + public interface TraversableCloudGraph< - A, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>>, - AE extends TraversableCloudGraph.Endpoint<A, A, N, E>, - NE extends TraversableCloudGraph.NodeEndpoint<A, N, E>, - EE extends TraversableCloudGraph.EdgeEndpoint<A, N, E> - > extends CloudGraph<A,N,E,AE,NE,EE>, TraversableCloud<A, AE> + NE extends TraversableCloudGraph.NodeEndpoint<?>, + EE extends TraversableCloudGraph.EdgeEndpoint<? extends TraversableCloud<?>> + > extends CloudGraph<NE,EE>, TraversableCloud<NE> { interface Endpoint< - P, - T, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> + T > - extends CloudGraph.Endpoint<P,T,N,E>, TraversableCloud.Endpoint<P,T> + extends CloudGraph.Endpoint<T>, TraversableCloud.Endpoint<T> { }; interface NodeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.NodeEndpoint<P,N,E>, TraversableCloud.Endpoint<P,N>, Endpoint<P,N,N,E> + T + > extends CloudGraph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - P, - N, - E extends Cloud<N,? extends Cloud.Endpoint<? extends N, ? extends N>> - > extends CloudGraph.EdgeEndpoint<P,N,E>, TraversableCloud.Endpoint<P,E>, Endpoint<P,E,N,E> + T extends TraversableCloud<?> + > extends CloudGraph.EdgeEndpoint<T>, Endpoint<T> { }; + + + Set<EE> getTraversableEdgesFrom(Endpoint<?> source); + Set<EE> getTraversableEdgesTo(Endpoint<?> destination); + + /** + * Get a list of all reachable nodes adjacent to node. All edges connected to + * node and is traversable from node will have its destination node(s) added to + * the returned list. node itself will appear in the list once for every loop. + * If there are multiple edges connecting node with a particular end point then + * the end point will appear multiple times in the list, once for each hop to + * the end point. + * + * @param destination The whose traversable neighbors are to be returned. + * @return A list of all nodes adjacent to the specified node and traversable + * from the spevified node, empty set if the node has no edges. + * @since 2.0 + */ + EndpointSets<NE,EE> getTraversableAdjacentTo(Endpoint<?> destination); + + /** + * Get a set of all edges which you can traverse from node. Of course node will + * always be an end point for each edge returned. Throws an + * IllegalArgumentException if node is not in the graph. + * + * @param destination edges returned will be traversable from this node. + * @return An unmodifiable set of all edges that can be traversed from node. + * @since 2.0 + */ + EndpointSets<NE,EE> getTraversableAdjacentFrom(Endpoint<?> destination); } diff --git a/src/main/java/com/syncleus/dann/graph/TraversableGraph.java b/src/main/java/com/syncleus/dann/graph/TraversableGraph.java index ca08065b..1f9211a2 100644 --- a/src/main/java/com/syncleus/dann/graph/TraversableGraph.java +++ b/src/main/java/com/syncleus/dann/graph/TraversableGraph.java @@ -19,33 +19,26 @@ package com.syncleus.dann.graph; public interface TraversableGraph< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>>, - AE extends TraversableGraph.Endpoint<Object, N, E>, - NE extends TraversableGraph.NodeEndpoint<N, E>, - EE extends TraversableGraph.EdgeEndpoint<N, E> - > extends TraversableCloudGraph<Object, N, E, AE, NE, EE>, Graph<N,E,AE,NE,EE> + NE extends TraversableGraph.NodeEndpoint<?>, + EE extends TraversableGraph.EdgeEndpoint<?> + > extends TraversableCloudGraph<NE, EE>, Graph<NE,EE> { interface Endpoint< - T, - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> + T > - extends TraversableCloudGraph.Endpoint<Object,T,N,E>, Graph.Endpoint<T,N,E> + extends TraversableCloudGraph.Endpoint<T>, Graph.Endpoint<T> { }; interface NodeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> - > extends TraversableCloudGraph.NodeEndpoint<Object,N,E>, Graph.NodeEndpoint<N,E>, Endpoint<N,N,E> + T + > extends TraversableCloudGraph.NodeEndpoint<T>, Graph.NodeEndpoint<T>, Endpoint<T> { }; interface EdgeEndpoint< - N, - E extends Edge<N,? extends Edge.Endpoint<? extends N>> & TraversableCloud<? extends N, ? extends TraversableCloud.Endpoint<? extends N, ? extends N>> - > extends TraversableCloudGraph.EdgeEndpoint<Object,N,E>, Graph.EdgeEndpoint<N,E>, Endpoint<E,N,E> + T extends Edge<?> & TraversableCloud<?> + > extends TraversableCloudGraph.EdgeEndpoint<T>, Graph.EdgeEndpoint<T>, Endpoint<T> { }; } -- GitLab