From 45d73d0278af0e96d77af7af3baa3742a25d145d Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Fri, 16 Sep 2011 22:33:47 -0400
Subject: [PATCH] CHECKPOINT: began to split up the class structure a bit more

---
 .../syncleus/dann/graph/AssignableCloud.java  | 35 ++++++++++++++++
 .../syncleus/dann/graph/AssignableEdge.java   | 29 +++++++++++++
 .../syncleus/dann/graph/AssignableGraph.java  | 16 ++++---
 .../java/com/syncleus/dann/graph/Cloud.java   |  5 ---
 .../java/com/syncleus/dann/graph/Graph.java   |  5 ++-
 .../com/syncleus/dann/graph/HyperEdge.java    | 10 ++---
 .../syncleus/dann/graph/JoinableCloud.java    | 36 ++++++++++++++++
 .../com/syncleus/dann/graph/JoinableEdge.java | 29 +++++++++++++
 .../syncleus/dann/graph/JoinableGraph.java    | 42 +++++++++++++++++++
 .../dann/graph/MixableBidirectedEdge.java     | 17 ++++++--
 .../com/syncleus/dann/graph/MutableCloud.java | 29 +++++++++++++
 .../com/syncleus/dann/graph/MutableEdge.java  |  4 +-
 .../com/syncleus/dann/graph/MutableGraph.java | 15 +++----
 .../syncleus/dann/graph/MutableHyperEdge.java | 11 +----
 .../syncleus/dann/graph/PartibleCloud.java    | 36 ++++++++++++++++
 .../com/syncleus/dann/graph/PartibleEdge.java | 29 +++++++++++++
 .../syncleus/dann/graph/PartibleGraph.java    | 42 +++++++++++++++++++
 17 files changed, 352 insertions(+), 38 deletions(-)
 create mode 100644 src/main/java/com/syncleus/dann/graph/AssignableCloud.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/AssignableEdge.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/JoinableCloud.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/JoinableEdge.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/JoinableGraph.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/MutableCloud.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/PartibleCloud.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/PartibleEdge.java
 create mode 100644 src/main/java/com/syncleus/dann/graph/PartibleGraph.java

diff --git a/src/main/java/com/syncleus/dann/graph/AssignableCloud.java b/src/main/java/com/syncleus/dann/graph/AssignableCloud.java
new file mode 100644
index 00000000..8ba2d67d
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/AssignableCloud.java
@@ -0,0 +1,35 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+import java.util.Map;
+import java.util.Set;
+
+public interface AssignableCloud<
+	  	T,
+	  	EP extends AssignableCloud.Endpoint<? extends T>
+	  > extends Cloud<T,EP>
+{
+	interface Endpoint<T> extends Cloud.Endpoint<T>
+	{
+		void setTarget(T newTarget) throws InvalidEdgeException;
+	}
+
+	void reassign(Map<? extends EP,? extends T> reassignments) throws InvalidGraphException;
+}
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableEdge.java b/src/main/java/com/syncleus/dann/graph/AssignableEdge.java
new file mode 100644
index 00000000..fe9d1d38
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/AssignableEdge.java
@@ -0,0 +1,29 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+public interface AssignableEdge<
+	  	T,
+	  	EP extends AssignableEdge.Endpoint<? extends T>
+	  > extends Edge<T, EP>, AssignableCloud<T,EP>
+{
+	interface Endpoint<T> extends Edge.Endpoint<T>, AssignableCloud.Endpoint<T>
+	{
+	};
+}
diff --git a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
index 9be50dc7..4fdc973d 100644
--- a/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/AssignableGraph.java
@@ -23,22 +23,28 @@ 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>
+	  >  extends Graph<N,E,NEP,EEP>, AssignableCloud<Object,AssignableGraph.Endpoint<?, N,E>>
 {
+	interface Endpoint<
+			  T,
+			  N,
+			  E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>
+		  >
+		  extends Graph.Endpoint<T,N,E>, AssignableCloud.Endpoint<T>
+	{
+	};
 
 	interface NodeEndpoint<
 		  ON,
 		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
-	  > extends Graph.NodeEndpoint<ON,OE>, Cloud.AssignableEndpoint<ON>
+	  > extends Graph.NodeEndpoint<ON,OE>, AssignableCloud.Endpoint<ON>
 	{
-		void setTarget(ON newTarget) throws InvalidGraphException;
 	};
 
 	interface EdgeEndpoint<
 		  ON,
 		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
-	  > extends Graph.EdgeEndpoint<ON,OE>, Cloud.AssignableEndpoint<OE>
+	  > extends Graph.EdgeEndpoint<ON,OE>, AssignableCloud.Endpoint<OE>
 	{
-		void setTarget(OE newTarget) throws InvalidGraphException;
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/Cloud.java b/src/main/java/com/syncleus/dann/graph/Cloud.java
index 094c4cac..053fb050 100644
--- a/src/main/java/com/syncleus/dann/graph/Cloud.java
+++ b/src/main/java/com/syncleus/dann/graph/Cloud.java
@@ -40,11 +40,6 @@ 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/Graph.java b/src/main/java/com/syncleus/dann/graph/Graph.java
index 16484623..0b5e66b7 100644
--- a/src/main/java/com/syncleus/dann/graph/Graph.java
+++ b/src/main/java/com/syncleus/dann/graph/Graph.java
@@ -19,6 +19,7 @@
 package com.syncleus.dann.graph;
 
 import java.util.Set;
+import com.sun.xml.internal.org.jvnet.fastinfoset.ExternalVocabulary;
 
 /**
  * Represents a graph as a collection of nodes connected by edges. A graph does
@@ -34,11 +35,13 @@ import java.util.Set;
  * @param <E> The type of edge for the given node type
  */
 public interface Graph<
+	  	A,
 	  	N,
 	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>,
+	  	AE extends Graph.Endpoint<A, N, E>,
 	  	NE extends Graph.NodeEndpoint<N, E>,
 	  	EE extends Graph.EdgeEndpoint<N, E>
-	  > extends Cloud<Object,Graph.Endpoint<?, N,E>>
+	  > extends Cloud<A,AE>
 {
 	interface Endpoint<
 			  T,
diff --git a/src/main/java/com/syncleus/dann/graph/HyperEdge.java b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
index 9bf41930..9a568910 100644
--- a/src/main/java/com/syncleus/dann/graph/HyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/HyperEdge.java
@@ -19,13 +19,13 @@
 package com.syncleus.dann.graph;
 
 public interface HyperEdge<
-	  	N,
-	  	EP extends Edge.Endpoint<N>
-	  > extends Edge<N, EP>
+	  	T,
+	  	EP extends HyperEdge.Endpoint<? extends T>
+	  > extends Edge<T, EP>
 {
-	interface Endpoint<NN, EN extends NN> extends Edge.Endpoint<NN, EN>
+	interface Endpoint<NN> extends Edge.Endpoint<NN>
 	{
 	};
 
-	boolean isSymmetric(HyperEdge<N> symmetricEdge);
+	boolean isSymmetric(HyperEdge<T,EP> symmetricEdge);
 }
diff --git a/src/main/java/com/syncleus/dann/graph/JoinableCloud.java b/src/main/java/com/syncleus/dann/graph/JoinableCloud.java
new file mode 100644
index 00000000..e0841a68
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/JoinableCloud.java
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+import java.util.Map;
+import java.util.Set;
+
+public interface JoinableCloud<
+	  	T,
+	  	EP extends JoinableCloud.Endpoint<? extends T>
+	  > extends Cloud<T,EP>
+{
+	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;
+}
diff --git a/src/main/java/com/syncleus/dann/graph/JoinableEdge.java b/src/main/java/com/syncleus/dann/graph/JoinableEdge.java
new file mode 100644
index 00000000..ba71ce8b
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/JoinableEdge.java
@@ -0,0 +1,29 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+public interface JoinableEdge<
+	  	T,
+	  	EP extends JoinableEdge.Endpoint<? extends T>
+	  > extends Edge<T, EP>, JoinableCloud<T,EP>
+{
+	interface Endpoint<T> extends Edge.Endpoint<T>, JoinableCloud.Endpoint<T>
+	{
+	};
+}
diff --git a/src/main/java/com/syncleus/dann/graph/JoinableGraph.java b/src/main/java/com/syncleus/dann/graph/JoinableGraph.java
new file mode 100644
index 00000000..11d2fdda
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/JoinableGraph.java
@@ -0,0 +1,42 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+public interface JoinableGraph<
+	  	N,
+	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>,
+	  	NEP extends JoinableGraph.NodeEndpoint<N, E>,
+	  	EEP extends JoinableGraph.EdgeEndpoint<N, E>
+	  >  extends Graph<N,E,NEP,EEP>
+{
+
+	interface NodeEndpoint<
+		  ON,
+		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
+	  > extends Graph.NodeEndpoint<ON,OE>, JoinableCloud.Endpoint<ON>
+	{
+	};
+
+	interface EdgeEndpoint<
+		  ON,
+		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
+	  > extends Graph.EdgeEndpoint<ON,OE>, JoinableCloud.Endpoint<OE>
+	{
+	};
+}
diff --git a/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java b/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java
index 283d5525..daa2fe26 100644
--- a/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MixableBidirectedEdge.java
@@ -18,9 +18,18 @@
  ******************************************************************************/
 package com.syncleus.dann.graph;
 
-public interface MixableBidirectedEdge<N, LN extends N, RN extends N> extends Edge<N>
+public interface MixableBidirectedEdge<
+	  	T,
+	  	LT extends T,
+	  	RT extends T,
+	  	EP extends MixableBidirectedEdge.Endpoint<? extends T, ? extends LT, ? extends RT>
+	  > extends Edge<T, EP>
 {
-	interface Endpoint<NN, EN extends NN, ON extends NN> extends Edge.Endpoint<NN, EN>
+	interface Endpoint<
+			  NN,
+			  EN extends NN,
+			  ON extends NN
+		  > extends Edge.Endpoint<NN>
 	{
 		enum Direction
 		{
@@ -31,8 +40,8 @@ public interface MixableBidirectedEdge<N, LN extends N, RN extends N> extends Ed
 		Endpoint<NN, ON,EN> getNeighbor();
 	};
 
-	Endpoint<N, LN,RN> getLeftEndPoint();
-	Endpoint<N, RN,LN> getRightEndPoint();
+	EP getLeftEndPoint();
+	EP getRightEndPoint();
 	boolean isIntroverted();
 	boolean isExtroverted();
 	boolean isDirected();
diff --git a/src/main/java/com/syncleus/dann/graph/MutableCloud.java b/src/main/java/com/syncleus/dann/graph/MutableCloud.java
new file mode 100644
index 00000000..dd606671
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/MutableCloud.java
@@ -0,0 +1,29 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+public interface MutableCloud<
+	  	T,
+	  	EP extends MutableCloud.Endpoint<? extends T>
+	  > extends AssignableCloud<T,EP>, JoinableCloud<T,EP>, PartibleCloud<T, EP>
+{
+	interface Endpoint<T> extends AssignableCloud.Endpoint<T>, JoinableCloud.Endpoint<T>, PartibleCloud.Endpoint<T>
+	{
+	}
+}
diff --git a/src/main/java/com/syncleus/dann/graph/MutableEdge.java b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
index 95592555..9abece6c 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableEdge.java
@@ -21,9 +21,9 @@ package com.syncleus.dann.graph;
 public interface MutableEdge<
 	  	T,
 	  	EP extends MutableEdge.Endpoint<? extends T>
-	  > extends Edge<T, EP>, AssignableCloud<T,EP>
+	  > extends AssignableEdge<T, EP>, JoinableEdge<T,EP>, PartibleEdge<T,EP>, MutableCloud<T,EP>
 {
-	interface Endpoint<T> extends Edge.Endpoint<T>, AssignableCloud.Endpoint<T>
+	interface Endpoint<T> extends AssignableEdge.Endpoint<T>, JoinableEdge.Endpoint<T>, PartibleEdge.Endpoint<T>, MutableCloud.Endpoint<T>
 	{
 	};
 }
diff --git a/src/main/java/com/syncleus/dann/graph/MutableGraph.java b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
index 109590b7..883213c2 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableGraph.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableGraph.java
@@ -24,21 +24,22 @@ import java.util.Set;
 public interface MutableGraph<
 	  	N,
 	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>,
-	  	NE extends MutableGraph.NodeEndpoint<N, E>,
-	  	EE extends MutableGraph.EdgeEndpoint<N, E>
-	  > extends AssignableGraph<N,E,NE,EE>
+	  	NEP extends MutableGraph.NodeEndpoint<N, E>,
+	  	EEP extends MutableGraph.EdgeEndpoint<N, E>
+	  >  extends Graph<N,E,NEP,EEP>
 {
+
 	interface NodeEndpoint<
-		  N,
-		  E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>
-	  > extends AssignableGraph.NodeEndpoint<N,E>
+		  ON,
+		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
+	  > extends Graph.NodeEndpoint<ON,OE>, PartibleCloud.Endpoint<ON>
 	{
 	};
 
 	interface EdgeEndpoint<
 		  ON,
 		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
-	  > extends AssignableGraph.EdgeEndpoint<ON,OE>
+	  > extends Graph.EdgeEndpoint<ON,OE>, PartibleCloud.Endpoint<OE>
 	{
 	};
 
diff --git a/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java b/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java
index 3ba41f83..de36949f 100644
--- a/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java
+++ b/src/main/java/com/syncleus/dann/graph/MutableHyperEdge.java
@@ -22,17 +22,10 @@ import java.util.*;
 
 public interface MutableHyperEdge<
 	  	T,
-	  	EP extends Edge.Endpoint<T>
+	  	EP extends MutableHyperEdge.Endpoint<? extends T>
 	  > extends HyperEdge<T,EP>, MutableEdge<T,EP>
 {
-	interface Endpoint<NN, EN extends NN> extends HyperEdge.Endpoint<NN, EN>, MutableEdge.Endpoint<NN, EN>
+	interface Endpoint<NN> extends HyperEdge.Endpoint<NN>, MutableEdge.Endpoint<NN>
 	{
 	};
-
-	Endpoint<T, T> join(final T node) throws InvalidEdgeException;
-	Map<T,Endpoint<T, T>> join(final Set<T> nodes) throws InvalidEdgeException;
-	void leave(final Endpoint<T, T> endPoint) throws InvalidEdgeException;
-	void leave(final Set<Endpoint<T, T>> endPoint) throws InvalidEdgeException;
-	void clear() throws InvalidEdgeException;
-	Map<T,Endpoint<T, T>> reconfigure(final Set<T> connectNodes, final Set<Endpoint<T, T>> disconnectEndPoints) throws InvalidEdgeException;
 }
diff --git a/src/main/java/com/syncleus/dann/graph/PartibleCloud.java b/src/main/java/com/syncleus/dann/graph/PartibleCloud.java
new file mode 100644
index 00000000..82ba759c
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/PartibleCloud.java
@@ -0,0 +1,36 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+import java.util.Set;
+
+public interface PartibleCloud<
+	  	T,
+	  	EP extends PartibleCloud.Endpoint<? extends T>
+	  > extends Cloud<T,EP>
+{
+	interface Endpoint<T> extends Cloud.Endpoint<T>
+	{
+		void part() throws InvalidEdgeException;
+	}
+
+	void leave(MutableGraph.EdgeEndpoint<?, ?> endpoint) throws InvalidGraphException;
+	void leave(Set<? extends MutableGraph.EdgeEndpoint<?, ?>> endpoints) throws InvalidGraphException;
+	void clear() throws InvalidGraphException;
+}
diff --git a/src/main/java/com/syncleus/dann/graph/PartibleEdge.java b/src/main/java/com/syncleus/dann/graph/PartibleEdge.java
new file mode 100644
index 00000000..1f43ef25
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/PartibleEdge.java
@@ -0,0 +1,29 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+public interface PartibleEdge<
+	  	T,
+	  	EP extends PartibleEdge.Endpoint<? extends T>
+	  > extends Edge<T, EP>, PartibleCloud<T,EP>
+{
+	interface Endpoint<T> extends Edge.Endpoint<T>, PartibleCloud.Endpoint<T>
+	{
+	};
+}
diff --git a/src/main/java/com/syncleus/dann/graph/PartibleGraph.java b/src/main/java/com/syncleus/dann/graph/PartibleGraph.java
new file mode 100644
index 00000000..19547419
--- /dev/null
+++ b/src/main/java/com/syncleus/dann/graph/PartibleGraph.java
@@ -0,0 +1,42 @@
+/******************************************************************************
+ *                                                                             *
+ *  Copyright: (c) Syncleus, Inc.                                              *
+ *                                                                             *
+ *  You may redistribute and modify this source code under the terms and       *
+ *  conditions of the Open Source Community License - Type C version 1.0       *
+ *  or any later version as published by Syncleus, Inc. at www.syncleus.com.   *
+ *  There should be a copy of the license included with this file. If a copy   *
+ *  of the license is not included you are granted no right to distribute or   *
+ *  otherwise use this file except through a legal and valid license. You      *
+ *  should also contact Syncleus, Inc. at the information below if you cannot  *
+ *  find a license:                                                            *
+ *                                                                             *
+ *  Syncleus, Inc.                                                             *
+ *  2604 South 12th Street                                                     *
+ *  Philadelphia, PA 19148                                                     *
+ *                                                                             *
+ ******************************************************************************/
+package com.syncleus.dann.graph;
+
+public interface PartibleGraph<
+	  	N,
+	  	E extends Cloud<N,? extends Cloud.Endpoint<? extends N>>,
+	  	NEP extends PartibleGraph.NodeEndpoint<N, E>,
+	  	EEP extends PartibleGraph.EdgeEndpoint<N, E>
+	  >  extends Graph<N,E,NEP,EEP>
+{
+
+	interface NodeEndpoint<
+		  ON,
+		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
+	  > extends Graph.NodeEndpoint<ON,OE>, PartibleCloud.Endpoint<ON>
+	{
+	};
+
+	interface EdgeEndpoint<
+		  ON,
+		  OE extends Cloud<ON,? extends Cloud.Endpoint<? extends ON>>
+	  > extends Graph.EdgeEndpoint<ON,OE>, PartibleCloud.Endpoint<OE>
+	{
+	};
+}
-- 
GitLab