private IEnumerable <LocationSet> getCurrentLocationSets(ILayoutAccess layout)
            {
                HashSet <Location> locs = new HashSet <Location>();

                foreach (WireSegment w in layout.Wires)
                {
                    locs.Add(w.End0);
                    locs.Add(w.End1);
                }
                foreach (Component c in layout.Components)
                {
                    Location cloc = c.GetLocation(layout);
                    foreach (ConnectionPoint p in c.Connections)
                    {
                        locs.Add(cloc.Translate(p.Dx, p.Dy));
                    }
                }

                UnionFind <Location> allNodes = new UnionFind <Location>(locs);

                foreach (WireSegment w in layout.Wires)
                {
                    UnionFindNode <Location> e0 = allNodes[w.End0];
                    UnionFindNode <Location> e1 = allNodes[w.End1];
                    e0.Unite(e1);
                }

                IEnumerable <UnionFindNode <Location> > roots = allNodes.Roots;
                List <LocationSet> result = new List <LocationSet>();

                foreach (UnionFindNode <Location> root in roots)
                {
                    IEnumerable <UnionFindNode <Location> > rootMembers = root.GetSetMembers();
                    List <Location> setMembers = new List <Location>();
                    foreach (UnionFindNode <Location> n in rootMembers)
                    {
                        setMembers.Add(n.Value);
                    }
                    result.Add(new LocationSet(setMembers));
                }
                return(result);
            }