/// <summary>
        /// actually construct list of graph verts with stored faces and edges
        /// iterates dictionary of edges to faces and building graph
        /// </summary>
        /// <param name="faces"></param>
        /// <param name="edgeDict"></param>
        /// <returns></returns>
        public static List <GraphVertex <K, T> > GenGraph <T, K>(List <T> facelikes, Dictionary <K, List <T> > edgeDict)
            where K : IUnfoldableEdge
            where T : IUnfoldablePlanarFace <K>
        {
            List <GraphVertex <K, T> > graph = new List <GraphVertex <K, T> >();

            // first build the graph nodes, just referencing faces
            foreach (T face in facelikes)
            {
                var CurrentVertex = new GraphVertex <K, T>(face);
                graph.Add(CurrentVertex);
            }

            // then build edges, need to use edge dict to do this
            foreach (GraphVertex <K, T> vertex in graph)
            {
                T facelike = vertex.Face;
                foreach (K edgelike in facelike.EdgeLikeEntities)
                {
                    //var edgekey = new EdgeLikeEntity(edge);
                    // again we dont need to generate a new key with this wrapper - already stored on the face in this form

                    var edgekey = edgelike;

                    // find adjacent faces in the dict
                    var subfaces = edgeDict[edgekey];
                    // find the graph verts that represent these faces
                    var verts = GraphUtilities.FindNodesByMatchingFaces(graph, subfaces);
                    //remove dupe faces, not sure if these should really be removed
                    verts = verts.Distinct().ToList();
                    //need to remove self loops
                    //build list of toremove, then remove them
                    var toremove = new List <GraphVertex <K, T> >();
                    foreach (GraphVertex <K, T> testvert in verts)
                    {
                        if (testvert == vertex)
                        {
                            toremove.Add(testvert);
                        }
                    }
                    verts = verts.Except(toremove).ToList();


                    // these are the verts this edge connects
                    foreach (var VertToConnectTo in verts)
                    {
                        K   wrappedEdgeOnThisGraphEdge = GraphUtilities.FindRealEdgeByTwoFaces <T, K>(graph, subfaces, edgeDict);
                        var CurrentGraphEdge           = new GraphEdge <K, T>(wrappedEdgeOnThisGraphEdge, vertex, VertToConnectTo);
                        vertex.GraphEdges.Add(CurrentGraphEdge);
                    }
                }
            }
            return(graph);
        }